APP下载

对电平计时的矩阵键盘识别方法研究

2018-04-24黄世瑜

通信电源技术 2018年2期
关键词:键值低电平电平

刘 宸,黄世瑜

(四川职业技术学院,四川 遂宁 629000)

0 引 言

无论是独立式按键还是矩阵式键盘,都需要使用按键。然而,机械式按键在按下和释放时都存在一定时间的机械抖动,使得输出电平不稳定,从而导致程序错误动作。为了消除抖动带来的不良影响,通常使用软件消抖[1]。键盘识别过程中,软件消抖的处理方法是本文主要的阐述对象。在获取键位置码、译码以及按键功能的过程中,每个步骤都有多种处理方法。本文在实现键盘识别的步骤中,将逐步介绍它们的特点及对应的应用场合,以寻求最优的算法。这里,本文的程序代码采用C430语言编写。

1 方案设计

1.1 获取键位置码

首先,需要识别是否按下按键。与独立式按键一样,依靠识别与按键相连引脚的电平高低。其次,需要识别矩阵键盘中哪一位按键被按下,即要识别按键的位置码。矩阵键盘结构如图1所示。

要获取键盘中某个按键的位置码,有反转法和扫描法两种方式。其中,扫描法是用行线作为输出,列线作为输入(交换行和列线的输入、输出方向亦可),行线逐行输出低电平‘0’。若某行有键按下,列线则定会有低电平‘0’输入;如果没有按键,则列线输入值全部为高电平‘1’。如果有键按下,由列线和行线读取的坐标位置就能确定相应位置的按键有被按下[2]。

本文采用反转法,即列线和行线交替输入和输出,分两步获得键盘中的位置码,并且在多个按键同时被按下时,也能准确识别出组合键。

反转法实例程序段:

P3DIR=0X0F;//高4位输入,低4位输出

P3OUT=0XF0;//行,低4位输出0

y=P3IN;//得列码,如0xe0

P3DIR=0XF0;//高4位输出,低4位输入

P3OUT=0X0F;//列,高4位输出0

x=P3IN;//得行码,如0x0d

x=x+y;//合成位置码,如0xed

图1 矩阵键盘结构

1.2 译码

通过1.1的步骤获得按键的行号和列号合成的位置码,如0xed这样的十六进制数。但是,要转换为有象征意义的键盘编号,还要进行键盘译码。键盘的编号与键盘的位置码没有直接的运算关系,故采用查表法将位置码转变为对应的键号。

译码程序段如下:

const char keytab[]={0x11,0x21,0x41,0x81,0x12,0x22,0x 42,0x82,0x14,0x24,0x44,0x84,0x18,0x28,0x48,0x88};//位置码常量数组

...//将合成的位置码key,用查表法与位置码数组进行逐一比对。

for(i=0;i<16;i++)

{if(key==keytab[i])

break;

}

由于键盘的逻辑布局按设计和功能要求不同,会导致每个按键的坐标位置和键盘编号的对应关系发生变化。如果每次都要重新寻找对应关系来修改keytab[]数组,将会使程序不具有通用性,且浪费时间、效率低下。所以,可再通过一个翻译数组,实现任意布局的键盘编号。

const char keynum[]=//翻译数组,实现任意布局

{ 1,2,3,4,

5,6,7 ,8,

9,0,14 ,15,

10,11,12 ,13,16};

...//得到上一步骤的键号i(0~16)

return keynum[i];//返回值是将键号i通过翻译数组翻译后的值。

1.3 软件消抖

1.3.1 传统方法

这里不讨论硬件消抖,只讨论软件消抖。经典键盘消抖程序采用延时再检测的流程,首先查询键盘是否有键按下,若无键按下,则不执行功能。当有键按下时,调用延时函数或者调用其他函数,目的都是等待键盘电平抖动的时间过去后再次查询。若此时仍然有键按下,说明确实有键可靠稳定地按住,并去除了后沿抖动的可能[3]。然后,按照键盘上各按键的功能规划执行对应的功能程序。最后,为了避免按住按键时的重复执行功能,需要继续循环检测键盘,直到按键松开为止。

对应的程序段如下:

display();//其他任务

key=inkey();//读入键盘编码

if(key<16)//有按键

{display();//延时消抖,并显示

if(key==inkey())//两次读入键盘编码相同

{

key_action(key);//执行按键功能

while(key==inkey()){display();}//按住时等待松手

}

}

这段程序能够较好地实现键盘消抖。如果系统的任务相对单一,使用这段程序可以完成任务,但缺点是调用延时函数和等待松手循环查询时,程序指针陷入有限循环中,无暇处理其他任务,如读取传感器数据、输出控制执行部件等。虽然采用中断系统可以处理这些实时任务,由主程序调用键盘检测的函数,但这样会导致在主程序无限循环中一直有键盘检测的任务,而系统则无法进入低功耗模式。然而,在便携式设备中不能进入低功耗模式,将是无法想象的。当然,可以把键盘检测函数放在定时中断服务函数,由于中断源的优先顺序问题,也会导致程序指针停留在此而无法执行其他函数。

