一直用狀態機做鍵盤消抖,覺得很好用,不必延時等待鍵盤穩定,當檢測到有鍵按下或彈起時能發出相應的鍵盤訊息,英文不好,只好用拼音做變數名和函式名,將就看吧 ;-)
設定狀態機有4種狀態,a0,a1,a2,a3
初始時處於a0狀態,當掃瞄發現有鍵按下時,轉入到a1狀態。
當處於a1狀態時,當掃瞄發現有鍵按下並且鍵值等於a1狀態下的鍵值時,轉入到a2狀態,否則轉入a0狀態。
當處於a2狀態時,當掃瞄發現有鍵按下並且鍵值等於a2狀態下的鍵值時,轉入到a3狀態,同時發出鍵按下訊息或將按下鍵的鍵值入隊,否則轉入a0狀態。
當處於a3狀態時,當掃瞄發現無鍵按下時,轉入到a0狀態。同時發出鍵彈起訊息或彈起鍵的鍵值入隊。
函式jiansaomiao()用於鍵掃瞄的到即時鍵值
函式jianchuli()用於按鍵處理,可放在時鐘中斷中呼叫
例:在10ms中斷中掃瞄並處理按鍵只需呼叫:jianchuli(jiansaomiao());
可使呼叫後完成發出鍵按下或鍵彈起的訊息,或者將鍵值送入鍵值佇列供後續處理*/
#define kong 0x00 //定義無鍵按下時,鍵掃瞄返回的值
#define a0 0
#define a1 1
#define a2 2
#define a3 3
struct
ztj;
void ztj_chushihua(void) //狀態機初始化
uchar jiansaomiao(void) //鍵值掃瞄
void jianchuli(uchar jz)
} break;
case a1:
break;
case a2:
else
ztj_chushihua(); //鍵值不穩,回到初始狀態a0
} break;
case a3:
} break;
default :
}}
狀態機按鍵消抖
一般的按鍵輸入軟體介面程式非常簡單,在程式中一旦檢測到按鍵輸入口為低電平 有時可能為高 便採用軟體延時的方法來進行消抖,然後再次檢測按鍵輸入,如果再次確認為低電平則表示有按鍵按下,轉入執行按鍵處理程式。如果延時後檢測的電平為高電平則放棄本次按鍵檢測,重新開始一次按鍵檢測過程。在簡單的系統中這種方法比...
用狀態機消抖法實現藍橋杯微控制器矩陣鍵盤的控制
下面是 功能 利用狀態機消抖法實現矩陣鍵盤,按s4開led1,按s5開led5 include reg52.h 用狀態機消抖的方法實現矩陣鍵盤 include intrins.h sfr p4 0xc0 矩陣鍵盤p3 6和p3 7口實際對應p4 2和p4 4口,sfr為定義暫存器,p4的位址為0xc...
基於狀態機的新型按鍵消抖掃瞄程式
一般的按鍵輸入軟體介面程式非常簡單,在程式中一旦檢測到按鍵輸入口為低電平 有時可能為高 便採用軟體延時的方法來進行消抖,然後再次檢測按鍵輸入,如果再次確認為低電平則表示有按鍵按下,轉入執行按鍵處理程式。如果延時後檢測的電平為高電平則放棄本次按鍵檢測,重新開始一次按鍵檢測過程。在簡單的系統中這種方法比...