典型的單片機矩陣按鍵/獨立按鍵掃描函數 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; // 無有效按鍵
}
key_up 區分「首次按下」與「按住不放」,實現單次觸發。mode=1 允許連發(如遊戲長按),mode=0 單次觸發(如菜單選擇)。switch(key) 分發業務。KEYx==0 判斷邏輯一致。HAL_GetTick() 非阻塞消抖,避免 delay_ms 佔用 CPU。這段代碼是嵌入式人機交互的「Hello World」,吃透狀態機思想,複雜鍵盤也能輕鬆驅動。