首页 理论教育 STC15W4K32S4系列高性能8051单片机的键盘接

STC15W4K32S4系列高性能8051单片机的键盘接

时间:2023-11-02 理论教育 版权反馈
【摘要】:需要定时安排查询P1端口线,以免遗漏按键操作并处理,这种键盘接口方式适用于键盘操作实时性要求不高的系统。例如,假定6号键被按下,则列线P1.6图13-7 4×4行列式键盘接口电路为低电平,列线P1.6与4根行线相交叉的4个按键分别是2、6、A、E键。

STC15W4K32S4系列高性能8051单片机的键盘接

单片机系统中通常采用非编码键盘,非编码键盘分为独立式键盘和行列式矩阵键盘。下面详细介绍这两种键盘接口的工作原理。

978-7-111-51881-5-Chapter13-3.jpg

图13-3 中断方式键盘接口电路

1.独立式键盘接口

独立式键盘是各个按键互相独立,每个按键单独连接一条输入线,另一端接地,通过检测输入线的电平就可以判断该键是否被按下。

独立式键盘适用于在按键较少的系统中或要求操作速度快的场合使用。当系统要求的按键数量比较多时,需要消耗比较多的输入口线,使电路结构繁杂。以下是几种常见的独立式键盘接口电路。

(1)中断方式独立键盘接口

如图13-3所示是采用中断方式设计的独立键盘接口电路,P1端口是键盘输入口线,每个引脚上都接有一个上拉电阻,且独立连接了一个按键,同时各个按键都连接到一个8输入与门(CD4068)的输入端,CD4068的输出端连接到外部中断输入引脚INT1。当按键没有被按下时,P1端口的引脚是高电平,CD4068的输出端为高电平,不会发生INT1中断;当有任何一个按键被按下时,产生一个低电平,都会使CD4068输出低电平,INT1引脚上发生从高到低的跳变从而引起单片机触发外部中断。单片机响应INT1中断后,再通过读P1端口的状态,就可以识别出哪一个按键被按下(读键时,先对P1口设置为高阻输入态,然后再读P1口)。这种方式的好处是不用在主程序中不断地循环查询,如果有键按下,单片机再去做相应的处理。这种键盘接口方式能够实时检测到按键,适用于键盘操作实时性要求较高的系统。

I/O口做输入、输出操作时,需要设置变换模式。中断法查键处理程序设计如下:

978-7-111-51881-5-Chapter13-4.jpg

(2)查询方式独立键盘接口

如图13-4所示是采用查询方式设计的独立键盘接口电路,工作原理与图13-3相似。需要定时安排查询P1端口线,以免遗漏按键操作并处理,这种键盘接口方式适用于键盘操作实时性要求不高的系统。

(3)缓冲方式独立键盘接口

如图13-5所示是采用缓冲器方式设计的独立键盘接口电路,按键信息通过缓冲器输入到单片机,单片机以并行总线的方式控制读取缓冲器的输出数据,缓冲器编址为7FFFH。这种键盘接口方式适用于键盘操作实时性要求不高的系统。

978-7-111-51881-5-Chapter13-5.jpg

图13-4 查询方式键盘接口电路

978-7-111-51881-5-Chapter13-6.jpg

图13-5 缓冲器输入方式键盘接口电路

针对图13-5编程时,要求只处理单一按键,如有两个或多个按键同时按下视为无效,不予以处理,单片机应定时查询数据总线P0端口,按键采用延时去抖。按键处理程序设计如下:

978-7-111-51881-5-Chapter13-7.jpg

2.行列式键盘结构

行列式键盘是单片机常用的一种键盘接口,主要适用于要求按键数量较多的系统。行列式键盘采用行、列矩阵方式交叉排列,按键跨接在行线、列线的交叉点上,如图13-6所示。3×3矩阵键盘可以构成9个按键,4×4矩阵键盘可以构成16个按键。因此,在按键数据要求较多的单片机系统中,行列式键盘比独立式键盘结构更优越,能节省更多的I/O端口线。

978-7-111-51881-5-Chapter13-8.jpg

图13-6 行列式键盘结构

a)3×3键盘 b)4×4键盘

