首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从atmega32引脚读取输入值?

如何从atmega32引脚读取输入值?
EN

Stack Overflow用户
提问于 2017-06-07 21:50:28
回答 3查看 7.3K关注 0票数 1

我试图从avr引脚中读取一个值,但它不起作用。

我试图读取一个值,从一个按钮和这个按钮连接到5V直流单元。

当我按下按钮时,5V应该转到atmega32并将其读取为1,然后if语句变为true,而led继续进行。

然而,当这个值变为真时,led就会启动,但它不会。

位1是按钮位0是led。

代码语言:javascript
复制
#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
        }
    }
}
EN

回答 3

Stack Overflow用户

发布于 2017-06-07 22:19:44

我在这里发现一个逻辑错误:

代码语言:javascript
复制
if ((PINA&0b00000010) == 1)  // button pressed

当位1被设置时,(PINA&0b00000010) == 2。通常,当您执行位检查时,只需执行以下操作:

代码语言:javascript
复制
if (PINA&0b00000010)  // button pressed
票数 3
EN

Stack Overflow用户

发布于 2017-06-07 22:15:54

为了确保,你的按钮必须有一个拉/拉电阻连接到地面。没有它,你就无法正确地读到引脚是开着还是关着。

https://learn.sparkfun.com/tutorials/pull-up-resistors

票数 1
EN

Stack Overflow用户

发布于 2017-06-08 06:53:05

您应该更改您的硬件设置,并使您的按钮活动低,这意味着按下按钮连接您的GPIO引脚到地面。与其将按钮连接到5V电池的正面,不如将其连接到负极侧。这将让你利用内部拉电阻器,你可以激活你的GPIO。一旦您这样做,您的代码应该更改为如下所示:

代码语言:javascript
复制
#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,而不按下按钮。如果你不改变你的按钮一个活动的低配置,你将不得不使用外部拉下电阻,以使您的代码正确工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44423365

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档