14单片机 44矩阵式键盘识别技术实验.docx |
您所在的位置:网站首页 › rk键盘按键图 › 14单片机 44矩阵式键盘识别技术实验.docx |
14单片机 44矩阵式键盘识别技术实验.docx 《14单片机 44矩阵式键盘识别技术实验.docx》由会员分享,可在线阅读,更多相关《14单片机 44矩阵式键盘识别技术实验.docx(14页珍藏版)》请在冰豆网上搜索。 14单片机44矩阵式键盘识别技术实验 14. 4×4矩阵式键盘识别技术 1.实验任务如图4.14.2所示,用AT89S51的并行口P1接4×4矩阵键盘,以P1.0-P1.3作输入线,以P1.4-P1.7作输出线;在数码管上显示每个按键的“0-F”序号。 对应的按键的序号排列如图4.14.1所示3.系统板上硬件连线 (1. 把“单片机系统“区域中的P3.0-P3.7端口用8芯排线连接到“4X4行列式键盘”区域中的C1-C4 R1-R4端口上; (2. 把“单片机系统”区域中的P0.0/AD0-P0.7/AD7端口用8芯排线连接到“四路静态数码显示模块”区域中的任一个a-h端口上;要求: P0.0/AD0对应着a,P0.1/AD1对应着b,……,P0.7/AD7对应着h。 4. 程序设计内容 (1. 4×4矩阵键盘识别处理 (2. 每个按键有它的行值和列值 ,行值和列值的组合就是识别这个按键的编码。 矩阵的行线和列线分别通过两并行接口和CPU通信。 每个按键的状态同样需变成数字量“0”和“1”,开关的一端(列线)通过电阻接VCC,而接地是通过程序输出数字“0”实现的。 键盘处理程序的任务是: 确定有无键按下,判断哪一个键按下,键的功能是什么;还要消除按键在闭合或断开时的抖动。 两个并行口中,一个输出扫描码,使按键逐行动态接地,另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软件查表,查出该键的功能。 5.程序框图 图4.14.3 6.汇编源程序 KEYBUFEQU30H ORG00H START: MOVKEYBUF,#2 WAIT: MOVP3,#0FFH CLRP3.4 MOVA,P3 ANLA,#0FH XRLA,#0FH JZNOKEY1 LCALLDELY10MS MOVA,P3 ANLA,#0FH XRLA,#0FH JZNOKEY1 MOVA,P3 ANLA,#0FH CJNEA,#0EH,NK1 MOVKEYBUF,#0 LJMPDK1 NK1: CJNEA,#0DH,NK2 MOVKEYBUF,#1 LJMPDK1 NK2: CJNEA,#0BH,NK3 MOVKEYBUF,#2 LJMPDK1 NK3: CJNEA,#07H,NK4 MOVKEYBUF,#3 LJMPDK1 NK4: NOP DK1: MOVA,KEYBUF MOVDPTR,#TABLE MOVCA,@A+DPTR MOVP0,A
DK1A: MOVA,P3 ANLA,#0FH XRLA,#0FH JNZDK1A NOKEY1: MOVP3,#0FFH CLRP3.5 MOVA,P3 ANLA,#0FH XRLA,#0FH JZNOKEY2 LCALLDELY10MS MOVA,P3 ANLA,#0FH XRLA,#0FH JZNOKEY2 MOVA,P3 ANLA,#0FH CJNEA,#0EH,NK5 MOVKEYBUF,#4 LJMPDK2 NK5: CJNEA,#0DH,NK6 MOVKEYBUF,#5 LJMPDK2 NK6: CJNEA,#0BH,NK7 MOVKEYBUF,#6 LJMPDK2 NK7: CJNEA,#07H,NK8 MOVKEYBUF,#7 LJMPDK2 NK8: NOP DK2: MOVA,KEYBUF MOVDPTR,#TABLE MOVCA,@A+DPTR MOVP0,A
DK2A: MOVA,P3 ANLA,#0FH XRLA,#0FH JNZDK2A NOKEY2: MOVP3,#0FFH CLRP3.6 MOVA,P3 ANLA,#0FH XRLA,#0FH JZNOKEY3 LCALLDELY10MS MOVA,P3 ANLA,#0FH XRLA,#0FH JZNOKEY3 MOVA,P3 ANLA,#0FH CJNEA,#0EH,NK9 MOVKEYBUF,#8 LJMPDK3 NK9: CJNEA,#0DH,NK10 MOVKEYBUF,#9 LJMPDK3 NK10: CJNEA,#0BH,NK11 MOVKEYBUF,#10 LJMPDK3 NK11: CJNEA,#07H,NK12 MOVKEYBUF,#11 LJMPDK3 NK12: NOP DK3: MOVA,KEYBUF MOVDPTR,#TABLE MOVCA,@A+DPTR MOVP0,A
DK3A: MOVA,P3 ANLA,#0FH XRLA,#0FH JNZDK3A NOKEY3: MOVP3,#0FFH CLRP3.7 MOVA,P3 ANLA,#0FH XRLA,#0FH JZNOKEY4 LCALLDELY10MS MOVA,P3 ANLA,#0FH XRLA,#0FH JZNOKEY4 MOVA,P3 ANLA,#0FH CJNEA,#0EH,NK13 MOVKEYBUF,#12 LJMPDK4 NK13: CJNEA,#0DH,NK14 MOVKEYBUF,#13 LJMPDK4 NK14: CJNEA,#0BH,NK15 MOVKEYBUF,#14 LJMPDK4 NK15: CJNEA,#07H,NK16 MOVKEYBUF,#15 LJMPDK4 NK16: NOP DK4: MOVA,KEYBUF MOVDPTR,#TABLE MOVCA,@A+DPTR MOVP0,A
DK4A: MOVA,P3 ANLA,#0FH XRLA,#0FH JNZDK4A NOKEY4: LJMPWAIT DELY10MS: 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 7.C语言源程序 #include unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; unsignedchartemp; unsignedcharkey; unsignedchari,j;
voidmain(void) { while (1) { P3=0xff; P3_4=0; temp=P3; temp=temp&0x0f; if(temp! =0x0f) { for(i=50;i>0;i--) for(j=200;j>0;j--); temp=P3; temp=temp&0x0f; if(temp! =0x0f) { temp=P3; temp=temp&0x0f; switch(temp) { case0x0e: key=7; break; case0x0d: key=8; break; case0x0b: key=9; break; case0x07: key=10; break; } temp=P3; P1_0=~P1_0; P0=table[key]; temp=temp&0x0f; while(temp! =0x0f) { temp=P3; temp=temp&0x0f; } } }
P3=0xff; P3_5=0; temp=P3; temp=temp&0x0f; if(temp! =0x0f) { for(i=50;i>0;i--) for(j=200;j>0;j--); temp=P3; temp=temp&0x0f; if(temp! =0x0f) { temp=P3; temp=temp&0x0f; switch(temp) { case0x0e: key=4; break; case0x0d: key=5; break; case0x0b: key=6; break; case0x07: key=11; break; } temp=P3; P1_0=~P1_0; P0=table[key]; temp=temp&0x0f; while(temp! =0x0f) { temp=P3; temp=temp&0x0f; } } }
P3=0xff; P3_6=0; temp=P3; temp=temp&0x0f; if(temp! =0x0f) { for(i=50;i>0;i--) for(j=200;j>0;j--); temp=P3; temp=temp&0x0f; if(temp! =0x0f) { temp=P3; temp=temp&0x0f; switch(temp) { case0x0e: key=1; break; case0x0d: key=2; break; case0x0b: key=3; break; case0x07: key=12; break; } temp=P3; P1_0=~P1_0; P0=table[key]; temp=temp&0x0f; while(temp! =0x0f) { temp=P3; temp=temp&0x0f; } } }
P3=0xff; P3_7=0; temp=P3; temp=temp&0x0f; if(temp! =0x0f) { for(i=50;i>0;i--) for(j=200;j>0;j--); temp=P3; temp=temp&0x0f; if(temp! =0x0f) { temp=P3; temp=temp&0x0f; switch(temp) { case0x0e: key=0; break; case0x0d: key=13; break; case0x0b: key=14; break; case0x07: key=15; break; } temp=P3; P1_0=~P1_0; P0=table[key]; temp=temp&0x0f; while(temp! =0x0f) { temp=P3; temp=temp&0x0f; } } } } } |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |