44矩阵键盘控制LED原理及软硬件设计仿真调试.docx
《44矩阵键盘控制LED原理及软硬件设计仿真调试.docx》由会员分享,可在线阅读,更多相关《44矩阵键盘控制LED原理及软硬件设计仿真调试.docx(21页珍藏版)》请在冰点文库上搜索。
44矩阵键盘控制LED原理及软硬件设计仿真调试
应用电子专业
4×4矩阵键盘控制LED原理及软硬件设计、仿真调试
毕
业
论
文
1引言................................................1
24×4矩阵键盘控制LED工作原理及软硬件设计、仿真调试...2
2.14×4矩阵式键盘识别显示系统概述......................2
2.24×4矩阵式键盘原理..................................3
2.34×4矩阵式键盘控制LED显示方法......................4
2.3.1数码管动态扫描显示电路............................4
2.3.28位数码管显示程序的编程方法......................5
2.3.3任务说明...........................................6
2.3.4原理图绘制说明.....................................6
2.4电路设计及电路图..................................8
2.4.14×4矩阵式键盘软件编程............................9
2.54×4矩阵式键盘软件仿真调试分析.....................14
2.5.1Proteus仿真说明..................................14
3结论................................................19
4谢词.................................................20
5参考文献..............................................21
一引言
本实验是在基于PROTUES平台下,运用80C51芯片编写程序设计实现的矩阵式键盘。
通过对矩阵键盘的硬件电路的设计及对其进行程序汇编和运行,通过单片机的内部控制实现对硬件电路的设计,从而实现对4*4矩阵键盘的识别。
用单片机的并行P1口连接4*4矩阵键盘,并以单片机的P1.0-P1.3口作键盘输入的列线,以单片机的P1.4-P1.7口作为键盘输入的行线,然后用P0.0-P0.6作输出线,通过电阻在显示器上显示不同的符号按键“0-F”[1]。
在硬件电路的基础上加上软件程序的控制来设计实现。
矩阵式键盘乃是当今使用最为广泛的键盘模式,该系统以N个端口连接控制N*N个按键,即时在LED数码管上。
单片机控制的据这是键盘显示系统,该系统可以对不同的按键进行实时显示,其核心是单片机和键盘矩阵电路部分,主要对按键与显示电路的关系、矩阵式技术及设备系统的硬件、软件等各个部分进行实现。
矩阵式键盘又称行列键盘,它是用N条I/O线作为行线,N条I/O线作为列线组成的键盘。
在行线和列线的每个交叉点上设置一个按键。
这样键盘上按键的个数就为N*N个[2]。
这种行列式键盘结构能有效地提高单片机系统中I/O口的利用率。
矩阵式键盘提高效率进行按键操作管理有效方法,它可以提高系统准确性,有利于资源的节约,降低对操作者本身素质的要求。
二4×4矩阵键盘控制LED原理及软硬件设计、仿真调试
2.14×4矩阵式键盘识别显示系统概述
矩阵式键盘模式以N个端口连接控制N*N个按键,实时在LED数码管上显示按键信息。
显示按键信息,省下了很多的I/O端口为他用,相反,独立式按键虽编程简单,但占用I/O口资源较多,不适合在按键较多的场合应用。
并且在实际应用中经常要用到输入数字、字母、符号等操作功能,如电子密码锁、电话机键盘、计算器按键等,至少都需要12到16个按键。
矩阵式键盘简介:
矩阵式键盘又称行列键盘,它是用N条I/O线作为行线,N条I/O线作为列线组成的键盘。
在行线和列线的每个交叉点上设置一个按键。
这样键盘上按键的个数就为N*N个[2]。
这种行列式键盘结构能有效地提高单片机系统中I/O口的利用率。
最常见的键盘布局如图1所示。
一般由16个按键组成,在单片机中正好可以用一个P口实现16个按键功能,这也是在单片机系统中最常用的形式,本设计就采用这个键盘模式。
在ME300B单片机开发系统中使用数码管来显示信息时,要将JP2的2、3端短接。
见图1
图1键盘布局
图2键盘布局
矩阵式键盘提高效率进行按键操作管理有效方法,它可以提高系统准确性,有利于资源的节约,降低对操作者本身素质的要求。
2.24×4矩阵式键盘原理
行列式键盘的接法比独立式键盘的接法复杂,编程实现上也会比较复杂。
但是,在占用相同的I/O端口的情况下,行列式键盘的接法会比独立式接法允许的按键数量多,其原理图如图3所示。
图34×4矩阵式键盘原理图
实际的工程中,可能会使用PIC16C5X这种通用的可编程的键盘、显示接口器件,使用PIC16C5X单片器件就能够完成键盘输入和显示控制两种功能。
行列式键盘的工作方式是先用列线发送扫描字,然后读取行线的状态,查看是否有按键按下。
键盘部分提供一种扫描的工作方式,可以和具有64个按键的矩阵键盘相连接,能对键盘不断扫描、自动消抖、自动识别按下的键,并给出编码,能对双键或n个键同时按下的情况实行保护。
在显示部分,它可以为发光二极管、荧光管及其他显示器提供按扫描方式工作的显示接口,而且为显示器提供多路复用信号,可以显示多达16位的字符或数字。
键盘中有无按键按下是由列线送入全扫描字、行线读入行线状态来判断的,其方法是将列线的所有I/O线均置成低电平,然后将行线电平状态读入累加器A中,如果有键按下,总会有一根行线被拉至低电平,从而使行输入不全为1。
键盘中哪一个键按下可由列线逐列置低电平后,检查行输入状态来判断,其方法是依次给列线送低电平,然后检查所有行线状态,如果全为1,则所按下的键不在此列,如果不全为1,则所按下的键必在此列,而且是在与0电平线相交的交点上的那个键。
2.34×4矩阵式键盘控制LED显示方法
2.3.1数码管动态扫描显示电路
图4数码管电路
在ME300B开发系统中,采用了8位数码管动态扫描显示。
它将所有数码管的8个段线相应地并接在一起,并接到AT89S51的P0口,由P0口控制字段输出。
而各位数码管的共阳极由AT89S51的P2口控制Q20-Q27来实现8位数码管的位输出控制。
这样,对于一组数码管动态扫描显示需要由两组信号来控制:
一组是字段输出口输出的字形代码,用来控制显示的字形,称为段码;另一组是位输出口输出的控制信号,用来选择第几位数码管工作,称为位码。
由于各位数码管的段线并联,段码的输出对各位数码管来说都是相同的。
因此,同一时刻如果各位数码管的位选线都处于选通状态的话,8位数码管将显示相同的字符。
若要各位数码管能够显示出与本位相应的字符,就必须采用扫描显示方式。
即在某一时刻,只让某一位的位选线处于导通状态,而其它各位的位选线处于关闭状态。
同时,段线上输出相应位要显示字符的字型码。
这样同一时刻,只有选通的那一位显示出字符,而其它各位则是熄灭的,如此循环下去,就可以使各位数码管显示出将要显示的字符。
虽然这些字符是在不同时刻出现的,而且同一时刻,只有一位显示,其它各位熄灭,但由于数码管具有余辉特性和人眼有视觉暂留现象,只要每位数码管显示间隔足够短,给人眼的视觉印象就会是连续稳定地显示。
数码管不同位显示的时间间隔可以通过调整延时程序的延时长短来完成。
数码管显示的时间间隔也能够确定数码管显示时的亮度,若显示的时间间隔长,显示时数码管的亮度将亮些,若显示的时间间隔短,显示时数码管的亮度将暗些。
若显示的时间间隔过长的话,数码管显示时将产生闪烁现象。
所以,在调整显示的时间间隔时,即要考虑到显示时数码管的亮度,又要数码管显示时不产生闪烁现象。
2.3.28位数码管显示程序的编程方法
根据要使用的数码管的具体位置来确定扫描初值和扫描方向。
根据使用数码管的个数来确定扫描的位数。
准备好要显示的数据,放入相应的显示单元中。
===========================================================
8位数码管显示子程序
;从右至左依次点亮8个数码管
===========================================================
DISPLAY:
MOVR1,#07FH;扫描初值送入R1
MOVR2,#08H;扫描位数送入R2
MOVR0,#30H;开始填充显示单元
DISP1:
MOVA,@R0;显示内容送入A
MOVDPTR,#TABLE;获得表头
MOVCA,@A+DPTR;查表获得显示数据
MOVP0,A;显示单元数据
MOVP2,R1;开始显示当前位
MOVA,R1;准备显示下一位
RRA
MOVR1,A
INCR0;取下一个单元地址
LCALLDELAY2MS;延时2MS
DJNZR2,DISP1;重复显示下一个
RET;显示完成,返回
因键值显示只需用一位数码管,可将上面的显示程序进行优化,得到下面的显示程序。
====================================================
键值显示子程序
====================================================
KEY_PLAER:
MOVA,30H;键值数据送入A
MOVDPTR,#TABLE;取段码表地址
MOVCA,@A+DPTR;查显示数据对应段码
MOVP0,A;段码送入P0口
CLRP2.7;第一个数码管显示
CALLDELAY2MS
SETBP2.7
RET
TABLE:
DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H
DB80H,90H,88H,83H,0C6H,0A1H,86H,8EH;0-F
(1)在“单片机系统”区域中,把单片机的P1.0-P1.7端口通过8联拨动拨码开关JP3连接到“4*4行列式键盘”区域中的M1-M4,N1-N4端口上[3]。
即将P1口作为整个系统的输入接口电路。
(2)在“单片机系统”区域中,把单片机的P0.0-P0.6端口通过上拉电阻连接到“静态数码显示模块”区域中的任何一个a-g端口上[4]。
(3)此实验采用的是共阴极LED显示块,只有当a-g端口输入高电平时才有效,即显示块中的对应的发光二极管才发光,低电平时不显示,通过a-g端口的不同输入使显示器显示不同的字符。
2.3.3任务说明
AT89C51单片机对4×4矩阵键盘进行动态扫描,当按键盘的键时,可将相应按键值(0~F)实时显示在数码管上;按照设计任务在Proteus7Professional中绘制电路原理图;根据设计任务的要求编写程序,画出程序流程图,并在Proteus下进行仿真,实现相应功能
2.3.4原理图绘制说明
1.原理图说明
本实验是AT89C51单片机对4×4矩阵键盘进行动态扫描,当按键盘的键时,可将相应按键值(0~F)实时显示在数码管上。
4×4矩阵键盘是用4条I/O线作为行线,4条I/O线作为列线,在行线和列线的交叉点上设置一个按键,每个按键有它的行值和列值,用4条行线和列线分别接P1.0-P1.7,要进行数码管动态扫描,就要将数码管的七段a~f相应的与P0.0-P0.6相连接,即把输入端口P1.0-P1.7连接到4×4行列式按键上作为输入,P0.0-P0.6作为输出端口控制共阳级数码管a-g,对应的a-g通过程序进行点亮或者熄灭来显示数值(0~F)。
2.原理图绘制
(1)打开Proteus软件,进入其界面,然后新建一个图纸文件,软件默认为LandspaceA4纸张,符合我们的要求,所以不需要修改。
(2)开始绘图,点击按钮P,弹出选择添加器件框图,如图1所示,在keywords里直接输入所需器件的名称或者在category的下面各个选项里一次查找所需的器件名称,然后点击ok
图5选择添加器件框图
(3)依次添加AT89C51芯片,7SEG-COM-CATHODE共阳极的7段数码管,16个按键,八个电阻R0~R7,一个晶片x1,3个电容,地及电源。
(4)按照设计的要求正确连接电路,连接时注意管脚的分配及AT89C51的工作原理。
(5)对连接好的电路图进行仿真,如有错误要先按下暂停,然后对电路作进一步的调整与修改,再进行仿真,保存原理图文件
2.4电路设计及电路图
把单片机的P1.0-P1.7端口通过8联拨动拨码开关连接到“4*4行列式键盘”,其中P1.0-P1.3作为列线,P1.4-P1.7作为行线,把单片机的P0.0-P0.6端口连接到共阴极“静态数码显示模块”区域中对应的a-g端口上;系统首先通过CPU对全部键盘进行扫描,即把第一根行线置为“0”状态,其余行线置于“1”状态,读入输入缓冲器的状态,若其状态全为“1”表明该行无键按下,再将第二根行线置为“0”状态,同样读入输入缓冲器的状态,如其状态也全为“1”,则置第一根行线置为“0”状态,以此类推[5]。
如读入输入缓冲器的状态不全为“1”,确定哪一根列线为“0”状态,当某个键的行线和列线都为“0”状态时,表明该键按下。
最后通过显示程序将该键的序号显示出来。
(如下图6)
图64×4矩阵式键盘电路图
2.44×4矩阵式键盘软件编程
KEYEQU30H
ORG0000H;入口地址
SJMPSTART
START:
MOVP0,#00H
JIXU:
MOVP1,#0FFH;判第0行是否有键按下
CLRP1.4;将P1.4清零
MOVA,P1
ANLA,#0FH;屏蔽高4位
XRLA,#0FH
JZNOKEY0;A为0,转向NOKEY0
LCALLDELAY10MS;延时,去抖动
MOVA,P1;再确认一次
ANLA,#0FH
XRLA,#0FH
JZNOKEY0;A为0,转向NOKEY0
MOVA,P1;判哪一个键按下
ANLA,#0FH
CJNEA,#0EH,NEXT1
MOVKEY,#0
LJMPOK;转向显示程序
NEXT1:
CJNEA,#0DH,NEXT2
MOVKEY,#1
LJMPOK
NEXT2:
CJNEA,#0BH,NEXT3
MOVKEY,#2
LJMPOK
NEXT3:
CJNEA,#07H,NOKEY0
MOVKEY,#3
LJMPOK
NOKEY0:
MOVP1,#0FFH;判第1行是否有键按下
CLRP1.5;将P1.5清零
MOVA,P1
ANLA,#0FH;屏蔽高4位
XRLA,#0FH
JZNOKEY1;A为0,转向NOKEY1
LCALLDELAY10MS;延时,去抖动
MOVA,P1;再确认一次
ANLA,#0FH
XRLA,#0FH
JZNOKEY1;A为0,转向NOKEY1
MOVA,P1;判哪一个键按下
ANLA,#0FH
CJNEA,#0EH,NEXT5
MOVKEY,#4
LJMPOK
NEXT5:
CJNEA,#0DH,NEXT6
MOVKEY,#5
LJMPOK
NEXT6:
CJNEA,#0BH,NEXT7
MOVKEY,#6
LJMPOK
NEXT7:
CJNEA,#07,NOKEY1
MOVKEY,#7
LJMPOK
NOKEY1:
MOVP1,#0FFH;判第2行是否有键按下
CLRP1.6;将P1.6清零
MOVA,P1
ANLA,#0FH;屏蔽高4位
XRLA,#0FH
JZNOKEY2;A为0,转向NOKEY2
LCALLDELAY10MS;延时,去抖动
MOVA,P1;再确认一次
ANLA,#0FH
XRLA,#0FH
JZNOKEY2;A为0,转向NOKEY2
MOVA,P1;判哪一个键按下
ANLA,#0FH
CJNEA,#0EH,NEXT9
MOVKEY,#8
SJMPOK
NEXT9:
CJNEA,#0DH,NEXT10
MOVKEY,#9
SJMPOK
NEXT10:
CJNEA,#0BH,NEXT11
MOVKEY,#10
SJMPOK
NEXT11:
CJNEA,#07,NOKEY2
MOVKEY,#11
SJMPOK
NOKEY2:
MOVP1,#0FFH;判第2行是否有键按下
CLRP1.7;将P1.6清零
MOVA,#P1
ANLA,#0FH;屏蔽高4位
XRLA,#0FH
JZNEXT16;A为0,转向NEXT16
LCALLDELAY10MS;延时,去抖动
MOVA,P1;再确认一次
ANLA,#0FH
XRLA,#0FH
JZNEXT16;A为0,转向NEXT16
MOVA,P1;判哪一个键按下
ANLA,#0FH
CJNEA,#0EH,NEXT13
MOVKEY,#12
SJMPOK
NEXT13:
CJNEA,#0DH,NEXT14
MOVKEY,#13
SJMPOK
NEXT14:
CJNEA,#0BH,NEXT15
MOVKEY,#14
SJMPOK
NEXT15:
CJNEA,#07H,NEXT16
MOVKEY,#15
SJMPOK
NEXT16:
LJMPJIXU
OK:
MOVA,KEY;查表显示
MOVDPTR,#TABLE
MOVCA,@A+DPTR
MOVP0,A
LJMPJIXU
DELAY10MS:
MOVR6,#10;延时
D1:
MOVR7,#248
DJNZR7,$
DJNZR6,D1
RET
TABLE:
DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H
DB7FH,6FH,77H,7CH,39H,5EH,79H,71H
END
2.54×4矩阵式键盘软件仿真调试分析
在proteus中设计好实验电路后,然后在proteus编程环境中进行程序设计和编译,生成HEX文件并加载HEX文件,点启动,运行仿真[6]。
由于开始时P0口的值被赋为00H,P1口的值为FFH,当无键按下时,将P1.4口置0,再将P1口的值送A,屏蔽高4位,与0F相异或后,A的值变为0,即第0行没有键按下,转入NOKEY0子程序中,重新赋值P1口的值为FFH,将P1.5口置0后送A,屏蔽高4位,与0F相异或后,A的值又变为0,即第1行没有键按下[7],转入NOKEY1子程序中,同理,可以得知第2行和第3行也没有键按下。
因而,P0口没有被重新赋值,保持为00H不变,又显示器是共阴极的,此时P0.0-P1.6口均为“0”,即“a-g”段均不显示,从而显示器不显示,并转向程序的开始继续循环扫描键盘,直到有键按下为止。
2.5.1Proteus仿真说明
1.现在keil软件里编译连接C程序,使生成.HEX文件。
C程序:
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineSCANPORTP1
sbitspk=P3^0;
ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,
0x71};
ucharuca_LineScan[4]={0xEF,0xDF,0xBF,0x7F};
ucharucKeyScan()
{
ucharTemp=0;
ucharucRow=0,ucLine=0;
for(ucLine=0;ucLine<4;ucLine++)
{
SCANPORT=uca_LineScan[ucLine];
Temp=SCANPORT&0x0F;
if(Temp!
=0x0F)
{
switch(Temp)
{
case0x0E:
ucRow=10;break;
case0x0D:
ucRow=20;break;
case0x0B:
ucRow=30;break;
case0x07:
ucRow=40;break;
default:
ucRow=50;break;
}
break;
}
}
SCANPORT=0x0F;
returnucRow+ucLine+1;
}
voidvKeyProcess(unsignedcharucKeyCode)
{
switch(ucKeyCode)
{
case11:
P0=table[0];spk=1;break;
case12:
P0=table[1];spk=1;break;
case13:
P0=table[2];spk=1;break;
case14:
P0=table[3];spk=1;break;
case21:
P0=table[4];spk=1;break;
case22:
P0=table[5];spk=1;break;
case23:
P0=table[6];spk=1;break;
case24:
P0=table[7];spk=1;break;
case31:
P0=table[8];spk=1;break;
case32:
P0=table[9];spk=1;break;
case33:
P0=table[10];spk=1;break;
case34:
P0=table[11];spk=1;break;
case41:
P0=table[12];spk=1;break;
case42:
P0=table[13];spk=1;break;
case43:
P0=table[14];spk=1;break;
case44:
P0=table[15];spk=1;break;
default:
break;
}
}
voidmain()