基于AT89C52的矩阵键盘编程
2016-12-17潍坊工程职业学院张成法马凤娟
潍坊工程职业学院 张成法 马凤娟
基于AT89C52的矩阵键盘编程
潍坊工程职业学院张成法马凤娟
本文主要讲述采用逐行扫描法识别矩阵式键盘按键,通过依次按下矩阵式键盘上的第1~16个键,6位数码管全部依次显示0~F来阐述矩阵式键盘按键识别的具体实现方法。
矩阵式键盘;按键;数码管
引言
在单片机组成的各种系统中,应用最多的是非编码键盘。非编码键盘又分为:独立键盘和行列式(又称矩阵式)键盘。本文通过案例程序“依次按下矩阵式键盘上的第1~16个键,6位数码管全部依次显示0~F”的编写阐述采用逐行扫描法识别矩阵式键盘按键的实现方法。对矩阵式键盘按键的识别方法有很多种,本文讲述的方法简单易懂,容易掌握。
1 系统整体设计
本系统是由AT89C52单片机、电源电路、复位电路、6个数码管、锁存器和4行×4列的矩阵式键盘组成。如图1所示,图中已对4行×4列的矩阵式键盘的每个按键从左到右、从上到下进行了1~16的数字编号。
系统整体设计图
图中与P2.0相连的键盘是独立键盘。一旦独立键盘被按下,则与之相连的P2.0引脚由高电平变为低电平,如果检测到P2.0引脚是低电平,则说明独立键盘被按下去了。
4行×4列的矩阵式键盘全部和单片机的P3口相连,矩阵式键盘的4行是跟P3.0~P3.3引脚相连,4列是跟P3.4~P3.7引脚相连。
2 矩阵式键盘按键识别分析
①给键盘的第一行P3.0赋值0,给其余的P3.1~P3.7赋值1,即P0=0xfe,然后重新读回P3.4、P3.5、P3.6、P3.7的数据,看看读回的P3.4、P3.5、P3.6、P3.7的数据中是否有0,如果有0,则说明第一行的4个键(1、2、3、4)中有某个键被按下去了。如果从P3.4~P3.7读回来的数为0111,则说明键1被按下去了。如果从P3.4~P3.7读回来的数为1011,则说明键2被按下去了。如果从P3.4~P3.7读回来的数为1101,则说明键3被按下去了。如果从P3.4~P3.7读回来的数为1110,则说明键4被按下去了。
②给键盘的第二行P3.1赋值0,给其余的P3.0、P3.2、P3.3、P3.4、P3.5、P3.6、P3.7赋值1,即P0=0xfd,然后重新读回P3.4、P3. 5、P3.6、P3.7的数据,看看读回的P3.4~P3.7的数据中是否有0,如果有0,则说明第二行的4个键(5、6、7、8)中与数据为0的引脚相连的某个按键被按下去了。
③给键盘的第三行P3.2赋值0,给其余的P3.0、P3.1、P3.3、P3.4、P3.5、P3.6、P3.7赋值1,即P0=0xfb,然后重新读回P3.4、P3. 5、P3.6、P3.7的数据,看看读回的P3.4~P3.7的数据中是否有0,如果有0,则说明第三行的4个键(9、10、11、12)中与数据为0的引脚相连的某个按键被按下去了。
④给键盘的第四行P3.3赋值0,给其余的P3.0、P3.1、P3。2、P3.4、P3.5、P3.6、P3.7赋值1,即P0=0xf7,然后重新读回P3.4、P3. 5、P3.6、P3.7的数据,看看读回的P3.4~P3.7的数据中是否有0,如果有0,则说明第四行的4个键(13、14、15、16)中与数据为0的引脚相连的某个按键被按下去了。
检测矩阵式键盘中是否有键被按下去就是根据①→②→③→④的顺序进行的。依次给矩阵式键盘的每一行赋值0,然后依次读取P3口的高四位P3.4~P3.7的数据,看看P3.4~P3.7中数据有没有为0的,如果有为0的则说明有按键被按下去。
3 程序设计
编写案例项目“依次按下矩阵键盘上的第1~16个键,6位数码管全部依次显示0~F”的程序。依次给P3口赋值0xfe、0xfd、0xfb和0xf7实现对矩阵式键盘的逐行扫描。
在程序中给P3口赋值,然后把P3口的数据重新读取回来,并将其赋给变量temp,即temp=P3,然后将temp和0xf0进行与运算,把与运算结果temp&0xf0跟0xf0相比较,如果temp& 0xf0=0xf0则说明没有按键被按下去,如果temp&0xf0不等于0xf0则说明有按键被按下去。
按键在闭合时,触点会存在抖动现象,为了确定按键是否确实被按下去,在程序编写中需要对其进行多次判断。
部分程序如下所示:
P3=0xfd;//对键盘第二行进行扫描
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)//判断是否有按键按下去
{
delay(5);
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)//判断是否有按键按下去
{
temp=P3;
switch(temp)
{
case 0xed:num=5;
break;
case 0xdd:num=6;
break;
case 0xbd:num=7;
break;
case 0x7d:num=8;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
4 结束语
本文利用数码管和锁存器,通过在数码管上显示矩阵式键盘按键数值的项目案例,详细讲述了采用逐行扫描法识别矩阵式键盘按键的实现方法。该方法简单易懂,容易掌握。
[1]林珊,许建明.基于单片机的键盘显示系统设计[J].信息与电脑,2011.
[2]郭小军.单片机控制数码管动态显示过程分析[J].武汉船舶职业技术学院学报,2010.
张成法,1984年出生,山东青州人,硕士,研究方向:单片机与嵌入式系统。