4×5矩阵键盘驱动程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
4×5矩阵键盘驱动程序
一、工作原理及接口电路
4×5矩阵键盘有4条列线,5条行线共20个按键。每个按键对应不同键值,键盘扫描采用外部中断扫描方式,本系统中键盘为无源结构,键盘工作时不依靠任何外部电源。4×5矩阵键盘结构图如图2-10 所示。
图2-10 4×5矩阵键盘结构图
1)4×5矩阵键盘结构及按键抖动消除
当键盘中按键数量较多时为减少I/O口的占用,通常将按键排列成矩阵形式,如图2-12所示。在矩阵式键盘中,每条行线和列线在交叉处不直接连通,而是通过一个机械弹性开关加以连接。这样5条列线(R0~R4)和4条行线(L0~L3)就可以构成20个按键的矩阵键盘。键盘采用了无源结构,工作是不依靠任何外部电源。
由于机械弹性开关的机械触点的弹性作用,一个按键开关在闭合时并不会马上稳定的闭合,在断开时也不会马上断开,因而机械开关在闭合及断开瞬间均伴有一连串的抖动,如图2-11所示。
图2-11 按键时的抖动
抖动的时间长短由按键开关机械特性及按键的人为因素决定,一般为5ms~20ms。按键抖动如果处理不当会引起一次按键被误处理多次,所以消除抖动是必要的。消除抖动的有硬件处理和软件处理两种方法。当按键较多一般采用软件消抖方式。软件消抖原理为当检测出按键闭合后执行一个延时程序(产生5ms~20ms的延时),待前沿抖动消失后再次检测按键的状态,如果按键仍保持闭合状态则可确认为有键按下。当检测到按键释放并执行延时程序,待后沿抖动消失后才转入按键的处理程序。
1)矩阵键盘的工作原理
从4×5矩阵键盘的4条列线和5条行线分别引出9条端线接于单片机的9个I/O 口,由于键盘采用了无源结构所以行列线的电平由单片机I/O口的电平决定。进入按键处理程序后先使4条列线全为低电平,5条行线全为高电平,为读行线状态做准备,没有按键时这种状态不会被改变。当键盘上的某个按键闭合时,则该键所对应的行线和列线被短路。例如:6号键被按下时列线L2与行线R1被短路,此时行线R1电平被列线L2拉低,由原来的高电平变为低电平而其它行线电平依然不变,为低电平。此时单片机可读得行线状态进而判断按键所在行并记录下行号。之后使得4条列线全为高电平,5条行线全为低电平,为读列线状态做准备。同理6号键被按下时列线L2与行线R1被短路,此时列线L2电平被行线R1拉低,由原来的高电平变为低电平而其它行线电平依然不变,为低电平。此时单片机可读得列线状态进而判断按键所在列并记录下列号。然后按一定的按键编码规则可计算出6号键的键值。
2)键盘扫描方式
键盘扫描方式一般有三种:循环扫描方式,定时扫描方式,外部中断扫描方式。循环扫描方式需要不停地扫描键盘,影响其它功能执行工作效率低。定时扫描方式是利用单片机内部的定时器,产生一个适当时间的定时中断,单片机响应中断时对键盘进行扫描取键值过程,但是这种扫描方式不管键盘上是不是有键闭合单片机总是定时地扫描工作效率还是不高。外部中断扫描方式是只在键盘上有
键闭合时才产生一个外部中断进入按键处理程序,这种方式工作效率明显提高。本系统中矩阵键盘扫描采用外部中断扫描方式。列线的五个电平信号经过或后接于外部中断信号输入口P3.3,当有任意一个按键按下时或门输出为低发生外部中断,进入按键处理程序。采用外部中断扫描方式的4×5矩阵键盘与单片机接口电路如图2-12所示。
图2-12 外部中断扫描方式的4×5矩阵键盘与单片机接口电路
二、驱动程序分析
4×5矩阵键盘采用外部中断扫描方式,有键按下作为一个中断源。当键盘上有任何一个按键按下时将触发外部中断1(/INT1),主机转入中断处理程序(矩阵键盘驱动函数)扫描键盘识别被按下的键。
4×5矩阵键盘驱动函数代码如下:
uchar key;
void int1() interrupt 2
{
uchar r,l,temp;
EA=0;//禁止所有中断
P1=0xf0;//拉高行线
P3_2=1;
temp=P1&0xf0;
temp>>=4;//取高四位
temp=~temp;
temp&=0x0f;
if(P3_2==0)
{
keydelay(1);//软件防抖动
if(P3_2==0)
temp=16;
}
if(temp!=0)
{
keydelay(1);
if(temp!=0)
switch(temp)//识别按下的按键的行号
{
case 1: l=0;break;
case 2: l=1;break;
case 4: l=2;break;
case 8: l=3;break;
case 16:l=4;break;
}
P1=0x0f;
P3_2=0;//行线全拉低
temp=P1&0x0f;
temp=~temp;
temp&=0x0f;//取低四位
if(temp!=0)
{
keydelay(1);
if(temp!=0)
switch(temp)//识别识别按下的按键的列号
{
case 1: r=0;break;
case 2: r=1;break;
case 4: r=2;break;
case 8: r=3;break;
}
key=4*l+r;//取键值
}
P1=0xf0;
P3_2=1;//拉高所有行线,准备键盘下次扫描
EA=1;//开放中断
}
}
值得注意的是应在系统上电初始化中将所有的行线拉高,这样才能在第一次按键时才能使得有键按下成为一个中断源。4×5矩阵键盘驱动程序各函数包含于头文件keyboard2.h中,在主函数中加入宏定义#include"keyboard2.h"。