1.3.2 对电平计时的矩阵键盘检测方法

从以上分析看出,传统算法中执行矩阵键盘检测与其他任务的运行存在矛盾,有诸多弊端,而本文提出的对电平计时的矩阵键盘检测方法可以解决这些问题。程序要求每隔几毫秒读取一次矩阵键盘的值,可以放在主函数,最好放在定时中断服务程序,目的是间隔抽样检测键盘输入端口的电平。

程序流程图如图2所示,方法是间隔时间抽样检测,用一个计时值统计低电平保持的时间。首先读取输入端口数据,判断是否按键。当有按键时,计时值+1;否则,计时值清零。若连续多次都检测到低电平,计时值会累加,表示已经度过键盘的抖动时间,可以稳定可靠地按住按键。识别为短按时,需要低电平稳定10 ms以上。若间隔时间为2 ms,则计时值需要10/2=5次。当计时值累加到5时,满足短按识别条件,就可以执行对应按键的功能。如果是长按还可实现连击的效果,则当计时值累加到500时,即低电平已经稳定2 ms×500=1 s,可视为长按有效。此时,将计时值回拨到400,并执行相应功能。如果继续长按,计时值又从400累加到500时,又一次满足长按条件,但周期只有2 ms×(500-400)=0.2 s,即长按1 s后每隔0.2 s就视为连击一次,可以实现电视遥控器上的连加连减效果。返回键值的时间点只有5(短按)和500(长按),太小的是按键抖动时期,其他次数都不满足按键条件,返回按键无效的键值。整个检测按键的程序里没有延时等待,因此程序指针不会停留在这里,转而执行其他任务。

图2 对电平计时的矩阵键盘检测方法

读取按键值的程序段如下:

if(x!=0xFF)//x是合成的位置码,若按下时x!=0xFF

{

cnt++;//统计低电平的时间

if(cnt==5)//连续检测到5次低电平,表示抖动已经过去,已进入稳定期5*2ms=10ms

{ key=x; }//20 ms时,给返回值,执行功能

else if(cnt>500)//按住不松手 500×2 ms=1 s以上,长按,就连续执行功能

{ cnt=400; key=x;}//从400增加到500,共100次的时间0.2 s

else key=0xff;//其他次数时,按了键,但没达到条件

}

else {cnt=0; key=0xff;}//没按键,抬手时,时间计数cnt清0

1.4 按键功能

经过上述步骤后,能读取到稳定可靠的键盘数据。按键的位置码被翻译数组翻译后的键值是0~16。当有按键时,键值是0~15;没有按键或无效时,键值是16。按键的功能可根据键值分别对应编写。

void keyaction()

{ char key;

key=keyscan();//读取键盘数据

if(key<16)//有按键,则执行功能

{ if(key<10){n=key;}

switch(key)

{

case 10: if(n<15)n++;break;

case 11: if(n>0)n--;break;

case 12: if(n<15)n+=2; break;

case 13: if(n>0)n-=2; break;

}

P1OUT=table[n];//静态显示

}

}

此函数可放在主函数循环间隔调用,也可在定时中断服务程序中定时调用。

while(1)

{ delay(2);//间隔2 ms读取按键

keyaction();}//按键识别及执行功能

2 测试结果

测试通过搭建真实硬件电路和Proteus仿真的实验验证。实验结果证明,本文提出的间隔抽样统计低电平时间的矩阵键盘识别方法,能有效消除抖动带来的影响,还能使程序指针不停留地执行其他任务。该方法没有依靠延时等待,不浪费系统时间,实现了任意布局,并区分出了短按和长按,具有优越性。

3 结 论

为解决矩阵键盘识别传统方法中键盘检测与多任务实时运行存在的诸多问题,本文提出了一种抽样检测对电平计时的矩阵键盘识别方法。在不靠延时的前提下,既能够可靠地消除抖动,又能够保证程序顺畅地运行其他任务,并实现了键盘功能的任意布局,避免了键盘逻辑值的复杂计算和更改布局带来的排序问题。同时,能严格区分短按和长按,稍作修改亦可识别双击。因此,这是一种通用性和效率更高的矩阵键盘识别方法。

参考文献:

[1] 刘 宸.两种基于电平计时的按键检测方法[J].四川职业技术学院学报,2017,27(4):151-153.

[2] 郑玉章,徐爱钧.嵌入式开发过程中按键检测算法的改进[J].单片机与嵌入式系统应用,2014,14(8):73-75.

[3] 王海珍.按键检测算法创新在嵌入式开发中的应用[J].电子制作,2017(4):98,100.

猜你喜欢

键值低电平电平
三电平PWM整流器下的地铁牵引供电系统探讨
非请勿进 为注册表的重要键值上把“锁”
一种实用的电脑接口判断方法
2017款凯迪拉克2.8L/3.0L/3.2L/3.6L车型低电平参考电压总线电路图
三相三电平PFC(VIENNA)控制策略研究
数字电子技术的应用
一键直达 Windows 10注册表编辑高招
三电平H桥逆变器差模干扰源研究
浅谈物理电路与数字电路
注册表值被删除导致文件夹选项成空白