按键是非常常用的小外设,要么配上外部中断,要么直接接I/O口扫描状态,我这边因为端口不够就用了ADC功能。
先讲短按
每个按键对应不同的电压值,没有按键按下时ADC输入通道接的是5V,按下之后我设计了以下几种情况:
1.SW1 0V
2.SW2 2.5V
3.SW3 3.3V
4.SW4 3.8V
理论上配置完ADC模块,开启ADC转换,在每次ADC转换完成触发中断的时候就可以根据采集值确认按键是哪个了。
但是存在一个问题,比如说我按下ESC键,电压下降是一个过程,如果它下降到3.3v的时候一次采集就完成,那采集的值不就错了吗。
所以需要消抖,我这里消抖的方式是这样:
关于短按:
1.设置一个大小为2的数组KEY[2]
2.KEY[0]用于存最新的值,KEY[1]用于缓存上一次的值
3.如果有键按下,如果KEY[0]和KEY[1]之间的差值(无论哪个大)大于100(这个数可根据不同的ADC采样的精度自己调整),则代表按键并不稳定
4.将KEY[1]的值更新为KEY[0],等待下一次中断
5.直到KEY[1]和KEY[0]的差值小于100,代表按键稳定,可进行按键状态判断(此处置一个状态稳定flag)
6.等到按键松开时进行keystatus按键状态的修改