我已经编写了一个代码,可以检测到按下按钮,第一次按下按钮时LED会发光,下次按下时,LED应该关闭,如果按下第三次,LED应该按下再次发光。
问题是,控制器能够检测按钮按下但不是长时间打开LED,它只是暂时将其打开然后再次关闭。并且未检测到进一步按下按钮。
以下是代码:
#include <avr/io.h>
#include <avr/delay.h>
void glow();
void off();
void switchScan();
int main()
{
DDRA=0x02; // 0000 0010 --> BIT 0=connected to switch whose other pin is connected to ground,, and BIT 1 is connected to LED with other pin of led connected to ground
PORTA=0x01; // 0000 0001---> Switch Input pulled up and LED output pulled down
while(1)
{
switchScan();
}
return 0;
}
void glow()
{
PORTA=PORTA|(1<<1);
}
void off()
{
PORTA=PORTA&(~(1<<1));
}
void switchScan()
{
static int counter=0;
if(~(PINA & 0x01))
{
counter++;
if(counter < 2)
glow();
else
{
counter--;
off();
}
}
}
答案 0 :(得分:2)
switchScan()
函数中的逻辑存在缺陷。 glow()
只会执行一次。参见代码注释:
void switchScan() {
static int counter=0;
if (~(PINA & 0x01)) {
counter++;
// 1st button press: counter will be 1
// 2nd and all following button presses: counter will be 2
if (counter < 2)
// can only be called once!
glow();
else {
// counter will always go from 2 to 1 at this point
counter--;
off();
}
}
}
但是,你也应该考虑Brett在评论中提到的反弹。