stm32f0按键计数器程序_至简设计系列_矩阵按键检测

--作者:肖肖肖

本文为明德扬原创及录用文章,转载请注明出处!

1.1 总体设计

1.1.1 概述

在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式。在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。这样,一个端口(如P1口)就可以构成4*4=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成20键的键盘,而直接用端口线则只能多出一键(9键)。由此可见,在需要的键数比较多时,采用矩阵法来做键盘是合理的。

1.1.2 设计目标

完成矩阵键盘的扫描检测程序,具体功能要求如下:

1. 运用逐行扫描的方法进行按键监测;

2. 每行扫描的时间不少于 20ms,滤除抖动;

3. 检测到有按键按下之后,消抖时间 20ms;

4. 输出信号 key_vld 持续一拍即可;

5. 输出信号key_out表示16 个按键,并在数码管上显示对应数值;

1.1.3 系统结构框图

系统结构框图如下图一所示:

45a793796e8de37084bbab9b2d477c11.png

图一

1.1.4 模块功能

Ø 矩阵键盘模块实现功能

1、将外来异步信号打两拍处理,将异步信号同步化。

2、实现20ms按键消抖功能。

3、实现矩阵键盘的按键检测功能,并输出有效按键信号。

Ø 数码管显示模块实现功能

1、 对接收到的按键数据进行译码并显示。

1.1.5 顶层信号

93bc50a7cb3ee6ada01481196f471aa7.png

1.1.6 参考代码

下面是使用工程的顶层代码:

1. 

1.2 矩阵键盘模块设计

1.2.1 接口信号

ae3eb184e97ef60ba8412123bad01d8b.png

1.2.2 设计思路

Ø 行扫描法原理

开发板上为 4*4 矩阵键盘:默认 4 条列线上来高电平,4 条行线默认接高电平。列线 KEY_C1 ~ KEY_C4分别接有4个上拉电阻到正电源 +3.3 V,并把列线 KEY_C1~KEY_C4设置为输入线,行线 KEY_R1~KEY_R4设置为输出线。4根行线和4根列线形成16个相交点。

如下图所示:

e396edfdb6fb498da48d34284ce65e40.png

确认矩阵键盘上哪个按键被按下有多同方法,其中行扫描法又称为逐行(或列)扫描查询法,是一种最常用的按键识别方法。

1. 判断键盘中有无键按下:将全部行线 KEY_R1~KEY_R4 置低电平,然后检测列线 KEY_C1~KEY_C4 的状态。只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与 4根行线相交叉的 4 个按键之中。若所有列线均为高电平,则键盘中无键按下。

2. 判断闭合键所在的位置:在确认有键按下后,即可进入确定具体闭合键的过程。其方法是:依次将行线置为低电平,即在置某根行线为低电平时,其它线为高电平。在确定某根行线位置为低电平后,再逐行检测各列线的电平状态。若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。

Ø 打拍操作

输入的key_col是异步信号,所以要进行打两拍操作,将异步信号key_col同步化,并防止亚稳态。

设计代码如下:

1. 

Ø 按键消抖

对于按键和触摸屏等机械设备来说,都存在一个固有问题,那就是“抖动”,按键从最初接通到稳定接通要经过数毫秒,其间可能发生多次“接通-断开”这样的毛刺。如果不进行处理,会使系统识别到抖动信号而进行不必要的反应,导致模块功能不正常,为了避免这种现象的产生,需要进行按键消抖的操作。

软件方法消抖,即检测出键闭合后执行一个延时程序,抖动时间的长短由按键的机械特性决定,一般为5ms~20ms,让前沿抖动消失后再一次检测键的状态,如果仍保持闭合状态电平,则确认按下按键操作有效。当检测到按键释放后,也要给5ms~20ms的延时,待后沿抖动消失后才能转入该键的处理程序。

91aebd1fa4abb45c952f3215b3a24a4f.png

由于按键按下去的时间一般都会大于20ms,为了达到不管按键按下多久,都视为按下一次的效果,提出以下计数器架构,如下图所示:

ee03145f7a20131340e9f9f23daf9b0d.png

消抖计数器shake_cnt:用于计算20ms的时间,加一条件为key_col_ff1 != 4'hf || key_row_check==1,表示当某个按键按下或者进行行扫描时就开始计数;数到1,000,000下,表示数到20ms就结束。

行扫描计数器row_index:用于区分扫描的行,加一条件为key_row_check && end_shake_cnt,表示当处于行扫描状态并且每行消抖20ms后,开始扫描下一行;数到4下,表示4行按键扫描完了。

按键:表示有无按键按下,没被按下时为高电平,按下后为低电平。

行扫描指示信号key_row_check:该信号为高电平,指示当前处于行扫描状态。

矩阵键盘列信号key_col_ff1:4bit位宽的矩阵键盘列信号,最高位表示矩阵键盘往右数第四列,默认信号为key_col_ff1 = 4'hf,否则表示该信号低电平对应位的列有按键按下。

1.2.3 参考代码

16. 

1.3 数码管显示模块设计

1.3.1 接口信号

73478066af6fff45b2b17792697aefa1.png

1.3.2 设计思路

在前面的案例中已经有数码管显示的介绍,所以这里不在过多介绍。

1.3.3 参考代码

1. 

1.4 效果和总结

Ø 下图是该工程在db603开发板上的现象——按下按键s7

46233a74d5120f7a73774c2140af1d29.png

Ø 下图是该工程在ms980试验箱上的现象——按下按键s13

2c4156610ba598b5449358e3c8fceb6c.png

由于该项目的上板现象是按下矩阵按键,数码管显示对应的按键号,想观看完整现象的朋友可以看一下现象演示的视频。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值