第1节 键盘基本问题与GP32的键盘中断口
推荐给好友
打印
加入收藏
更新于2008-07-25 19:37:52

 本节首先简要阐明有关键盘识别的一些基本问题,随后给出GP32单片机的键盘中断口的使用方法。

8.1.1 键盘模型及接口

键盘是由若干个按键组成的开关矩阵,它是最简单的单片机的数字量输入设备,操作员通过键盘输入数据或命令,实现简单的人-机通信。

(1) 键盘模型式

图8-1 键盘模型及按键抖动示意图
键盘的基本电路是一个接触开关,通、断两种状态分别表示0和1,如图8-1所示的简单电路,微处理器很容易检测到开关的闭合。当开关打开时,提供逻辑“1”;当开关闭合时,提供逻辑“0”。

(2) 键盘接口
键盘接口按照不同的标准有不同的分类方法。按键盘排布的方式可分成独立方式和矩阵方式;按读入键值的方式可分为直读方式和扫描方式;按是否进行硬件编码可分成非编码方式和硬件编码方式;按微处理器响应方式可分为中断方式和查询方式。将以上各种方式组合可构成不同的键盘接口方式。以下介绍较为常用的两种方式。

①独立方式
独立方式是指将每个独立按键按一对一的方式直接接到I/O输入线上。如图8-2所示。读键值时直接读I/O口,每一个键的状态通过读入键值来反映,所以也称这种方式为一维直读方式,按习惯称为独立式。这种方式查键实现简单,但占用I/O资源较多,一般在键的数量较少时采用。

②矩阵方式
矩阵方式是用n条I/O线组成行输入口,m条I/O线组成列输出口,在行列线的每一个交点上设置一个按键,如图8-3所示。读键值方法一般采用扫描方式,即输出口按位轮换输出低电平,再从输入口读入键信息,最后获得键码。这种方式占用I/O线较少,在实际应用系统中采用较多。

设计键盘的时候,通常小于4个按键的应用,可以使用独立式接口。如果多于4个按键,为了减少微处理器的I/O端口线的占用,可以使用矩阵式键盘。

8.1.2 键盘的基本问题

键盘是由若干个按键组成的开关矩阵,它是最简单的单片机的数字量输入设备,操作员通过键盘输入数据或命令,实现简单的人-机通信。为了能实现对键盘的编程至少应该了解下面几个问题:第一,如何识别键盘上的按键?第二,如何区分按键是被真正地按下,还是抖动?第三,如何处理重键问题?了解这些问题有助于键盘编程。

(1) 键的识别
如何知道键盘上哪个键被按下就是键的识别问题。若键盘上闭合键的识别由专用硬件实现,称为编码键盘;而靠软件实现的称为未编码键盘。在这里我们主要讨论未编码键盘的接口技术和键盘输入程序的设计。识别是否有键被按下,主要有查询法、定时扫描法与中断法等。而要识别键盘上哪个键被按下主要有行扫描法与行反转法。

(2) 抖动问题
当手按下一个键时,会出现所按的键在闭合位置和断开位置之间跳几下才稳定到闭合状态的情况,当释放一个按键时也会出现类似的情况,这就是抖动问题。抖动持续的时间因操作者而异,一般为5~10ms之间,稳定闭合时间一般为十分之几秒~几秒,由操作者的按键动作所确定。在软件上,解决抖动的方法通常是延迟等待抖动的消失或多次识别判定。

(3) 重键问题
所谓重键问题就是有两个及两个以上按键同时处于闭合状态的处理问题。在软件上,处理重键问题通常有连锁法与巡回法。

图8-4 4×4键盘的结构
为了正确理解MCU键盘接口方法与编程技术,下面以4×4键盘为例说明按键识别的基本编程原理。4×4的键盘结构如图8-4所示,图中列线(n1~n4)通过电阻接+5V,当键盘上没有键闭合时,所有的行线和列线断开,列线n1~n4都呈高电平。当键盘上某一个键闭合时,则该键所对应的行线与列线短路。例如,第2排第3个按键被按下闭合时,行线m2和列线n3短路,此时n3线上的电平由m2的电位所决定。那么如何确定键盘上哪个按键被按下呢?我们可以把列线n1~n4接到微机的输入口,行线m1~m4接到微机的输出口,则在微机的控制下,使行线m1为低电平(0),其余三根行线m2、m3、m4都为高电平,读列线n1~n4状态。如果n1~n4都为高电平,则m1这一行上没有键闭合,如果读出列线n1~n4的状态不全为高电平,那么为低电平的列线和m1相交的键处于闭合状态;如果m1这一行上没有键闭合,接着使行线m2为低电平,其余行线为高电平,用同样方法检查m2这一行上有无键闭合;以此类推,最后使行线m4为低电平,其余的行线为高电平,检查m4这一行上是否有键闭合。这种逐行逐列地检查键盘状态的过程称为对键盘的一次扫描。CPU对键盘扫描可以采取程序控制的随机方式,CPU空闲时扫描键盘。也可以采取定时控制,每隔一定时间,CPU对键盘扫描一次,CPU可随时响应键输入请求。也可以采用中断方式,当键盘上有键闭合时,向CPU请求中断,CPU响应键盘输入中断,对键盘扫描,以识别哪一键处于闭合状态,并对键盘输入信息作出相应处理。CPU对键盘上闭合键的键号确定,可以根据行线和列线的状态计算求得,也可以根据行线和列线状态查表求得。

