引言
传统的各类电子专业的教科书上以及可查阅的文献资料中,有关MCU做键盘矩阵的扫描解读,大都是通过逐行逐列扫描、键值计算、键对应特征量返回、查表等数据处理的方式来进行扫描解读的。为此还得设定在求键值时以辅助保存原值的行值、列值缓冲寄存器等,有的为了保证键每闭合一次MCU只作一次处理,往往会在程序运行中等闭合键释放后才对其进行键解释处理。这样键盘的扫描解读颇占CPU时间,降低了CPU的工作效率。本文揭示的是一种基于布尔处理的新颖的键盘矩阵解读方法。下面结合图示并以6×5键盘矩阵解读为例进行描述。
1程序结构
基于布尔处理的键盘矩阵解读方法,也就是使整个键盘矩阵的扫描解读过程都能归结为系列的布尔“位”的操作。扫描解读过程主要包括如下步骤:定义各标志位;键盘矩阵输出线扫描;查询有无键按下;查询键解读标志位;消抖动延时;查询相对应的哪个输示端口电平有变化;查询相对应的哪个输出端口输出扫描电平;相对应的哪个键作具体的解释处理;置位键解读标志位,流程如图1所示。
图1键盘矩阵扫描程序流程简图
2步骤阐述
2.1定义各标志位
充分利用现行MCU内部能进行位操作的RAM资源,运用伪指令来定义系统中所牵涉的各标志位。由于伪指令所揭示的定义只写在源程序的头文件上,是不会产生可执行目标代码的,因而对标志位定义的“操作”在图1的程序流程简图中就没有表述。
2.2键盘矩阵输出线扫描
输出线扫描过程也是通过逐个改变输出行线端口的电平来实现的,如图2所示。输入口线平常所有端口都处于高电平状态;输出口线是逐个循环的输出低电平,也就是任何时候只有一个口线输出低电平;通过键的按下接通,才有可能拉低相对应输入口线的端口电平。
图2键盘矩阵电路结构
如果系统中配置有数码显示电路,则电路结构如图3所示。输入口线平常也都处于高电平状态;输出口线却是逐个循环的输出高电平,通过反相组件后扫描线才成为低电平;通过键的按下接通,同样拉低相对应输入口线的端口电平。这样将键盘输出线扫描能与数码显示的位扫描程序合二为一了,也就能省却了键盘扫描的单独执行,把键盘扫描纳入到系统扫描显示的大循环中。
图3带数码位矩阵电路结构
2.3查询有无键按下
有无键按下自然是通过对键盘扫描输入口状况的查询来确定的。有键按下,键盘扫描输入端口也就相应有所改变了。如果输入端口如图2所示,是集中在同一个Pn口的(其中,n=0,1,2,…),那么可以用对整个Pn口的字节数据的判别来确定键有否按动;也可运用依次对Pn口的几个端口Pn.y进行位的查询来确定有无键按下,其中,y=0、1、2、3、4。
如果输入口不是集中的,为了设计布线的方便而零乱分散于P0口、P2口……Pn口等不同的P口上,那么只能通过依次地对输入各端口的位状态变化的查询来确定有否键按下。若检查到有键按下,就转入到键盘矩阵扫描解读程序;若没有键按下,则清一次键解读标志位为逻辑0,为下次按键解读作好准备。
2.4查询键解读标志位
检查有键按下后首先查询键解读标志位的状态是处于逻辑0还是逻辑1;若是逻辑0说明本次按键尚未解读过,经消抖动延时后需进一步对键盘矩阵的输出、输入口线进行查询来确定是哪一个键,并作相应处理。
若键解读标志位是逻辑1,则表明本次按键已解读过了,没必要浪费CPU时间,可直接从键扫描处理程序中返回。这就实现了键每闭合一次,MCU只作一次处理的效果。改变了传统的为了保证键每闭合一次,MCU只作一次处理,程序中需等待键释放后才对其进行解释的弊病。
2.5消抖动延时
当觉察有键按下、查询键解读标志位为0时,就置位消抖动延时标志位及其辅助位进入消抖动延时处理。消抖动延时的具体进行可调备用的消抖动延时程序;也可借助对系统大循环次数的计数或动用MCU内部定时器的中断来实现消抖动延时,这样就不必设置专门的延时程序而占用CPU的时间了。消抖动延时结束时清零消抖动延时标志位及其辅助位。
2.6查询哪个输入口线电平有变化
平常所有输入端口都处于高电平,经消抖动延时后就查询键盘矩阵各输入口线的电平是否有被拉低。若一个端口也没被拉低,则说明本次按键无效(可能是某种干扰引起的“抖动”),于是直接返回。
若依次查询作为输入的Pn.y各端口的其中某个端口电平被拉低,则表明本次按键是有效的,将跳转至查询与该口线交叉相关的那个输出口线。
2.7扫描哪个输出口线输出有效电平
图2所示的键盘矩阵电路结构中,输出端口Pm.x与输入端口Pn.y是直接由键连接交叉的。当键按下时哪一个输入端口的电平被拉低确定后,则跳转到查询Pm.x(Pm.0、Pm.1、Pm.2、Pm.3、Pm.4、Pm.5)六个端口中是哪个端口输出低电平,进而确定具体哪一个键按下,跳转至几号键进行解释处理。任何时候扫描输出低电平的端口是唯一的,也只有行扫描输出低电平的那个Pm.x口,才会将列输入Pn.y口的电平拉低。这时,键按下有效交叉的行、列相应端口都处于低电平。
若运用典型的51系列MCU的指令去写汇编程序来解读矩阵的具体键时,则有:
Key_scan:JNB Pn.y,Key_matrix_j
;当输入端口Pn.y(y=0,1,2,3,4)
;被拉低时,跳转至Key_matrix_j(j=y)
LJMPReturn
;若端口Pn.y一个也没被拉低,则返回
Key_matrix_j: JNBPm.x,Key_gloze_i
;当知晓Pn.y的某个端口被拉低,则再查询Pm.x
;(x=0,1,2,3,4,5)的哪个端口扫描输出低电平
;来确定具体是i号按键,则跳转至Key_gloze_i
;(i=1,2,3,…,29,30)以对i号键作相应的解释处理
LJMPReturn
Key_gloze_1:…;1号键解释处理
LJMPReturn
Key_gloze_2:…;2号键解释处理
LJMPReturn
Key_gloze_29:…;29号键解释处理
LJMPReturn
Key_gloze_30:…;30号键解释处理
Return:RET;键盘矩阵扫描解读返回
以上汇编语言所述的键盘矩阵扫描解读过程,可借助图4来较形象化地解释。
由图4可见,每一Pn.y(y=0,1,2,3,4)口都与Pm.x(x=0,1,2,3,4,5)的6个口有关联,而每一Pn.y口线与Pm.x的6个口线中任一口线相交都揭出一个键(i号),结合以上程序,若输入端口Pn.0被拉低,且是端口Pm.1有效扫描输出低电平,则有(JNBPn.0,Key_matrix_0)指令跳转至Key_matrix_0,继而查询输出端口(JNBPm.1,Key_gloze_6)跳转至Key_gloze_6,也就是先查询到Pn.0被拉低跳转至Key_matrix_0→再查询到Pm.1扫描输出低电平跳转至Key_gloze_6→揭出是6号键按下并赋予其相应的解释处理。以此类推。
图4键盘矩阵扫描倒树形结构
如果键盘矩阵的电路结构如图3所示,其扫描输出端口Pm.x不是直接与输入端口Pn.y交叉的,而是经过用于数码显示位驱动的反相组件后再与入端口Pn.y交叉的。为此,其扫描输出有效端口不是低电平了,而是输出高电平经反相组件后再成为低电平,通过按键同样将与之交叉的输入端口线拉低。所以,在查询输入端口时与图2所示的是相同的,而在查询扫描输出有效端口时与图2的就有所不同了。
图2所示电路结构查询的是哪个端口扫描输出低电平,有:
JNBPm.x,Key_gloze_i;
图3所示电路结构查询的却是哪个端口扫描输出高电平,则:
JBPm.x,Key_gloze_i;
由图4可知,若输入端口Pn.2被拉低,且是端口Pm.3有效扫描输出高电平,则有先查询到Pn.2被拉低→再查询到Pm.3扫描输出高电平→揭出是18号键按下并赋予其相应的解释处理。依此类推。具体的程序跳转如图5所示,可见其过程都是位的查询跳转。
图5键盘矩阵扫描程序跳转结构图
2.8执行各对应键具体处理
因为输出口线为行线,与输入口线为列线的交叉点是唯一的,故确定了输出哪一端口与输入哪一端口,也就确定了具体哪一个键(i号键)按下了,就能赋予该键相应的解释处理。整个过程中,没必要区别哪个是数字键、哪个是功能键。每一个键的解读都是等价的,是数字键就直接赋予其相应的数值处理,是功能键就直接赋予其具体的功能解释。
2.9置位键解读标志位
为保证键每闭合一次MCU只作一次处理,每一次键解读后都将置键解读标志位为逻辑1。对于键解读标志位的置位,可以在每一个键解释处理完毕后进行,也可在消抖动延时后就进行一次总置。不管键有多少个,键解读标志位用的却是同一个。
其实,引入了键解读标志位,不只是控制键每闭合一次MCU只作一次处理,还可对那些持久按着的键有控地进行多次处理(如用于对一些数据递进、或递减的连续设置等)。
3原理综述
本文提出基于布尔处理的键盘矩阵解读方法。其原理如下:
在键盘矩阵扫描时,首先检查有否键按动。若无键按动,则清零一次键解读标志位就返回;若有键按下,则再查询键解读标志位是逻辑0还是逻辑1。如果是逻辑1,表明本次按键已解读过,可直接从键扫描处理程序中返回;如果是逻辑0,说明本次按键尚未解读过,则启用消抖动延时。经消抖动延时后即查询键盘矩阵输入口线的各端口是否有拉低。若一个端口也没被拉低,则说明本次按键无效,那可能是某种干扰引起的“抖动”,立即从键扫描处理程序中返回;若查询到其中之一端口的电平被拉低了,则表明本次按键盘是有效的,将跳转查询与之相交的那个扫描有效输出口线,进而确定具体是哪一个键按下,并跳转赋予其相应的解释处理。解释处理后,置键解读标志位为逻辑1再返回,即完成一次键盘矩阵的扫描解读。
不管键盘矩阵有多少个键,其扫描确定一个具体键所需位查询的总次数S不会大于行数x与列数y之和;但也不少于2次,即2≤S≤x+y。如上述的6×5矩阵,最多所需位查询总次数S=5+6=11。当第30号键按下,查询到最后一列Pn.4端口电平被拉低,继而跳转查询到有效扫描输出是最后一行Pm.5端口;但至少所需位查询总次数S=1+1=2。当1号键按下,先查询到第1列Pn.0端口电平被拉低,继而跳转查询到有效扫描输出是第1行Pm.0端口。
结语
运用布尔位操作处理进行键盘矩阵的解读,可适用于所有基于MCU的智能化仪器仪表中键盘矩阵的解读。运用布尔位操作方式,改变了传统的用数据字节处理方式。扫描解读过程中,没有键值计算,没有键对应的特征值返回,同时也省去了求键值时以辅助保存原值的行值、列值缓冲寄存器等,有的只是位的操作查询。构成键盘矩阵的输入口线可以是连续的,也可以是不连续的。在电路设计布线时,哪一个端口方便就用哪个端口作键盘矩阵输入线。换言之,输入口线可随意分散在不同P口中,这种灵活、便捷的方式是传统的用键值处理的方式所不及的;同时也改变了传统的为了保证键每闭合一次MCU只作一次处理,需等待键释放后才对其进行键解释处理的做法。整个键盘矩阵的扫描显得简捷、高效,键盘矩阵的解读更为明快、准确。