按鍵定時掃描
——有限狀態機的軟件實現方法
由於按鍵掃描採用定時掃描方式,由連續2次或3次掃描的狀態來判斷按鍵是否按下,
所以可以採用有限狀態機--即時序邏輯思維,來判斷按鍵是否按下。
圖一
Keydown的卡諾圖:
得到邏輯表達式:
Keydown =(~keyn-1)& keyn
Keyup = keyn-1 & (~keyn)
Keypress = keyn
此係統不能去抖
改進狀態機:
去抖算法原理:
按鍵掃描時序圖
定義變量:Curr_avoidkey 表示當前經去抖後的按鍵狀態 , 即Avoidkeyn
Last_avoidkey 表示上次經去抖後的按鍵狀態, 即Avoidkeyn-1
Curr_Scankey 表示當前掃描的按鍵狀態, 即keyn
Last_Scankey 表示上次掃描的按鍵狀態, 即keyn-1
Curr_avoidkey;的狀態轉換表:
時刻 |
Last_Scankey |
Curr_Scankey |
Last_avoidkey |
Curr_avoidkey |
1 |
0 |
0 |
0 |
0 |
2 |
0 |
1 |
0 |
0 |
3 |
1 |
0 |
0 |
0 |
4 |
0 |
1 |
0 |
0 |
5 |
1 |
1 |
0 |
1 |
6 |
1 |
1 |
1 |
1 |
7 |
1 |
0 |
1 |
1 |
8 |
0 |
1 |
1 |
1 |
9 |
1 |
0 |
1 |
1 |
10 |
0 |
0 |
1 |
0 |
11 |
0 |
0 |
0 |
0 |
Curr_avoidkey的卡諾圖:
Curr_avoidkey = (Curr_Scankey & Last_Scankey) | Last_avoidkey & (Curr_Scankey ^ Last_Scankey)得算法表達式:
經過去抖算法後:
keydown = (~Last_avoidkey) & Curr_avoidkey
keyup = Last_avoidkey & (~Curr_avoidkey)
keypress = Curr_avoidkey
Last_Scankey = Curr_Scankey
Last_avoidkey= Curr_avoidkey