矩阵键盘的设计文档格式.docx
《矩阵键盘的设计文档格式.docx》由会员分享,可在线阅读,更多相关《矩阵键盘的设计文档格式.docx(16页珍藏版)》请在冰豆网上搜索。
3.1程序系统3
3.2判别是否有键按下程序4
3.3识别哪个键按下程序6
3.4显示程序7
3.5延时程序8
4仿真结果分析9
5汇编程序12
6课程设计总结与体会16
参考文献资料
1问题描述
(1)设计一个4×
4矩阵式键盘,以实现矩阵式键盘的程序识别。
(2)用单片机的并行口P1连接4×
4矩阵键盘,并以单片机的P1.0-P1.3各管脚作输入线,以单片机的P1.4-P1.7各管脚作输出线,在数码管上显示每个按键“0-F”的序号。
键盘中对应按键的序号排列如下图
图1.1键盘序号图
2设计原理
2.1电路硬件说明
(1)在“单片机系统”区域中,把单片机的P1.0-P1.7端口通过8联拨动拨码开关JP3连接到“4×
4行列式键盘”区域中的M1-M4,N1-N4端口上。
即将P1口作为整个系统的输入接口电路。
(2)在“单片机系统”区域中,把单片机的P0.0-P0.6端口通过上拉电阻连接到“静态数码显示模块”区域中的任何一个a-g端口上;
作为整个系统的并且P0.0对应着a,P0.1对应着b,……,P0.6对应着g。
(3)此实验采用的是共阴极LED显示块,只有当a-g端口输入高电平时才有效,即显示块中的对应的发光二极管才发光,低电平时不显示,通过a-g端口的不同输入使显示器显示不同的字符。
(4)系统中的上拉电阻RP1和RP2是限流电阻,起到限流的作用,阻值一般在100-300欧姆之间。
2.2矩阵式键盘的工作原理
(1)CPU先使行线平P1.4线为低,其余行线P1.5-P1.7为高,即P1.4所在的行线为“0”状态,其余行为“1’状态。
(2)CPU读入输入缓冲器的状态,以确定哪条列线为“0”状态,此时,若P1.0为“0”状态,则为0键按下;
若P1.1为“0”状态,则为“1”键按下;
以此类推。
(3)若输入缓冲器的状态全部为“1”状态,则CPU继续使使行线P1.5为低,其余行线为高。
再读入输入缓冲器的状态,以确定那条列线为“0”状态,从而判断是哪个键压下。
(4)判断出哪个键压下之后,程序转入相应的键处理程序
2.3程序设计内容
(1)4×
4矩阵键盘识别处理。
(2)每个按键都有它的行值和列值,行值和列值的组合就是识别这个按键的编码。
矩阵的行线和列线分别通过两并行接口和CPU通信。
键盘的一端(列线)通过电阻接VCC,而接地是通过程序输出数字“0”实现的。
键盘处理程序的任务是:
确定有无键按下,判断哪一个键按下,键的功能是什么?
还要消除按键在闭合或断开时的抖动。
两个并行口中,一个输出扫描码,使按键逐行动态接地;
另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软件查表,查出该键的功能。
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”状态,以此类推。
如读入输入缓冲器的状态不全为“1”,确定哪一根列线为“0”状态,当某个键的行线和列线都为“0”状态时,表明该键按下。
最后通过显示程序将该键的序号显示出来。
图2.1硬件电路图
3程序说明及其流程图
3.1系统程序
(1)说明:
该图是一个总的系统框图,首先CPU读入初始状态,CPU先让某一行线为低,其他行线为高,同时列线都为高,通过对按键进行扫描,也就是通过按键后判断列线是否为0来判断是否有键按下,有的话就继续执行程序识别判断是哪个键按下,然后通过P0口查询显示该数符,如果没有按键按下就返回程序继续扫描直到有键按下时才停止扫描。
(2)流程图
3.2判别是否有键按下程序
该图表示的是将P1口置初值为FFH,MOVP1,#0FFH,然后CLRP1.4,通过读入输入缓冲器的状态,通过屏蔽A的高四位后和0FH进行异或来判断赋值为0的这一行是否有键按下,如无键按下,重置P1为FFH,CLRP1.5,如仍无键按下,就依次CLRP1.6、CLRP1.7。
直到有键按下,为去抖动,就延时10ms,再次确认是否真的有键按下,如果是的话就根据当前状态识别按键。
如一次全部的扫描仍没有键按下,就回到开始处继续扫描。
3.3识别哪个键按下程序
本图是以第2行有键按下时判哪一个键按下的流程图为例的。
当将第二行的行线置为0,其余行线置于1的情况下,读入输入缓冲器的状态,不为全0,则说明该行有键按下,此时就可以将A的值送给P1,屏蔽A的高四位,依次与OEH、0BH、0DH、07H进行比较来确定按下的键号是4、5、6还是7,然后送至P0口显示。
执行完显示程序后再转向程序的开始处
3.4显示程序
判断有键按下并且识别出是哪个键按下时,接着就通过显示程序将其通过数码管显示出来。
该实验用的是查表程序来实现相应键的显示的。
将定义字伪指令地址赋给DPTR,通过指令MOVCA,@A+DPTR查到对应字符的显示码送给A,再由A送给P0,最后由显示器显示出来。
显示器字形与字段的对应关系如下:
表3.1显示器字形与字段对应关系表
3.5延时程序
为防止抖动,使键盘识别失误,于是我们运用一个10ms的延时程序使之产生10ms的定时,对键盘再一次进行扫描,检查键盘的状态,当两次扫描到键位上有键按下时CPU才做处理。
此延时程序是通过双重循环结构实现延时的。
其汇编程序如下:
DELAY10MS:
MOVR6,#10
D1:
MOVR7,#248
DJNZR7,$
DJNZR6,D1
RET
其延时的时间计算过程为:
设其晶振频率为6MHZ,则其机器周期为2us,又上述指令均为双周期指令,因而,T=4+(4+10×
4)×
248+4=10920us≈10ms
4仿真结果及分析
(1)在proteus中设计好实验电路后,然后在proteus编程环境中进行程序设计和编译,生成HEX文件并加载HEX文件,点启动,运行仿真。
由于开始时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行没有键按下,转入NOKEY1子程序中,同理,可以得知第2行和第3行也没有键按下。
因而,P0口没有被重新赋值,保持为00H不变,又显示器是共阴极的,此时P0.0-P1.6口均为“0”,即“a-g”段均不显示,从而显示器不显示,并转向程序的开始继续循环扫描键盘,直到有键按下为止。
观察到显示器中的显示现象如下:
图4.1
(2)当按下第六个键时,开始时P0口的值被赋为00H,P1口的值为FFH,将P1.4口置0,再将P1口的值送A,屏蔽高4位,与0F相异或后,A的值变为0,即第0行没有键按下,转入NOKEY0子程序中,重新赋值P1口的值为FFH,将P1.5口置0后送A,屏蔽高4位,与0FH相异或后,由于第一行有键按下,此时,A的值不为1,为了防止抖动,进入10ms的定时程序后再重新确认一次,是否真的有键按下,当重新确认后,A的值仍不为1,说明确实有键按下,然后将P1的值送A,屏蔽高4位,将A与0EH比较,判断其是否等于0EH相等,由于此时的A等于0DH,即两者不相等,程序转向NEXT5,与0DH比较,相等把5送给key,进入显示程序,将key值送给A,通过查表程序的查表参数查找其对应值06H并送给P0,通过P0口控制显示器,此时P0口的值为01101101B,对应着显示器的a、c、d、f、g段显示,其余段不显示,从而显示为“5”。
接着又转向程序的最开始处继续进行扫描。
图4.2
同理,当按下第十个键时,
图4.3
以此类推,当按下最后一个键时,观察到显示器中显示的数码为“F”。
总之,当按下相应的键时,显示器上对应的显示数符“0-F”,从而实现了对键盘的识别。
5汇编程序
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
JZNOKEY0;
判哪一个键按下
CJNEA,#0EH,NEXT1
MOVKEY,#0
LJMPOK;
转向显示程序
NEXT1:
CJNEA,#0DH,NEXT2
MOVKEY,#1
LJMPOK
NEXT2:
CJNEA,#0BH,NEXT3
MOVKEY,#2
NEXT3:
CJNEA,#07H,NOKEY0
MOVKEY,#3
NOKEY0:
MOVP1,#0FFH;
判第1行是否有键按下
CLRP1.5;
将P1.5清零
ANLA,#0FH;
JZNOKEY1;
A为0,转向NOKEY1
LCALLDELAY10MS;
延时,去抖动
JZNOKEY1;
CJNEA,#0EH,NEXT5
MOVKEY,#4
NEXT5:
CJNEA,#0DH,NEXT6
MOVKEY,#5
NEXT6:
CJNEA,#0BH,NEXT7
MOVKEY,#6
NEXT7:
CJNEA,#07,NOKEY1
MOVKEY,#7
NOKEY1:
MOVP1,#0FFH;
判第2行是否有键按下
CLRP1.6;
将P1.6清零
JZNOKEY2;
A为0,转向NOKEY2
CJNEA,#0EH,NEXT9
MOVKEY,#8
SJMPOK
NEXT9:
CJNEA,#0DH,NEXT10
MOVKEY,#9
NEXT10:
CJNEA,#0BH,NEXT11
MOVKEY,#10
NEXT11:
CJNEA,#07,NOKEY2
MOVKEY,#11
NOKEY2:
CLRP1.7;
MOVA,#P1
JZNEXT16;
A为0,转向NEXT16
CJNEA,#0EH,NEXT13
MOVKEY,#12
NEXT13:
CJNEA,#0DH,NEXT14
MOVKEY,#13
NEXT14:
CJNEA,#0BH,NEXT15
MOVKEY,#14
NEXT15:
CJNEA,#07H,NEXT16
MOVKEY,#15
NEXT16:
LJMPJIXU
OK:
MOVA,KEY;
查表显示
MOVDPTR,#TABLE
MOVCA,@A+DPTR
MOVP0,A
MOVR6,#10;
延时
RET
TABLE:
DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H
DB7FH,6FH,77H,7CH,39H,5EH,79H,71H
END
6课程设计的总结与体会
回顾起此次课程设计,感觉受益匪浅,从拿到题目到完成整个编程,从理论到实践,学到很多很多的课堂理论中没学到过的东西,不仅对键盘的识别技术这一章节的知识点有了深刻的认识,而且对这学期开设的单片机这门课程有了更全面的了解,尤其是在学习使用proteus软件片编程和仿真时收获良多。
通过这次单片机课程设计,还使我懂得了实践的重要性。
同时在程序调试的过程中提高自己的发现问题、解决问题、实际动手和独立思考的能力。
这次课程设计能顺利的完成,除了我们的努力外,当然也离不开指导老师申老师的辛勤指导,致使我在设计的过程中学到了很多实用性的知识。
同时,对给过我帮助的所有同学和各位指导老师表示忠心的感谢!
参考文献资料:
[1]张俊谟.单片机中级教程[M].北京:
北京航空航天大学出版,2006
[2].何立民编著.《MCS-51单片机应用系统设计系统配置与接口技术》.