在 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。