按键定时扫描
——有限状态机的软件实现方法
由于按键扫描采用定时扫描方式,由连续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