我试图从avr引脚中读取一个值,但它不起作用。
我试图读取一个值,从一个按钮和这个按钮连接到5V直流单元。
当我按下按钮时,5V应该转到atmega32并将其读取为1,然后if语句变为true,而led继续进行。
然而,当这个值变为真时,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
}
}
}发布于 2017-06-07 22:19:44
我在这里发现一个逻辑错误:
if ((PINA&0b00000010) == 1) // button pressed当位1被设置时,(PINA&0b00000010) == 2。通常,当您执行位检查时,只需执行以下操作:
if (PINA&0b00000010) // button pressed发布于 2017-06-07 22:15:54
为了确保,你的按钮必须有一个拉/拉电阻连接到地面。没有它,你就无法正确地读到引脚是开着还是关着。
发布于 2017-06-08 06:53:05
您应该更改您的硬件设置,并使您的按钮活动低,这意味着按下按钮连接您的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,而不按下按钮。如果你不改变你的按钮一个活动的低配置,你将不得不使用外部拉下电阻,以使您的代码正确工作。
https://stackoverflow.com/questions/44423365
复制相似问题