实验4矩阵键盘的使用

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

实验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列(PC5)第1列(PC4)行输入PC300H01H02H03H第4行PC204H05H06H07H第3行PC108H09H0AH0BH第2行PC00CH0DH0EH0FH第1行00H01H02H03H列驱动选择列驱动码使某一列为低电平而其它列为高电平,再读取行输入,若该列有键按下则相应的位便是低电平。每个键均安排一个键值,如图4-1所示。四、实验内容:1.编写一个键盘扫描子程序(在主程序中已对接口芯片8255做好必要的初始化)。这个程序对键盘作一次扫描,若无键按下,返回时累加器A中为FFH,若有键按下,返回时A中为该键键值,键盘扫描子程序流程图如图4-2所示。图4-1键盘布置及键值其中,查键值子程序可以自行编写,也可以使用下面这个查键值子程序,这个子程序的参数如下:入口:行列关键值码放在累加器A中,高4位是列驱动码(被扫描列的对应位为0,其余位均为1),低4位是行状态(按下键的对应位为0,其余位均为1)。出口:键码放在A中带出。占用:R1、A、PSW、DPTR。程序清单如下:;查键值子程序,起始地址为KEY20KEY20:PUSHACC;暂存关键值YYNYNNY开始输出列驱动码输入行状态有无键按下?有无键按下??暂存行状态软件延时20mS再读行状态二次相同?读行状态直到键松开调用查键值子程序返回列驱动码指向下一列(列驱动码左移)列驱动码超出?A←#0FFH返回有无键按下?有无键按下??NR2置列驱动码初值(第1列低电平,其他列高)图4-2键盘扫描子程序流程图MOVR1,#00H;查键值自变量清0KEY21:JNBACC.4,KEY22;计算列数RRAINCR1SJMPKEY21KEY22:MOVA,R1;按每列4个键计算MOVB,#4MULABMOVR1,APOPACC;恢复关键值KEY23:JNBACC.0,KEY24;计算行数RRAINCR1SJMPKEY23KEY24:MOVDPTR,#KEYTAB;读取键值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,#10000001B;A口、B口方式0输出,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与JD0~JD7连接起来。开关KC倒向上方。2.建立一个工程,将在预习中做好的实验内容1和2的程序以及实验5中的显示子程序拷贝到一个的*.asm文件加入。3.编译后与单片机硬件连接,运行。4.按下键盘上的各键,相应的数字会出现在LED显示器上。代码如下:#includereg51.h//--定义使用的IO口--//#defineGPIO_DIGP0#defineGPIO_KEYP1//--定义全局变量--//unsignedcharcodeDIG_CODE[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,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;//用来存放读取到的键值//--声明全局函数--//voidDelay10ms(unsignedintc);//延时10msvoidKeyDown();//检测按键函数/********************************************************************************函数名:main*函数功能:主函数*输入:无*输出:无*******************************************************************************/voidmain(void){while(1){KeyDown();GPIO_DIG=~DIG_CODE[KeyValue];}}/********************************************************************************函数名:KeyDown*函数功能:检测有按键按下并读取键值*输入:无*输出:无*******************************************************************************/voidKeyDown(void){chara=0;GPIO_KEY=0x0f;if(GPIO_KEY!=0x0f)//读取按键是否按下{Delay10ms(1);//延时10ms进行消抖if(GPIO_KEY!=0x0f)//再次检测键盘是否按下{//测试列GPIO_KEY=0X0F;switch(GPIO_KEY){case(0X07):KeyValue=0;break;case(0X0b):KeyValue=4;break;case(0X0d):KeyValue=8;break;case(0X0e):KeyValue=12;break;}//测试行GPIO_KEY=0XF0;switch(GPIO_KEY){case(0X70):KeyValue=KeyValue+3;break;case(0Xb0):KeyValue=KeyValue+2;break;case(0Xd0):KeyValue=KeyValue+1;break;case(0Xe0):KeyValue=KeyValue;break;}while((a50)&&(GPIO_KEY!=0xf0))//检测按键松手检测{Delay10ms(1);a++;}}}}/********************************************************************************函数名:Delay10ms*函数功能:延时函数,延时10ms*输入:无*输出:无*******************************************************************************/voidDelay10ms(unsignedintc)//误差0us{unsignedchara,b;//--c已经在传递过来的时候已经赋值了,所以在for语句第一句就不用赋值了--//for(;c0;c--){for(b=38;b0;b--){for(a=130;a0;a--);}}}六、心得体会:此次4*4矩阵键盘和数码管显示系统是以AT89C51单片机为控制器核心,采用16个按钮开关矩阵式(4*4)排列和连接,来作为系统输入扫描电路来控制,并通过数码管实现键盘输入键位的显示。通过单片机判断的键值经过处理得到相应的数码管字符显示段码,向数码管输出键码,显示出相应字符。数码管的易操作和显示的高亮度性提升了本系统的稳定性。通过软件的理论性检测和实际检测,本实验最终获得成功。在调试和改进的过程中,不断完善本系统的稳定性,使得实验更符合要求,同时得到锻炼。

1 / 7
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功