admin管理员组

文章数量:1530917

2024年7月17日发(作者:)

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所示。

P3.3(INT1)

P1.0

P1.1

P1.2

P1.3

MCS-51 P1.4

P1.5

P1.6

P1.7

P3.0

图2-12 外部中断扫描方式的4×5矩阵键盘与单片机接口电路

二、驱动程序分析

4×5矩阵键盘采用外部中断扫描方式,有键按下作为一个中断源。当键盘上

有任何一个按键按下时将触发外部中断1(/INT

1

),主机转入中断处理程序(矩

阵键盘驱动函数)扫描键盘识别被按下的键。

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"。

本文标签: 按键键盘扫描中断矩阵