您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 电子设计/PCB > 47单片机4×4矩阵键盘设计方案
1、设计原理(1)如图14.2所示,用单片机的并行口P3连接4×4矩阵键盘,并以单片机的P3.0-P3.3各管脚作输入线,以单片机的P3.4-P3.7各管脚作输出线,在数码管上显示每个按键“0-F”的序号。(2)键盘中对应按键的序号排列如图14.1所示。2、参考电路图14.24×4矩阵式键盘识别电路原理图3、电路硬件说明(1)在“单片机系统”区域中,把单片机的P3.0-P3.7端口通过8联拨动拨码开关JP3连接到“4×4行列式键盘”区域中的M1-M4,N1-N4端口上。(2)在“单片机系统”区域中,把单片机的P0.0-P0.7端口连接到“静态数码显示模块”区域中的任何一个a-h端口上;要求:P0.0对应着a,P0.1对应着b,……,P0.7对应着h。4、程序设计内容(1)4×4矩阵键盘识别处理。(2)每个按键都有它的行值和列值,行值和列值的组合就是识别这个按键的编码。矩阵的行线和列线分别通过两并行接口和CPU通信。键盘的一端(列线)通过电阻接VCC,而接地是通过程序输出数字“0”实现的。键盘处理程序的任务是:确定有无键按下,判断哪一个键按下,键的功能是什么?还要消除按键在闭合或断开时的抖动。两个并行口中,一个输出扫描码,使按键逐行动态接地;另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软件查表,查出该键的功能。5、程序流程图(如图14.3所示)6、汇编源程序;;;;;;;;;;定义单元;;;;;;;;;;COUNTEQU30H;;;;;;;;;;入口地址;;;;;;;;;;ORG0000HLJMPSTARTORG0003HRETIORG000BHRETIORG0013HRETIORG001BHRETIORG0023HRETIORG002BHRETI;;;;;;;;;;主程序入口;;;;;;;;;;ORG0100HSTART:LCALLCHUSHIHUALCALLPANDUANLCALLXIANSHILJMPSTART;;;;;;;;;;初始化程序;;;;;;;;;;CHUSHIHUA:MOVCOUNT,#00HRET;;;;;;;;;;判断哪个按键按下程序;;;;;;;;;;PANDUAN:MOVP3,#0FFHCLRP3.4MOVA,P3ANLA,#0FHXRLA,#0FHJZSW1LCALLDELAY10MSJZSW1MOVA,P3ANLA,#0FHCJNEA,#0EH,K1MOVCOUNT,#0LJMPDKK1:CJNEA,#0DH,K2MOVCOUNT,#4LJMPDKK2:CJNEA,#0BH,K3MOVCOUNT,#8LJMPDKK3:CJNEA,#07H,K4MOVCOUNT,#12K4:NOPLJMPDKSW1:MOVP3,#0FFHCLRP3.5MOVA,P3ANLA,#0FHXRLA,#0FHJZSW2LCALLDELAY10MSJZSW2MOVA,P3ANLA,#0FHCJNEA,#0EH,K5MOVCOUNT,#1LJMPDKK5:CJNEA,#0DH,K6MOVCOUNT,#5LJMPDKK6:CJNEA,#0BH,K7MOVCOUNT,#9LJMPDKK7:CJNEA,#07H,K8MOVCOUNT,#13K8:NOPLJMPDKSW2:MOVP3,#0FFHCLRP3.6MOVA,P3ANLA,#0FHXRLA,#0FHJZSW3LCALLDELAY10MSJZSW3MOVA,P3ANLA,#0FHCJNEA,#0EH,K9MOVCOUNT,#2LJMPDKK9:CJNEA,#0DH,KAMOVCOUNT,#6LJMPDKKA:CJNEA,#0BH,KBMOVCOUNT,#10LJMPDKKB:CJNEA,#07H,KCMOVCOUNT,#14KC:NOPLJMPDKSW3:MOVP3,#0FFHCLRP3.7MOVA,P3ANLA,#0FHXRLA,#0FHJZSW4LCALLDELAY10MSJZSW4MOVA,P3ANLA,#0FHCJNEA,#0EH,KDMOVCOUNT,#3LJMPDKKD:CJNEA,#0DH,KEMOVCOUNT,#7LJMPDKKE:CJNEA,#0BH,KFMOVCOUNT,#11LJMPDKKF:CJNEA,#07H,KGMOVCOUNT,#15KG:NOPLJMPDKSW4:LJMPPANDUANDK:RET;;;;;;;;;;显示程序;;;;;;;;;;XIANSHI:MOVA,COUNTMOVDPTR,#TABLEMOVCA,@A+DPTRMOVP0,ALCALLDELAYSK:MOVA,P3ANLA,#0FHXRLA,#0FHJNZSKRET;;;;;;;;;;10ms延时程序;;;;;;;;;;DELAY10MS:MOVR6,#20D1:MOVR7,#248DJNZR7,$DJNZR6,D1RET;;;;;;;;;;200ms延时程序;;;;;;;;;;DELAY:MOVR5,#20LOOP:LCALLDELAY10MSDJNZR5,LOOPRET;;;;;;;;;;共阴码表;;;;;;;;;;TABLE:DB3FH,06H,5BH,4FH,66H,6DH,7DH,07HDB7FH,6FH,77H,7CH,39H,5EH,79H,71H;;;;;;;;;;结束标志;;;;;;;;;;END7、C语言源程序#includeunsignedcharcodetable[]={0x3f,0x66,0x7f,0x39,0x06,0x6d,0x6f,0x5e,0x5b,0x7d,0x77,0x79,0x4f,0x07,0x7c,0x71};voidmain(void){unsignedchari,j,k,key;while(1){P3=0xff;//给P3口置1//P3_4=0;//给P3.4这条线送入0//i=P3;i=i&0x0f;//屏蔽低四位//if(i!=0x0f)//看是否有按键按下//{for(j=50;j0;j--)//延时//for(k=200;k0;k--);if(i!=0x0f)//再次判断按键是否按下//{switch(i)//看是和P3.4相连的四个按键中的哪个//{case0x0e:key=0;break;case0x0d:key=1;break;case0x0b:key=2;break;case0x07:key=3;break;}P0=table[key];//送数到P0口显示//}}P3=0xff;P3_5=0;//读P3.5这条线//i=P3;i=i&0x0f;//屏蔽P3口的低四位//if(i!=0x0f)//读P3.5这条线上看是否有按键按下//{for(j=50;j0;j--)//延时//for(k=200;k0;k--);i=P3;//再看是否有按键真的按下//i=i&0x0f;if(i!=0x0f){switch(i)//如果有,显示相应的按键//{case0x0e:key=4;break;case0x0d:key=5;break;case0x0b:key=6;break;case0x07:key=7;break;}P0=table[key];//送入P0口显示//}}P3=0xff;P3_6=0;//读P3.6这条线上是否有按键按下//i=P3;i=i&0x0f;if(i!=0x0f){for(j=50;j0;j--)for(k=200;k0;k--);i=P3;i=i&0x0f;if(i!=0x0f){switch(i){case0x0e:key=8;break;case0x0d:key=9;break;case0x0b:key=10;break;case0x07:key=11;break;}P0=table[key];}}P3=0xff;P3_7=0;//读P3.7这条线上是否有按键按下//i=P3;i=i&0x0f;if(i!=0x0f){for(j=50;j0;j--)for(k=200;k0;k--);i=P3;i=i&0x0f;if(i!=0x0f){switch(i){case0x0e:key=12;break;case0x0d:key=13;break;case0x0b:key=14;break;case0x07:key=15;break;}P0=table[key];}}}}8、注意事项在硬件电路中,要把8联拨动拨码开关JP2拨下,把8联拨动拨码开关JP3拨上去。
本文标题:47单片机4×4矩阵键盘设计方案
链接地址:https://www.777doc.com/doc-4608112 .html