3.键盘的编码

对于独立式键盘,因为按键数量比较少,可根据实际需要灵活编码。对于行列式键盘,按键比较多,每个按键的位置取决于所连接的行线和列线值,因此一般采用依次排列键号的方式进行键盘编码。编码时,规定采用单键操作编码(如有需要也可按多键操作编码),各按键所在的行线、列线值为0,其他线为1,这样每个键唯一对应一个编码。按图13-6的4×4键盘进行编码,根据键名、键码和特征码的对应关系,可得到键码转换见表13-1。

表13-1 4×4键盘键码转换表

978-7-111-51881-5-Chapter13-9.jpg

表格以0FFH作为结束标志,不设固定长度,以便于新的键码扩充(用于增加新的复合键)。

4.行列式键盘工作原理和编程方法

按照行列式键盘的结构,按键跨接在行、列线的交叉点上,每根行线上均有上拉电阻。当无按键被按下时,行线处于高电平状态;当有按键被按下时,行线电平发生了改变,即与该键跨接的行、列线瞬间短接在一起,如果此时列线送出低电平0,则该行线的电平就变为低电平,通过判断行线电平的状态就可得知是否有键按下。由于行列式键盘中的行、列线多键共用,首先需要对键盘按规定进行编码,然后对行、列线逐次分析,准确识别按键的位置,最后与键盘编码进行比对,准确识别出按键。下面介绍几种识别按键位置的方法。(www.xing528.com)

(1)逐行扫描

逐行扫描法又称逐行(或逐列)扫描键盘查询法,是一种最常用的按键识别方法,下面以图13-7所示的4×4行列式键盘介绍扫描法判键步骤。

1)判断键盘中有无键按下。先将全部行线置低电平,然后检测列线的状态。如果有一列线的电平为低电平,则表示键盘中有键被按下,而且按键位于低电平的列线与4根行线相交叉的4个按键之中。若所有列线均为高电平,则键盘中无键按下。

例如,假定6号键被按下,则列线P1.6

978-7-111-51881-5-Chapter13-10.jpg

图13-7 4×4行列式键盘接口电路

为低电平,列线P1.6与4根行线相交叉的4个按键分别是2、6、A、E键。

2)判断按键所在位置。在确认有键按下后,即可用逐行扫描法确认按键的具体位置。其方法是:依次将其中1根行线置为低电平,其他行线为高电平,以确定该按键所在的行线、列线位置。若检测到某列为低电平,则该列线与当前置为低电平的行线交叉处的键就是闭合按键。具体扫描过程如下:

先扫描第1行,即置行线P1.0为低电平,行线P1.1~P1.3为高电平,检测列线信号;若列线值全为1,说明按键不在第1行线;若列线值不全为1,说明第1行上有按键,按键位于第1行和列线值不为1的列线交叉处。如果第1行无键按下,则用同样的办法再扫描第2行是否有键按下,逐行扫描下去,直到找到按键为止。

例如,假定6号键被按下,先扫描第1行,置行线P1.0值为0,行线P1.1~P1.3值为1(即1110),检测列线信号值全为1,则第1行无按键;再扫描第2行,置行线P1.1值为0,行线P1.0、P1.2、P1.3值全为1(即1101),检测列线信号值为1011,列线值不全为1,则表明按键在第2行(P1.1)、第3列(P1.6)的交叉处,即是6号键。

3)求特征码。当找到按键后,根据其所对应的行线值和列线值,按特定的方式即可组合成为按键的特征值。键盘的行线、列线数目越多,方法越复杂。对于4×4键盘只要把行线的4位和列线的4位组合成8位码即可。在计算一个键盘的特征码时,每个键的特征值必须是唯一的,不能有重码。计算特征值的方法应尽量简单、可行。

例如,假定6号键被按下,按键位于第2行、第3列的交叉处,当扫描到第2行时,置行线值为1101,列线值为1011,列线值不全为1,表明找到了按键。这时只要把行线值和列线值合并成10111101即是该按键的特征码。行线值、列线值在合并时所放的位置并不重要,只要同一个键盘按照统一的规定组合特征码就可以。