8.1.3 MC908GP32单片机的键盘中断模块

MC908GP32单片机的A口的8根引脚与键盘中断模块(Keyboard Interrupt Module — KBI)的引脚复用,这里讨论A口作为键盘中断模块引脚的功能。作为KBI引脚时,下面把8个引脚分别称为KBIE7 pin—KBIE0 pin。它们提供了以中断方式识别是否有键被按下的硬件手段。当然,如果不以中断方式识别键盘按键,可以屏蔽键盘中断,把A口作为一般I/O口对待。本小节仅从编程角度介绍KBI,若需要详细了解有关KBI电路逻辑,可参阅芯片手册。

(1) 键盘状态和控制寄存器(Keyboard Status and Control Register ,INTKBSCR)
INTKBSCR包含了键盘中断请求标志、屏蔽键盘中断请求、定义键盘中断的触发方式、清除键盘中断标志等功能。其地址是$001A。
数据位 D7 D6 D5 D4 D3 D2 D1 D0
定义 KEYF ACKK IMASKK MODEK
复位 0 0 0 0 0 0 0 0
D7-D4:未用。读出均为0,没有具体含义。
D3 — KEYF位(只读位):键盘(中断)标志位(Keyboard Flag Bit)。KEYF=1,键盘中断已产生;KEYF=0,未产生键盘中断。
D2 — ACKK位(只写位):键盘(中断)应答位(Keyboard Acknowledge Bit)。写入1,则清除键盘中断请求。
D1 — IMASKK位:键盘中断屏蔽位 (Keyboard Interrupt Mask Bit)。IMASKK=1,屏蔽键盘中断请求;IMASKK=0,开放键盘中断。
D0 — MODEK位:键盘中断引脚触发方式位(Keyboard Triggering Sensitivity Bit)。MODEK=1,下降沿及低电平触发;MODEK=0,仅下降沿触发。

(2) 键盘中断允许寄存器(Keyboard Interrupt Enable Register,INTBIER)
INTBIER的各位决定所对应的引脚是否允许中断进入。地址为:$001B。
数据位 D7 D6 D5 D4 D3 D2 D1 D0
定义 KBIE7 KBIE6 KBIE5 KBIE4 KBIE3 KBIE2 KBIE1 KBIE0
复位 0 0 0 0 0 0 0 0
D7~D0,分别记为KBIE7—KBIE0,可读写。若KBIEx=1,表示相应引脚KBIEx pin(也就是引脚PTAx pin)被定义为中断输入引脚,反之则不能作为中断输入引脚。复位时,全为0。

(3) 键盘中断编程相关问题
要进行键盘中断方面的编程,下列问题也需要了解:
①键盘中断矢量地址:$FFE0—$FFE1
②键盘中断初始化顺序:先设置键盘状态和控制寄存器(INTKBSCR),后设置键盘中断允许寄存器(INTKBIER)。一旦设置了引脚KBIEx pin为键盘中断引入引脚,就默认了它为输入,但先它之前通过A口数据方向寄存器定义该引脚为输入且通过上拉电阻寄存器设置其有上拉电阻,再设置其为键盘中断引入引脚,则更可靠。
③当定义KBIEx pin为键盘中断引入引脚时,由于内部上拉到逻辑1也许需要一些时间,可能产生开始时的键盘误中断。为避免键盘误中断,建议在键盘初始化时,按下列顺序工作:
令IMASKK=1(屏蔽键盘中断)、设置KBIEx=1(定义中断引脚)、写ACKK=1(清除键盘中断请求)、令IMASKK=0(开放键盘中断)
也可以用下述方法:
通过DDRA定义PTAx pin为输出、写1到PTAx(使得PTAx pin为高电平)、设置KBIEx=1(定义中断引脚)
④注意在中断子程序中的入口和出口参数。
⑤在Wait和Stop模式下,键盘中断仍可发生。

<<上一节 下一节>>




 
关于我们 | 诚邀加盟 | 客户服务 | 相关法律 | 网站地图 | 友情链接 | 服务信箱:service@eefocus.com
© 2006 与非门科技信息咨询(北京)有限公司 All Rights Reserved.