键盘是单片机系统中完成控制参数输入及修改的最常用输入设备,是人工干预系统的重要手段。常用键盘编码键盘和非编码键盘两种,它们之间的主要区别在于识别键符及给出相应键码的方法不同。其中:编码键盘主要是用硬件来实现键的识别;而非编码键盘主要由用户用软件来实现键盘的定义和识别。尽管非编码键盘的系统功能通常比较简单,需要处理的任务较少,但是可以降低成本、简化电路设计,这种键盘通常使用在按键数量较少的场合,单片机中一般都使用之。
8.1.1.1 键盘的工作原理与去抖动方法
1.按键的电路原理
常见键盘有触摸式键盘、薄膜键盘和按键式键盘,最常用的是按键式键盘。按键式键盘实际上是一组按键开关的集合,平时按键开关总是处于断开状态,当按下键时它才闭合。通常按键开关为机械开关,由于机械触电的弹性作用,按键开关在闭合和释放(断开)时不会马上稳定地接通或断开,因而在闭合和释放的瞬间会伴随着一串的抖动,其抖动现象的持续时间大约在5~10ms。按键的电路结构如图8-1所示,其产生的波形如图8-2所示。
按键的抖动人眼是察觉不到的,但会对高速运行的CPU产生干扰,进而产生误处理。为了保证按键闭合一次,仅作一次键输入处理,必须采取措施消除抖动。
图8-1 单按键的电路结构
图8-2 键闭合和断开时的电压波动
2.抖动的消除方法
消除抖动的方法有硬件消抖法和软件消抖法两种。
(1)硬件消除抖动方法。它采用简单的基本R-S触发器或单稳态电路或RC积分滤波电路构成去抖动按键电路。
基本R-S触发器构成的硬件去抖动按键电路如图8-3所示。分析图8-3(a)可知,当按键S按下,即接B时,输出Q为0,无论按键是否有弹跳,输出仍为0;当按键S释放,即接A时,输出为1,无论按键是否有弹跳,输出仍为1。键闭合、断开时的电压波动如图8-3(b)所示。
图8-4所示的是一个利用RC积分电路构成去抖动电路。RC积分电路具有吸收干扰脉冲的滤波作用,只要适当选择RC电路的时间常数,就可消除抖动的不良后果。当按键未按下时,电容C两端的电压为零,经非门后输出为高电平。当按键按下后,电容C两端的电压不能突变,CPU不会立即接受信号,电源经R1向C充电,若此时按键按下的过程中出现抖动,只要C两端的电压波动不超过门的开启电压(TTL为0.8 V),非门的输出就不会改变。一般R1 C应大于10ms,且VccR2/(R1+R2)的值应大于非门的高电平阈值,R2 C应大于抖动波形周期。图8-4的电路简单,若要求不严,可取消非门直接与CPU相连。
图8-3 R-S触发器消抖动电路
图8-4 滤波消抖动电路
(2)软件去抖动方法。此法在首次检测到有键按下时,该键所对应线的电压为低电平,执行一段延时10ms的子程序后,避开抖动,待电平稳定后再读入按键的状态信息,确认该线电平是否仍为低电平,如果仍为低电平,则确认确实有键按下。当按键松开时,该线的低电平变为高电平,执行一段延时10ms的子程序后,检测该线为高电平,说明按键确实已经松开。采取本措施,可消除前沿和后沿两个抖动期的影响。
8.1.1.2 非编码键盘与CPU的连接方式
1.独立式按键及接口
独立式按键是指每个按键独占一根I/O接口线,各按键之间相互独立,每根I/O接口线上的按键工作状态都不会影响其他I/O接口线的工作状态。8个按键电路如图8-5所示。每一个按键独立地占用一条数据线,当某键闭合时,其对应的I/O接口线就被置为低电平。
独立式按键的软件常采用查询式结构。先逐位查询每根I/O口线的输入状态,如某一根I/O口线输入为低电平,则可确认该I/O口线所对应的按键已按下,然后,再转向该键的功能处理程序。
独立式按键的优点是各按键相互独立,电路配置简单灵活,识别按下按键的软件编写简单。但按键数量较多时,I/O接口线占用较多,电路结构繁杂。因此它适合于按键数量较少的场合。
图8-5 独立式按键电路
图8-6 矩阵式键盘的结构
2.矩阵式键盘及接口
矩阵式(也称行列式)键盘由行线和列线组成,按键位于行、列的交叉点上。图8-6给出了4×4键盘的结构和一种接口方法。图中4根I/O接口线(P1.0~P1.3)作为行线,另外4根I/O接口线(P1.4~P1.7)作为列线,按键跨接在行线和列线上。当键盘上没有键闭合时,行线由P1.0~P1.3内部拉高电路拉成高电平,当行线P1.x上有键闭合时,则行线P1.x和闭合键所在列线P1.y短路,P1.x状态取决于列线P1.y的状态。例如,键6按下,P1.1和P1.6被接通,P1.1的状态由P1.6的输出状态决定。
从图8-6可见,矩阵式键盘中,行、列线分别连接到按键开关的两端,行线通过上拉电阻接到+5V上。当无键按下时,行线处于高电平状态;当有键按下时,行、列线将导通,此时,行线电平将由与此行线相连的列线电平决定。这是识别按键是否按下的关键。然而,矩阵键盘中的行线、列线和多个键相连,各按键按下与否均影响该键所在行线和列线的电平,各按键间将相互影响,因此,必须将行线、列线信号配合起来作适当处理,才能确定闭合键的位置。
行列式键盘的优点是占用I/O接口线较少,但由于矩阵式键盘中行、列线为多键共用,各按键彼此将相互发生影响,所以必须将行、列线信号配合,才能确定闭合键位置。因此,它的软件结构较为复杂。它适用于按键较多的场合。
8.1.1.3 键盘的任务
非编码矩阵式键盘所完成的工作分为3个层次。
(1)键盘状态的判断。单片机如何来监视键盘的输入,也即如何判断是否有键按下(即键盘状态的判断),体现在键盘的工作方式上就是编程扫描、定时扫描和中断扫描3种。
(2)闭合键的识别。若有键按下,需识别是哪一个键按下(即闭合键的识别),并确定按下键的键号(键值)。体现在按键的识别方法上就是扫描法和线反转法2种。
(3)键盘的编号。根据按下键的键号,实现按键的功能,即跳向对应的键处理程序。
下面再详细讨论上面3个层次工作。
1.键盘状态的判断(也称为键盘扫描控制方式)
单片机在忙于其他各项工作任务时,如何兼顾键盘的输入,这取决于键盘的工作方式。工作方式选取原则是,既要保证及时响应按键操作,又不过多占用单片机工作时间。键盘状态的判断常用方式有编程扫描、定时扫描和中断扫描3种。
(1)编程扫描方式(也称查询方式)。利用单片机空闲时,调用键盘扫描子程序,反复扫描键盘。如果单片机查询的频率过高,虽能及时响应键盘的输入,但也会影响其他任务的进行。查询的频率过低,可能会键盘输入漏判。所以要根据单片机系统的繁忙程度和键盘的操作频率,来调整键盘扫描的频率。
(2)定时扫描方式。每隔一定的时间对键盘扫描一次。在这种方式中,通常利用单片机内的定时器产生的定时中断,进入中断子程序来对键盘进行扫描,在有键按下时识别出该键,并执行相应键的处理程序。为了不漏判有效的按键,定时中断的周期一般应小于100ms。
上面两种方法的键盘扫描子程序都是将列线(或行线)、行线(或列线)分别作为输出线、输入线,将输出线它们全部输出为“0”,然后读取输入线的状态,如果输入线全为“1”,则表示此时没有任何按键按下;如果输入线不全为“1”,表示有按键按下。再进行按键消去抖动处理后,确认不是抖动干扰后,再进入下一步判别哪个键被按下。(www.xing528.com)
(3)中断扫描方式。上面两种方法即使按键没有按下,单片机CPU总是不断的扫描键盘,占用了很多CPU处理时间。而中断扫描法则只有按键按下时,才触发中断,单片机响应中断,在中断服务程序中再判断哪个键被按下,进而扫描键值。如无键按下,单片机将不理睬键盘。此方式克服了前两种控制方式可能产生的空扫描和不能及时响应键输入的缺点,既能及时处理键输入,又能提高CPU运行效率,但要占用一个的中断资源。
图8-7 中断方式的矩阵式键盘接口电路
中断扫描方式的硬件接口电路连接方法如图8-7所示,其工作原理如下:有按键闭合时,产生中断请求信号(4输入端的与门有0则值为0);若无按键闭合时,不会产生中断请求信号(与门全1则值为1);若有中断请求,由硬件将中断请求信号送入端口,CPU响应中断后,转向中断服务程序。消抖、扫描求键号等工作均由中断服务子程序完成。
2.闭合键的识别
当判断到键盘上有键闭合时,则要进一步识别闭合键的位置。由于矩阵式键盘中行、列线为多键共用,各按键彼此将相互发生影响,所以必须将行、列线信号配合,才能确定闭合键位置。矩阵式键盘按键的识别方法常用逐行扫描法(简称扫描法)和线翻转法(简称反转法)两种,其中最常见的方法是扫描法。
(1)逐行扫描法。它分为两步,首先识别键盘有无键按下;接着,如有键被按下,再采用逐列扫描法识别出具体的键位。第2步具体步骤如下:
1)首先P1.4~P1.7输出1110,即P1.7为0其余列线为1,读行线P1.0~P1.3状态,若不全为1,则为0的行线P1.x和输出0的列线P1.7相交的键处于闭合状态。若行线为全“1”,则P1.7这一列上无键闭合;
2)接着P1.4~P1.7输出1101,即P1.6为0其余列线为1,读行线P1.0~P1.3状态,判断P1.6这一列上有无键闭合;
3)依此类推,最后使P1.4~P1.7输出0111,即P1.4为0其余列线为1,读行线P1.0~P1.3状态,判断P1.4这一列上有无键闭合。这种逐行逐列检查键盘上闭合键的位置,称为逐行扫描法(简称扫描法)。
综上所述,逐行扫描法的思想是先把某一列置为低电平,其余各列置为高电平,检查各行线电平的变化,如果某行线电平为低电平,则可确定此行此列交叉点处的按键被按下。
逐行扫描法的优点是不需要双向接口,连接行线的接口为输入接口,连接列线的接口为输出接口。
(2)线翻转法。逐行扫描法要逐列扫描查询,有时则要多次扫描。而线翻转法则很简练,无论被按键是处于第一列或最后一列,均只需经过两步便能获得此按键所在的行列值。具体步骤如下:
1)让行线编程为输入线,列线编程为输出线,并使输出线输出为全低电平,则行线中电平由高变低的所在行为按键所在行。P1.0~P1.3为输入线,P1.4~P1.7为输出线,P1.4~P1.7输出全“0”,读行线P1.0~P1.3状态,得到为0的行P1.x即为闭合键所在的行;
2)再把行线编程为输出线,列线编程为输入线,并使输出线输出为全低电平,则列线中电平由高变低所在列为按键所在列。将P1.0~P1.3改为输出线,P1.4~P1.7改为输入线,P1.0~P1.3输出上一步读到的行线状态,读P1.4~P1.7,得到为0的列线P1.y,则行线P1.x和列线P1.y相交的键处于闭合状态。
3)两步即可确定按键所在的行和列,从而识别出所按的键。把上两步得到的输入数据拼成一个字节数据作为键值。
线翻转法的优点是识别快,但要求用于连接行线和列线的接口具有双向数据传送的功能。
3.键盘的编码
对于独立式按键键盘,因按键数量少,可根据实际需要灵活编码。对于矩阵式键盘,按键的位置由行号和列号唯一确定,因此可分别对行号和列号进行二进制编码,然后将两值合成一个字节,低4位是行号,高4位是列号。以图8-6中的4×4键盘为例,4×4键盘的编码为:
0号键按下时,必在行线输出1110B,列线读得1110B时,其键值为11101110B=EEH;
1号键按下时,必在行线输出1110B,列线读得1101B时,其键值为11011110B=DEH;
2号键按下时,必在行线输出1110B,列线读得1011B时,其键值为10111110B=BEH;
…
15号键按下时,必在行线输出0111B,列线读得0111B时,其键值为01110111B=77H。
键盘查询程序设计时,可将这16个按键对应的键值按照键号0~15连续存放,构成一个数据表,通过查表即可确定键值。表8-1为键值和键值的对应关系表。采用上述编码对于不同行的键离散性较大,不利于散转指令对按键进行处理。因此,可采用依次排列键号的方式进行编码,可将键号编码为:01 H、02 H、03H、…、0EH、0FH、10 H等16个键号。编码相互转换可通过计算或查表的方法实现。
表8-1 键值表
4.闭合的键是否释放判别
按键闭合一次只能进行一次功能操作,因此,等按键释放后才能根据键号执行相应的功能键操作。
8.1.1.4 键盘接口编程举例
【例8-1】 设计一个独立式按键的键盘接口,并编写键扫描程序,电路原理图参见前面的图8-5,键号从上到下分别为0~7。
下面采用查询方式对实现独立式键盘的扫描并读取键值。
C语言参考程序为:
图8-8 程序扫描方式程序流程图
【例8-2】 设计一个矩阵式按键的键盘接口,并编写键扫描程序,电路原理图参见前面的图8-6。
图8-8所示为采用查询工作方式的键扫描子程序的流程图。为了防止一次按键多次输入键码的现象出现,在查出键号后,等到确定按下的按键释放后的瞬间再将对应的键号送入CPU的累加器A中。
汇编键盘扫描参考程序为:
C语言键盘扫描参考程序为:
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。