AtMega16 LED立方体

时间:2012-08-16 17:52:03

标签: c avr atmega16

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

我尝试了一些东西,但它不起作用。

该程序适用于ATmega16,代码使用Atmer Studio 6编写

code

2 个答案:

答案 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;不断看它的作用。

希望有所帮助。