阅读Arduino Uno上的图钉​​不起作用,需要avr-gcc的帮助

时间:2015-10-09 07:25:10

标签: c arduino embedded avr avr-gcc

我正在尝试控制Arduino Uno板上的三个LED。这些 LED连接到端口D的引脚3,4,5作为输出。

端口D的引脚2连接到按钮,并进行配置 作为输入。

整个电路已经过默认的Arduino代码测试,功能齐全。但是,使用下面给出的代码(没有arduino库),无论按钮的状态如何,输入引脚(端口D上的引脚2)始终读为HIGH。

任何帮助将不胜感激。

#include <avr/io.h>
#include <util/delay.h>

#define IS_LOW(reg, pin)  ((reg) & (1 << (pin)) == 0)
#define SET_BIT(reg, pin) do{(reg) |= 1 << (pin);} while(0)
#define CLEAR_BIT(reg, pin) do{(reg) &= ~(1 << (pin));} while(0)

int main (void)
{
    DDRD &= ~(1 << DDD2); //pin 2 on port D as INPUT
    DDRD |= 1 << DDD3;    //pin 3 on port D as OUTPUT
    DDRD |= 1 << DDD4;    //pin 4 on port D as OUTPUT
    DDRD |= 1 << DDD5;    //pin 5 on port D as OUTPUT

   while(1) 
   {
       if (IS_LOW(PIND, PD2))
       {
           SET_BIT(PORTD, PD3);
           CLEAR_BIT(PORTD, PD4);
           CLEAR_BIT(PORTD, PD5);
       }
       else
       {
           CLEAR_BIT(PORTD, PD3);
           CLEAR_BIT(PORTD, PD4);
           SET_BIT(PORTD, PD5);

           _delay_ms(250);

           SET_BIT(PORTD, PD4);
           CLEAR_BIT(PORTD, PD5);

           _delay_ms(250);
       }
    }
}

1 个答案:

答案 0 :(得分:4)

不幸的是,&运算符的优先级低于==运算符之一。

您应该像这样定义IS_LOW宏:

#define IS_LOW(reg, pin) (((reg) & (1 << (pin))) == 0)