簡體   English   中英

AVR編程-如何連續讀取C中的按鈕

[英]AVR Programming - How to read in consecutive button presses in C

這是我必須dp:

考慮一個ATmega324A開發板和一個CSSE2010 / CSSE7201 IO板。 開關S3至S0連接到AVR端口B的引腳3到0。按鈕B0連接到AVR端口A的引腳0。LED L0和L2分別連接到AVR端口C的引腳0和2。 LED L0(紅色)是“已鎖定” LED,僅在鎖定狀態下才點亮。 LED L2(綠色)是“ Unlocked” LED,僅在解鎖時才亮。 鎖定最初以鎖定狀態開始。 用戶在開關(S3至S0)上輸入數字的二進制代碼,然后按下並釋放按鈕B0以“輸入”第一個數字。 然后,用戶在開關上輸入第二個數字的二進制代碼,然后按下並釋放按鈕B0以“輸入”第二個數字。 如果數字與期望值匹配(學生編號的最后一位,然后是學生編號的第三位),則鎖應為“解鎖”,否則應保持鎖定狀態,直到正確輸入兩位數為止。

到目前為止,這是我的代碼:

#include <avr/io.h>

/* Seven segment display values */

uint8_t seven_seg[16] = { 63,6,91,79,102,109,125,7,127,111,119,124,57,94,121,113};
int main(void) {
uint8_t digit;
uint8_t temp;
uint8_t digit2;
uint8_t code[2] = {6,3}


DDRA = 11111110;   //port A is input (last bit)
DDRB = 0X00;       //port B is input
DDRC = 0x0F;   //port c is output
DDRD = 0XFF;   //set port D to be output

while(1) {
    /* Read in a digit from lower half of port C pins */
    /* We read the whole byte and mask out upper bits */

    PORTB = 1;  //Led is red
    clock = PINA & 00000001;   //read in last bit of port A
    temp = PINB & 0X0F;  //read in lower half of port b


    /* Checks to see the first digit is correct */
    if(temp == code[0] && clock == 1) {
        digit = temp;           
        PORTD = seven_seg[temp];

        } else {
        PORTD = 0;
    }



}

我被卡在必須讀第二個數字的位置。 我會在第一個嵌套循環中執行此操作嗎? 還是我將如何從開關中讀取兩位數字,而每次按下按鈕都會顯示該兩位數字?

要制作可用於較長數字序列的變量程序,只需使用循環即可。 for(uint8_t i=0; i<NUMBER_OF_DIGITS; i++) 端口讀數需要在環路內。

但是,您不能以這種方式閱讀按鈕。 所有按鈕都有一個機電信號反彈,您需要將其過濾掉以防止錯誤讀數。 必須在任何類型的嵌入式系統上執行此操作。

最簡單的方法是對按鈕進行一次采樣,保存結果,等待幾毫秒,然后再次對其進行采樣。 如果樣本比較相等,則接受結果(按下或未按下)。

或者,您可以在按鈕信號的邊緣觸發中斷,從此處啟動計時器,然后在計時器用盡時讀取端口。

更高級的方法使用某種形式的中值濾波器

所以,如果我說對了,你想做這樣的事情

Start:
Wait for pushbutton
    Wait for first digit
Wait for pushbutton
    Wait for second digit
If digits they are the same
    Turn off Red LED
    Turn  on Green LED
Else
    Goto start   

你能確認嗎? 首先以偽代碼進行代碼總是一件好事。 它很好地概述了您想做什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM