[英]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.