首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

嵌入式按鍵掃描代碼解析:消抖、狀態機、按下/釋放事件識別

     編輯:程式設計綜合問答

典型的單片機矩陣按鍵/獨立按鍵掃描函數 KEY_Scan,集成消抖延時、按下/長按/釋放狀態機、多鍵值返回。

代碼邏輯逐行解讀

u8 KEY_Scan(u8 mode) {
    static u8 key_up = 1;           // 靜態變量:記錄「按鍵鬆開」狀態,跨調用保持
    if (mode) key_up = 1;           // mode=1 時重置,支援「連按」模式

    if (key_up && (KEY0==0 || KEY1==0 || KEY2==0 || KEY3==1)) { // 檢測到任意鍵按下 (低電平有效)
        delay_ms(10);               // 消抖延時
        key_up = 0;                 // 標記進入按下狀態
        if (KEY0==0) return 1;      // 返回鍵值 1~4
        else if (KEY1==0) return 2;
        else if (KEY2==0) return 3;
        else if (KEY3==1) return 4;
    }
    else if (KEY0==1 && KEY1==1 && KEY2==1 && KEY3==0) // 所有鍵釋放 (高電平)
        key_up = 1;                 // 重置,允許下一次按下檢測
    return 0;                       // 無有效按鍵
}

關鍵設計點

  1. static 變量保持狀態:key_up 區分「首次按下」與「按住不放」,實現單次觸發。
  2. 消抖雙重保險:硬體 RC 電路 + 軟體 10ms 延時再次判斷。
  3. mode 參數擴展性:mode=1 允許連發(如遊戲長按),mode=0 單次觸發(如菜單選擇)。
  4. 返回值編碼:1~4 對應 4 個按鍵,0 表示無動作,主循環 switch(key) 分發業務。

移植到 STM32/ESP32 注意事項

  • GPIO 輸入模式配置:上拉/下拉電阻與 KEYx==0 判斷邏輯一致。
  • 用 HAL_GetTick() 非阻塞消抖,避免 delay_ms 佔用 CPU。
  • 矩陣鍵盤需行列掃描,邏輯擴展為二維狀態機。

這段代碼是嵌入式人機交互的「Hello World」,吃透狀態機思想,複雜鍵盤也能輕鬆驅動。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved