[英]How to read an input value from atmega32 pin?
我正在尝试从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
}
}
}
我在这里发现一个逻辑错误:
if ((PINA&0b00000010) == 1) // button pressed
当位置1时, (PINA&0b00000010) == 2
。 通常,当您进行位检查时,只需执行以下操作:
if (PINA&0b00000010) // button pressed
只是为了确保您的按钮必须有一个上拉/下拉电阻接地。 没有它,您将无法正确读取引脚是打开还是关闭。
您应该更改硬件设置,并使按钮处于低电平有效,这意味着按下按钮会将GPIO引脚接地。 与其将按钮连接到5V电池的正极,不如将其连接到负极。 这样一来,您就可以利用可在GPIO上激活的内部上拉电阻。 完成此操作后,应将代码更改为如下所示:
#define DDRA (*((volatile unsigned char *)0x3A))
#define PORTA (*((volatile unsigned char *)0x3B))
#define PINA (*((volatile unsigned char *)0x39))
#define LED_BIT 0
#define BTN_BIT 1
int main(void)
{
DDRA = (1 << LED_BIT); // PA0 output
PORTA = (1 << BTN_BIT); // enable internal pull up on PA1
while (1) {
if (!(PINA & (1 << BTN_BIT))) { // button pressed
PORTA |= (1 << LED_BIT); // turn led on
}
}
}
请注意,现在if语句会检查PA1是否为0,因为将按钮设置为在按下按钮时接地。 还要注意,在其中有一个新行,该行启用了内部上拉功能,这使PA1在未按下按钮时读为1。 如果您未将按钮更改为低电平有效配置,则必须使用外部下拉电阻才能使代码正常工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.