代码用于LED立方体,我想添加新功能。当有人点击连接到PORTB0的按钮时,应该改变当前的光效。
我尝试了一些东西,但它不起作用。
该程序适用于ATmega16,代码使用Atmer Studio 6编写
答案 0 :(得分:0)
void delay_ms(uint16_t x)
{
uint8_t y, z;
for ( ; x ; x--){
for ( y = 0 ; y < 90 ; y++)
{
for ( z = 0 ; z < 6 ; z++)
{
if(PINB)
{
++i%=4;
return;
}
asm volatile ("nop");
}
}
}
答案 1 :(得分:0)
连接到B0的电路是什么样的?
假设开关的一侧进入B0而另一侧接地,您的方向和上拉值都很好,但是当按下按钮时,您的if语句应该寻找PINB的第0位从1变为0 。打开上拉时,按下按钮时该位为1,按下按钮时为0。
在您的代码中,您将输入视为&#34; edge&#34;但实际上它是一个&#34;级别&#34;我的意思是按下按钮可以从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次循环次数增加一次效果。如果按住按钮,效果将继续改变。您可能希望修改代码,以便它不会再次增加效果,直到开关关闭一段时间后,这样每次按下只做一次增量,无论它保持多长时间。对于上面的代码,您可以使用&#39; presscount&#39;不断看它的作用。
希望有所帮助。