资源描述:
《实验4矩阵键盘的使用.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、实验4矩阵键盘的使用一、实验目的:掌握矩阵键盘的使用及键盘扫描程序的设计方法。二、实验设备:ZY15MCU12BD型综合单片机实验箱一台、具有一个RS232串行口并安装KeilC51的计算机一台。三、实验原理及环境:实验箱上有一个16键的矩阵键盘,分为4行×4列。4行分别连接到一片8255(与8段LED显示器的段驱动和位驱动共用)的PC0~PC3,4列分别连接到8255的PC4~PC7。8255的A口、B口、C口、控制口的地址分别为片外RAM的4000H、4001H、4002H、4003H。第4列(PC7)第3列(PC6)第2列(P
2、C5)第1列(PC4)行输入PC300H01H02H03H第4行PC204H05H06H07H第3行PC108H09H0AH0BH第2行PC00CH0DH0EH0FH第1行00H01H02H03H列驱动图4-1键盘布置及键值选择列驱动码使某一列为低电平而其它列为高电平,再读取行输入,若该列有键按下则相应的位便是低电平。每个键均安排一个键值,如图4-1所示。四、实验内容:1.编写一个键盘扫描子程序(在主程序中已对接口芯片8255做好必要的初始化)。这个程序对键盘作一次扫描,若无键按下,返回时累加器A中为FFH,若有键按下,返回时A中为
3、该键键值,键盘扫描子程序流程图如图4-2所示。YYNYNNY开始输出列驱动码输入行状态有无键按下??暂存行状态软件延时20mS再读行状态二次相同?读行状态直到键松开调用查键值子程序返回列驱动码指向下一列(列驱动码左移)列驱动码超出?A←#0FFH返回有无键按下??NR2置列驱动码初值(第1列低电平,其他列高)图4-2键盘扫描子程序流程图其中,查键值子程序可以自行编写,也可以使用下面这个查键值子程序,这个子程序的参数如下:入口:行列关键值码放在累加器A中,高4位是列驱动码(被扫描列的对应位为0,其余位均为1),低4位是行状态(按下键的
4、对应位为0,其余位均为1)。出口:键码放在A中带出。占用:R1、A、PSW、DPTR。程序清单如下:;查键值子程序,起始地址为KEY20KEY20:PUSHACC;暂存关键值MOVR1,#00H;查键值自变量清0KEY21:JNBACC.4,KEY22;计算列数RRAINCR1SJMPKEY21KEY22:MOVA,R1;按每列4个键计算MOVB,#4MULABMOVR1,APOPACC;恢复关键值KEY23:JNBACC.0,KEY24;计算行数RRAINCR1SJMPKEY23KEY24:MOVDPTR,#KEYTAB;读取键值
5、MOVA,R1MOVCA,@A+DPTRRETKEYTAB:DB0FH,0BH,07H,03HDB0EH,0AH,06H,02HDB0DH,09H,05H,01HDB0CH,08H,04H,00H2.键盘扫描子程序自身无法运行,为了运行这个子程序,另编写以下程序:ORG0000HMOVSP,#6FHMOVR0,#5;延时0.5秒LOOP1:MOVR1,#200LOOP2:MOVR2,#250DJNZR2,$DJNZR1,LOOP2DJNZR0,LOOP1MOVDPTR,#4003H;8255初始化MOVA,#B;A口、B口方式0输出
6、,C口高4位输出,低4位输入MOVX@DPTR,ALOOP3:LCALLDISP;调用显示子程序DIS,设显示子程序入口为DISPLCALLKEY;调用键盘扫描子程序,设键盘扫描子程序入口为KEYCJNEA,#0FFH,LOOP4;如果有键按下转SJMPLOOP3LOOP4:MOV20H,21HMOV21H,22HMOV22H,23HMOV23H,24HMOV24H,25HMOV25H,ASJMPLOOP3其中显示子程序使用实验3中的显示子程序。程序运行后,每按一键便从显示器的右端移入一个对应的数。五、实验步骤:1.将P0.0~P0
7、.7与JD0~JD7连接起来。开关KC倒向上方。2.建立一个工程,将在预习中做好的实验内容1和2的程序以及实验5中的显示子程序拷贝到一个的*.asm文件加入。3.编译后与单片机硬件连接,运行。4.按下键盘上的各键,相应的数字会出现在LED显示器上。代码如下:#include//--定义使用的IO口--//#defineGPIO_DIGP0#defineGPIO_KEYP1//--定义全局变量--//unsignedcharcodeDIG_CODE[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d
8、,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码unsignedcharKeyValue;//用来存放读