4)求键码。得到按键的特征码后,就可以计算出键盘的所有按键的特征码,按键码的顺序存储在一个表中,特征码在表中的顺序号就可作为该键的键码(或键值)。因此,只要找到按键的特征码就可通过查找特征码在表中具体位置,得到相应的键码,最后根据键码转到相应的键值处理子程序,就能够完成键值处理。

在逐行扫描法中,将所有行线作为输出端口,并逐行输出低电平,将所有列线作为输入端口,得到行、列线值后,也可以不采用查表的方式查找键码。下面这个逐行扫描法查键程序,采用了非查表法,比较巧妙地找到按键键码,查键处理程序设计如下:

978-7-111-51881-5-Chapter13-11.jpg

978-7-111-51881-5-Chapter13-12.jpg

采用逐行扫描法时,列线上必须接上拉电阻,行线上可以不接。当然,也可以采用逐列扫描法识别按键,这时行线上必须接上拉电阻,列线上可以不接。

此外,单片机系统一般要求单键操作,不允许两键或多键同时按下(有设计需要的除外)。因此,为了防止两键或多键被同时按下,则从开始扫描第一行到最末一行时,若查询到只有一个按键,则确认为有效键;如果查询一遍后发现有两个以上按键,则全部作废,作为无效键处理。

(2)线反转法

扫描法需要逐行或逐列扫描,每个按键都需要被多次扫描才能够找到该键的行、列线值。线反转法也是识别按键的常用方法,而且比较简便,查找每个按键只需要进行两次读键就能够获得该键的行、列线值,因此查键速度比逐行扫描法要快。但使用线反转法时,行、列线上都应接上拉电阻。现在以图13-7所示的4×4键盘为例,介绍线反转法的工作原理和查键步骤。

1)求按键的列线值:行线作为输出线,列线作为输入线,即可得到列线值。

2)求按键的行线值:行线作为输入线,列线作为输出线,即可得到行线值。

3)求按键的特征码:将列线值和行线值合并,组合成为按键的特征码。

4)查找键码:将键盘所有按键的特征编码按希望的顺序排成一张表,然后用当前读得的特征码查表,当表中有该特征码时,它的位置编码就是对应的顺序编码,当表中没有该特征码时,说明这是一个没有定义的键码,以无效键处理,并与没有按键(0FFH)同等看待。

例如,假定6号键被按下,用线反转法查键,第1步先使行线输出全0,即将P1.0~P1.3输出低电平,然后读出列线值P1.4~P1.7,结果P1.6=0,P1.4=P1.5=P1.7=1,得到特征码的高4位并暂时存储,说明第3列有按键;第2步再使列线输出全0,即将P1.4~P1.7输出低电平,然后读出行线值P1.0~P1.3,结果P1.1=0,P1.0=P1.2=P1.3=1,得到特征码的低4位,说明第2行有按键;由此可得知键盘的第2行第3列按键被按下,即为6号键。把得到特征码的高4位和低4位合并相加,就获得按键的特征码。

线反转法查键及键码转换处理程序设计如下:

978-7-111-51881-5-Chapter13-13.jpg

5.键的保护

键的保护是指当某一时刻同时有两个或多个键被按下时,应如何处理的问题。以矩阵行列式键盘为例,若在同一行上有两个键同时被按下,则对硬件电路不会有问题。但从软件方面来看,由于这时读入的列代码中存在两个“0”值,此代码与行值组合成的特征码不在原定的键值范围内。因此,键处理时,在键值表中查不出与该键相匹配的特征码。如果出现这种情况,则一般当作废键处理。

可是,如果在同一列上有两个键同时按下,采用线反转法查询键不会出现硬件损坏,但这时若使用逐行扫描法可能会出现硬件损坏问题。因为“0”信号是逐行发出的(每次只有一个行线为“0”),由于在同一条列线上有两个键被按下,此时就会扫描到一个键的所在行值为“0”,另一个所在行值为“1”,出现了两行线输出端口短路的现象,从而造成输出端口的损坏。采用逐行扫描法查键时,为了避免这种情况的发生,一般要采用短路保护电路,以防止两键或多键的同时按下。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