键盘模型及接口
键盘:由单个或多个按键组成,最简单的MCU数字量输入设备。
通过键盘可输入数据或命令,实现人机通信。
键盘与MCU的连接方式分为:独立方式和矩阵方式
独立方式:将每个独立按键一对一方式直接接到MCU的GPIO输入引脚,直接读取引脚状态,便可以确定哪个按键被按下。实现简单,但占用GPIO引脚资源较多,一般只用于按键数量少于六个的情况。
矩阵键盘:由m条行线与n条列线组成,在行列线的每一个交点上设置一个按键。
如何识别按键?
若键盘上闭合键的识别由专用硬件实现,称为编码键盘;靠软件实现的称为未编码键盘。
未编码键盘的接口技术:
键盘输入程序的设计:
如何识别是否按下还是抖动?
抖动:当按键被按下/释放时,会出现所按的键在闭合位置和断开位置之间跳几下,才稳定到闭合状态的情况。
在软件上解决抖动的方法:延时等待抖动的消失;多处识别判定
解决方法:查询法;定时扫描法;中断法
识别哪个键被按下?
行扫描法;行反转法
如何处理重键?
即两个及两个以上按键同时处于闭合状态的处理问题
解决方法:连锁法;巡回法
对键盘编程
4x4键盘为例说明行扫描法识别按键的基本变成原理:
列线通过电阻接+5V,当键盘上没有键闭合时,所有的行线和列线断开,列线n1到n4都呈高电平。
当键盘上某一个键闭合时,则该键所对应的行线与列线短路。
当标记为“6”的键被按下时,行线m3和列线n2短路,此时n2线上的电平由m3的电位所决定。
行扫描法识别按键基本原理
把列线n1到n4接到MCU的输入引脚,行线m1到m4接到MCU的输出引脚,则在MCU的控制下,使行线m1为低电平,其余三根行线m2、m3、m4都是高电平,并读列线n1到n4的状态。
如果n1到n4都是高电平,则m1这一行上没有键闭合。
如果读出列线n1~n4的状态不全为高电平,那么为低电平的列线和m1相交的键处于闭合状态。
如果m1这一行上没有键闭合,接着使行线m2为低电平,其余行线为高电平,用同样的方法检查m2这一行上有无键闭合。
以此类推,最后行线m4为低电平,其余的行线为高电平,检查m4这一行上是否有键闭合。
这种逐行逐列地检查键盘状态的过程称为对键盘的一次扫描。
MCU对键盘扫描可以采取程序控制的随机方式,空闲时扫描键盘。
也可以采取定时控制,每隔一定时间,对键盘扫描一次。
若接在键盘列线的MCU引脚具有下降沿或低电平中断功能,也可以采用中断方式,当键盘上有键闭合时,列线产生请求中断,CPU响应键盘输入中断,在中断服务例程中对键盘进行扫描,以识别哪一个键处于闭合状态。
仅知道第几行第几列被按下还不够,需要给每一个按键编号(键值),从而唯一确定一个按键。
键值是MCU获取硬件连接方式下每个按键的具有唯一性的数字表达。
例如:当“7”被按下时,m1和n1为低电平,取0其余位为1。
使用8位排序表达键值,放入一个字节(m₄m₃m₂m₁ n₄n₃n₂n₁)内。 “7”对应二进制位1110 1110,即十六进制为0xEE;“8”对应二进制1101 1110,即十六进制为0xED。
键盘驱动构件方法
键盘与MCU的连接,键盘需要通过物理连接与MCU连接,为了移植方便,我们在kb.h头文件中使用宏定义来描述硬件接线,并且每个接线单独宏定义,更有普适性。这样,若键盘接在MCU的不同引脚,只需修改键盘的硬件接线宏定义即可。
关于抖动,可以采用多次扫描的方式消除键盘按下或弹开时产生的抖动。
再次关于键值与定义值的对应,在kb.c文件的头部给出,方便查阅使用会根据实际按键进行修改。
键盘的初始化函数KBInit用以初始化MCU相关引脚为GPIO功能,并且初始化输入引脚内部上拉;
为了获取键盘键值定义了键盘扫描程序KNScanN,该函数会根据传入的参数scan_cnt决定扫描次数,从而可以多次扫描以消除键盘按下或弹起时的抖动。
嵌入式技术基础与实践(第4版)