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

51 單片機按鍵掃描與狀態機設計:避免嵌套死循環的最佳實踐

     編輯:程式設計疑難解答

錯誤模式

在 while(1) 主循環中檢測按鍵,進入功能分支后又用 while(1) 實現功能邏輯,導致嵌套死循環,無法返回主循環處理其他任務(如按鍵掃描、顯示刷新)。

正確架構:輪詢 + 狀態機

typedef enum { STATE_IDLE, STATE_FUNC1, STATE_FUNC2 } SysState;
SysState currentState = STATE_IDLE;
u8 keyVal = 0;

void main() {
    while (1) {
        // 1. 統一掃描按鍵(非阻塞)
        keyVal = KeyScan(); // 返回按鍵碼或 0
        
        // 2. 狀態機處理
        switch (currentState) {
            case STATE_IDLE:
                if (keyVal == KEY1) currentState = STATE_FUNC1;
                else if (keyVal == KEY2) currentState = STATE_FUNC2;
                break;
            case STATE_FUNC1:
                Func1_Process(); // 非阻塞步進執行
                if (Func1_IsDone()) currentState = STATE_IDLE;
                break;
            case STATE_FUNC2:
                Func2_Process();
                if (Func2_IsDone()) currentState = STATE_IDLE;
                break;
        }
        // 3. 其他周期性任務(顯示刷新、通訊等)
        Display_Refresh();
    }
}

關鍵點

  • 按鍵掃描每輪必執行,不因功能執行而中斷。
  • 功能函數 非阻塞、可分步執行,每次主循環推進一步。
  • 狀態變量 currentState 控制流程,替代嵌套 while。
  • 共享資源(如顯示緩衝)在主循環統一更新,避免衝突。

進階

  • 引入定時器中斷實現精準按鍵消抖(如 10ms 掃描一次)。
  • 使用事件標志組解耦按鍵檢測與業務觸發。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved