c - AtMega16 LED立方体

标签 c avr atmega16

该代码适用于 LED 立方体,我想添加新功能。当有人点击连接到 PORTB0 的按钮时,当前的灯光效果应该改变。

我尝试了一些方法,但没有成功。

该程序适用于ATmega16,代码是在Atmer Studio 6中编写的

code

最佳答案

连接到 B0 的电路是什么样的?

假设开关的一侧连接到 B0,另一侧连接到地面,您的方向和上拉值都很好,但您的 if 语句应该在按下按钮时寻找 PINB 的位 0 从 1 变为 0 。当上拉电阻打开时,当按钮未被按下时该位将为 1,当按钮被按下时该位将为 0。

在代码中,您将输入视为“边缘”,但实际上它是“电平”。我的意思是,从 CPU 的角度来看,按下按钮会在很长一段时间内改变输入信号。您想要更改过渡效果

这里还有另一个问题,那就是开关去抖动。当按下开关时,它不会直接从关闭变为打开。转换期间会出现噪音,看起来就像您的代码按下了许多按钮。

去抖动可以通过硬件或软件来完成。在软件中,我会在delay_ms的内部循环中执行类似的操作:

static unsigned int debounce; 
static const unsigned int presscount = 500;
if ((PINB&1)==0) { // switch is pressed
    if (debounce < presscount ) {
        ++debounce;
    }
} 
else {
    if (debounce > 0) {
        --debounce;
    }
}
if (debounce == presscount ) {
    // switch has been pressed long enough 
    debounce = 0; // reset
    i = (i+1)%4;
    return;
}

这将每 500 次循环次数最多增加一次效果。如果你一直按住按钮,效果将继续改变。您可能需要修改代码,以便在开关关闭一段时间之前不会再次增加效果,这样无论按住多长时间,每次按下都只会增加一次。对于上面的代码,您可以使用“presscount”常量来看看它的作用。

希望有帮助。

关于c - AtMega16 LED立方体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11992781/

相关文章:

text-processing - 替换文本文档中一行的最有效方法?

c - 二维数组 Malloc

c - Avr问题: in spi, spdr寄存器是8位但我的号码是16位

c++ - ATMEGA16L 上拉未激活

c - 链接器错误 "cannot find -l/some/path/libfilename"

c - OpenMPI 段错误 : address not mapped

c - 为什么我只收到第一个地址字节? (I2C 协议(protocol))

C++ 宏代码 - 将(任意大小的)显式整数转换为指针类型

常数积分表达式所需的错误