该代码适用于 LED 立方体,我想添加新功能。当有人点击连接到 PORTB0 的按钮时,当前的灯光效果应该改变。
我尝试了一些方法,但没有成功。
该程序适用于ATmega16,代码是在Atmer Studio 6中编写的
最佳答案
连接到 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/