1、按键盘排布的方式可分成独立方式和矩阵方式;按读入键值的方式可分为直读方式和扫描方式;按是否进行硬件编码可分成非编码方式和硬件编码方式;按微处理器响应方式可分为中断方式和查询方式。将以上各种方式组合可构成不同的键盘接口方式。以下介绍较为常用的两种方式。独立方式独立方式是指将每个独立按键按一对一的方式直接接到I/O输入线上。如图8-2所示。读键值时直接读I/O口,每一个键的状态通过读入键值来反映,所以也称这种方式为一维直读方式,按习惯称为独立式。这种方式查键实现简单,但占用I/O资源较多,一般在键的数量较少时采用。图8-2 独立键盘 图8-3 矩阵键盘 矩阵方式矩阵方式是用n条I/O线组成行输入口
2、,m条I/O线组成列输出口,在行列线的每一个交点上设置一个按键,如图8-3所示。读键值方法一般采用扫描方式,即输出口按位轮换输出低电平,再从输入口读入键信息,最后获得键码。这种方式占用I/O线较少,在实际应用系统中采用较多。设计键盘的时候,通常小于4个按键的应用,可以使用独立式接口。如果多于4个按键,为了减少微处理器的I/O端口线的占用,可以使用矩阵式键盘。8.1.2 键盘的基本问题为了能实现对键盘的编程至少应该了解下面几个问题:第一,如何识别键盘上的按键?第二,如何区分按键是被真正地按下,还是抖动?第三,如何处理重键问题?了解这些问题有助于键盘编程。(1) 键的识别如何知道键盘上哪个键被按下
3、就是键的识别问题。若键盘上闭合键的识别由专用硬件实现,称为编码键盘;而靠软件实现的称为未编码键盘。在这里我们主要讨论未编码键盘的接口技术和键盘输入程序的设计。识别是否有键被按下,主要有查询法、定时扫描法与中断法等。而要识别键盘上哪个键被按下主要有行扫描法与行反转法。(2) 抖动问题当手按下一个键时,会出现所按的键在闭合位置和断开位置之间跳几下才稳定到闭合状态的情况,当释放一个按键时也会出现类似的情况,这就是抖动问题。抖动持续的时间因操作者而异,一般为510ms之间,稳定闭合时间一般为十分之几秒几秒,由操作者的按键动作所确定。在软件上,解决抖动的方法通常是延迟等待抖动的消失或多次识别判定。(3)
4、 重键问题所谓重键问题就是有两个及两个以上按键同时处于闭合状态的处理问题。在软件上,处理重键问题通常有连锁法与巡回法。图8-4 44键盘的结构为了正确理解MCU键盘接口方法与编程技术,下面以44键盘为例说明按键识别的基本编程原理。44的键盘结构如图8-4所示,图中列线(n1n4)通过电阻接+5V,当键盘上没有键闭合时,所有的行线和列线断开,列线n1n4都呈高电平。当键盘上某一个键闭合时,则该键所对应的行线与列线短路。例如,第2排第3个按键被按下闭合时,行线m2和列线n3短路,此时n3线上的电平由m2的电位所决定。那么如何确定键盘上哪个按键被按下呢?我们可以把列线n1n4接到微机的输入口,行线m
5、1m4接到微机的输出口,则在微机的控制下,使行线m1为低电平(0),其余三根行线m2、m3、m4都为高电平,读列线n1n4状态。如果n1n4都为高电平,则m1这一行上没有键闭合,如果读出列线n1n4的状态不全为高电平,那么为低电平的列线和m1相交的键处于闭合状态;如果m1这一行上没有键闭合,接着使行线m2为低电平,其余行线为高电平,用同样方法检查m2这一行上有无键闭合;以此类推,最后使行线m4为低电平,其余的行线为高电平,检查m4这一行上是否有键闭合。这种逐行逐列地检查键盘状态的过程称为对键盘的一次扫描。CPU对键盘扫描可以采取程序控制的随机方式,CPU空闲时扫描键盘。也可以采取定时控制,每隔
6、一定时间,CPU对键盘扫描一次,CPU可随时响应键输入请求。也可以采用中断方式,当键盘上有键闭合时,向CPU请求中断,CPU响应键盘输入中断,对键盘扫描,以识别哪一键处于闭合状态,并对键盘输入信息作出相应处理。CPU对键盘上闭合键的键号确定,可以根据行线和列线的状态计算求得,也可以根据行线和列线状态查表求得。8.1.3 MC908GP32单片机的键盘中断模块MC908GP32单片机的A口的8根引脚与键盘中断模块(Keyboard Interrupt Module KBI)的引脚复用,这里讨论A口作为键盘中断模块引脚的功能。作为KBI引脚时,下面把8个引脚分别称为KBIE7 pinKBIE0 p
7、in。它们提供了以中断方式识别是否有键被按下的硬件手段。当然,如果不以中断方式识别键盘按键,可以屏蔽键盘中断,把A口作为一般I/O口对待。本小节仅从编程角度介绍KBI,若需要详细了解有关KBI电路逻辑,可参阅芯片手册。(1) 键盘状态和控制寄存器(Keyboard Status and Control Register ,INTKBSCR)INTKBSCR包含了键盘中断请求标志、屏蔽键盘中断请求、定义键盘中断的触发方式、清除键盘中断标志等功能。其地址是$001A。数据位D7D6D5D4D3D2D1D0定义KEYFACKKIMASKKMODEK复位D7-D4:未用。读出均为0,没有具体含义。D3
8、 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
9、=0,仅下降沿触发。(2) 键盘中断允许寄存器(Keyboard Interrupt Enable Register,INTBIER)INTBIER的各位决定所对应的引脚是否允许中断进入。地址为:$001B。KBIE7KBIE6KBIE5KBIE4KBIE3KBIE2KBIE1KBIE0D7D0,分别记为KBIE7KBIE0,可读写。若KBIEx=1,表示相应引脚KBIEx pin(也就是引脚PTAx pin)被定义为中断输入引脚,反之则不能作为中断输入引脚。复位时,全为0。(3) 键盘中断编程相关问题要进行键盘中断方面的编程,下列问题也需要了解:键盘中断矢量地址:$FFE0$FFE1键盘中断
10、初始化顺序:先设置键盘状态和控制寄存器(INTKBSCR),后设置键盘中断允许寄存器(INTKBIER)。一旦设置了引脚KBIEx pin为键盘中断引入引脚,就默认了它为输入,但先它之前通过A口数据方向寄存器定义该引脚为输入且通过上拉电阻寄存器设置其有上拉电阻,再设置其为键盘中断引入引脚,则更可靠。当定义KBIEx pin为键盘中断引入引脚时,由于内部上拉到逻辑1也许需要一些时间,可能产生开始时的键盘误中断。为避免键盘误中断,建议在键盘初始化时,按下列顺序工作:令IMASKK=1(屏蔽键盘中断)、设置KBIEx1(定义中断引脚)、写ACKK=1(清除键盘中断请求)、令IMASKK=0(开放键盘
11、中断)也可以用下述方法:通过DDRA定义PTAx pin为输出、写1到PTAx(使得PTAx pin为高电平)、设置KBIEx1(定义中断引脚)注意在中断子程序中的入口和出口参数。在Wait和Stop模式下,键盘中断仍可发生。8.2 汇编语言键盘中断模块编程实例本节给出一个实际的44键盘编程实例。8.2.1 按键识别与键盘定义子程序(1) 键值计算方法图8-5 44键盘与单片机接法示例本节给出键盘编程实例,其中涉及到如何扫描键盘取得键值、中断获取键值、键盘编码等问题。键盘与单片机接线见图8-5,图8-6给出了键的定义符号“0”-“9”、“A”-“D”、“*”、“#”等。如何识别“1”键呢?这里
12、将列线n1-n4分别接PTA4-PTA7,且编程时将PTA4-PTA7定义为输入并有内部上拉电阻,行线m1-m4分别接PTA0-PTA3,且编程时将PTA0-PTA3定义为输出,那么“1”键对应于:PTA7PTA0=11101110,即$EE;“2”键对应于:PTA7PTA0=11011110,即$DE;“D”键对应于:PTA7PTA0=01110111,即$77。前者是我们的定义符号,后者是“键值”,这种情况“键值”是一个字节。这样,按图8-5的接法可以得出键值表,见图8-6。键值可以通过扫描法获得,由键值通过查表法编程得到定义值。图8-6 键盘定义(2) 键盘编程汇编语言子程序下面给出有关
13、键盘编程的汇编语言子程序。它们是:键盘中断初始化子程序、扫描法读取键值子程序、键值转为定义值子程序。即使不使用中断方式识别按键,三个子程序仍然需要使用。只不过键盘中断初始化子程序中改为不允许中断进入。扫描法读取键值与键值转为定义值两个子程序在键盘编程中通常需要使用的。键盘子程序头文件KB.h/KB.h键盘子程序定义头文件-/键盘控制引脚定义KB_P = PTA /键盘接在PTA口上KB_D = DDRA /相应的方向寄存器KB_PUE = PTAPUE /相应的上拉电阻允许寄存器键盘子程序文件KB.s/KB.s键盘子程序定义-*/本文件包含: */ (1)KBInit:初始化键盘控制及中断的相关寄存器 */ (2)KBScan:扫描4*4键盘,读取键值-A */ (3)KBDef:键值转为定义值 */硬件连接:/ PTA7-4接键盘4根列线,PTA3-0接键盘4根行线 *
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1