我试图从avr引脚读取值,但它不起作用。
我试图读取来自按钮的值,此按钮连接到5V DC电池。
当我按下按钮时,5V应该转到atmega32并将其读为1,然后if语句变为true并且led继续。
然而,当值变为true时,led将打开,但不是。
第1位是按钮 第0位是led
代码
#define DDRA (*((volatile unsigned char *)0x3A))
#define PORTA (*((volatile unsigned char *)0x3B))
#define PINA (*((volatile unsigned char *)0x39))
int main(void) {
DDRA |= 0b00000001; // pin 0 output
while (1) {
if ((PINA&0b00000010) == 1) { // button pressed
PORTA |= 0b00000001; // turn led on
}
}
}
答案 0 :(得分:3)
我在这里找到一个逻辑错误:
if ((PINA&0b00000010) == 1) // button pressed
当设置位1时,(PINA&0b00000010) == 2
。
通常,当您进行位检查时,只需执行以下操作:
if (PINA&0b00000010) // button pressed
答案 1 :(得分:1)
为了确保,您的按钮必须有一个连接到地的上拉/下拉电阻。没有它,您无法正确读取引脚是打开还是关闭。
答案 2 :(得分:1)
您应该更改硬件设置,并使按钮保持低电平,这意味着按下按钮可将GPIO引脚连接到地。不要将按钮连接到5V电池的正极侧,而是将其连接到负极侧。这样您就可以利用GPIO上可以激活的内部上拉电阻。一旦你这样做,你的代码应该改为看起来像这样:
p
请注意,if语句现在会检查PA1是否为0,因为按钮设置为在按下时连接到地面。另请注意,其中有一条新线路可以启用内部上拉,这使得PA1在按下按钮时读取1。如果不将按钮更改为低电平有效配置,则必须使用外部下拉电阻才能使代码正常工作。