键盘显示单片机实习报告.docx
《键盘显示单片机实习报告.docx》由会员分享,可在线阅读,更多相关《键盘显示单片机实习报告.docx(30页珍藏版)》请在冰点文库上搜索。
键盘显示单片机实习报告
电子信息工程专业
单片机课程设计报告
题目键盘显示模块
姓名
学号
班级
指导教师
2010年6月30日
课程设计任务书
课程设计题目键盘显示模块
课程设计起止日期6月13日至6月30日
实习地点实验楼106
课程设计内容与要求(包括:
设计任务及要求、设计原理、所需仪器设备、验收标准)
(1)设计任务及要求
及格:
键盘能识别并能显示键号,即按不同的键后能在对应的位置显示按键的值。
中:
能实现按键后能从左到右移动显示。
良:
应用单片机定时器完成时钟设计,并能动态循环显示时、分、秒。
优:
在良的基础之上,能够对时间进行校准。
(2)设计原理
利用单片机扫描键盘来确定行列式2*2键盘是否有键按下,若有键按下则判断是哪个键按下然后在数码管相应位置输出。
(3)所需仪器设备
单片机最小系统pc机、伟福仿真器、电源、导线若干
指导教师田悦新
2010年6月30日
1、设计原理与技术方法:
包括:
电路工作分析原理与原理图、元器件选择、电路调试方法与结果说明;
软件设计说明书与流程图、软件源程序代码、软件调试方法与运行结果说明。
1.电路原理图见附录
2.电路工作分析
1)键盘工作电路:
键盘为2*2的键盘,与单片机的p1.3-p1.6口连接。
工作时先判断有无键按下,检查行输出是否由高电平变成低电平。
然后再判断是哪个键按下。
最后在相应的位置输出对应的信息。
2)数码管显示电路:
数码管有四个,前面和一个373锁存器相连,用来锁存显示信息。
373通过一个138三八译码器连接在单片机的p2口,其地址可以算出为6000H,数码管COM1,COM2,COM3,COM4,也通过138译码器和单片机的p2口相连,地址分别为8000H,0A000H,0C000H,0E000H。
数码管显示相应键按下的信息,单片机读入键盘的状态,锁存于373中,然后输出在数码管中。
数码管显示时钟,单片机内部的定时器来完成时钟设计在数码管中显示出来。
3.元器件选择、电路调试方法与结果说明
1)元器选择:
74ls138、74ls373、74ls138、74ls04、74ls02、74ls08、数码管、2*2键盘、晶振、电阻、电容、二极管等。
2)电路调试与结果说明:
首先焊接电路,然后再接好电源,如果电源指示灯亮,其他灯不亮且芯片没有太烫的说明电路板焊接良好,且芯片连接正确。
4.软件设计说明书与流程图
1)软件设计说明书:
及格和中的软件设计:
第一步判断有无键按下,判断有键按下的依据时键盘行线电平是否由高变底了,判断出有键按下时要调用延时程序来排除键盘抖动的干扰。
第二步判断是哪个键按下,判断哪个键按下时是先置高其中一条列线再拉底另一条列线,这样当行列线电平都是底电平是则选中对应的键。
第三步,在数码管上相应的位置显示,将键盘按下键的键号放到锁存器中存放,再送如数码管中显示。
良和优的的软件设计:
先利用单片机内部的定时器来完成时钟设计,具体软件设计见流程图,然后在数码管上滚动显示时钟。
最后利用键盘来校准时钟。
2)流程图及软件源程序代码
及格的程序流程图为图1
课程设计报告
图1及格的程序流程图
及格的程序:
ORG0000H
LJMPKEY1
ORG0100H
KEY1:
ACALLKS1;判断是否有键按下子程
CJNEA,#18H,LK1;A与18H不相等时有键按下,跳判键子程序
ACALLLKP;调用显示程序,延时
AJMPKEY1;再判断
LK1:
ACALLDELAY;可能有键按下,延迟10ms软件去抖
ACALLKS1;调用判有无键闭合子程序
CJNEA,#18H,LK2;经去抖动,判断确实有键闭合,跳LK2去处理
AJMPKEY1;抖动引起,跳KEY1
LK2:
CLRP1.5;先判断第一列有无键按下
SETBP1.6
MOVA,P1
JBACC.3,LINE1;P1.3为高电平,转LONE1去处理
MOVR0,#01H;一号键被按下,R0置1
AJMPLK3
LINE1:
JBACC.4,NEXT;P1.4为高电平,转NEXT去处理
MOVR0,#03H;三号被按下,R0置3
AJMPLK3
NEXT:
SETBP1.5;第一列无键按下,判断第二列
CLRP1.6
MOVA,P1
JBACC.3,LINE2
MOVR0,#02H;二号被按下,R0置2
AJMPLK3
LINE2:
MOVR0,#04H;四号被按下,R0置4
LK3:
ACALLLKP
ACALLKS1
CJNEA,#18H,LK3;判键释放否,未释放,则循环
AJMPKEY1
LKP:
MOVA,R0
MOVDPTR,#TAB
MOVCA,@A+DPTR;根据显示数据来查表取段码
MOVDPTR,#6000H
MOVX@DPTR,A
CJNER0,#01H,J2;R0不为1,即不是一号键按下时,转J2处理
MOVDPTR,#8000H
SJMPXS
J2:
CJNER0,#02H,J3;R0不为2,即不是二号键按下时,转J3处理
LED2:
MOVDPTR,#0A000H
SJMPXS
J3:
CJNER0,#03H,J4;R0不为3,即不是三号键按下时,转J4处理
LED3:
MOVDPTR,#0C000H
SJMPXS
J4:
CJNER0,#04H,KEY1;R0不为4,即没有确定键按下时,转KEY1重新扫描
MOVDPTR,#0E000H
XS:
MOVX@DPTR,A;段码送入段地址
RET
KS1:
CLRP1.5;判断有无键按下子程序
CLRP1.6
MOVA,P1
ANLA,#18H
RET
TAB:
DB0C0H,0F9H,0A4H,0B0H,99H,92H
DB82H,0F8H,80H,90H,88H,83H,0C6H
DB0A1H,86H,8EH,0FFH
DELAY:
MOVR5,#14H;延迟10ms子程序
LOOP2:
MOVR6,#0F9H
LOOP1:
DJNZR6,LOOP1
DJNZR5,LOOP2
RET
END
中的程序流程图为图2:
N
N
Y
N
Y
图2中的程序流程图
中的程序:
ORG0000H
LJMPMAIN
ORG1000H
MAIN:
MOV63H,#10H
MOV62H,#10H
MOV61H,#10H
MOV60H,#10H;初始不显示键号
KEY:
ACALLKS1;调用判有无键闭合子程序
CJNEA,#18H,LK1;有键闭合,跳LK1
NI:
ACALLDIR;无键闭合,调用显示子程序后,跳KEY
AJMPKEY
LK1:
ACALLDL12ms;可能有键闭合,延迟12ms,软件去抖
ACALLKS1;调用判有无键闭合子程序
CJNEA,#18H,LK2;经去抖动,判键确实闭合,跳LK2去处理
AJMPKEY;抖动引起,跳KEY
LK2:
CLRP1.5;P1.5代表第一列,有键按下
SETBP1.6;P1.6代表第二列,无键按下
MOVA,P1;读行状态
JBACC.3,LONE;第一行为高,无键闭合,跳LONE,转判第二行
MOVR5,#01H;第一个键闭合,键号1给R5
AJMPLK3;跳LK3
LONE:
JBACC.4,NEXT;第二行为高,无键闭合,跳NEXT,转判第二列
MOVR5,#03H;第三个键闭合,键号3给R5
AJMPLK3;跳LK3
NEXT:
SETBP1.5;P1.5代表第二列,无键按下
CLRP1.6;P1.6代表第一列,有键按下
MOVA,P1;读行状态
JBACC.3,LONE1;第一行为高,无键闭合,跳LONE1,转判第二行
MOVR5,#02H;第二个键闭合,键号2给R5
AJMPLK3;跳LK3
LONE1:
MOVR5,#04H;第四个键闭合,键号4给R5
LK3:
ACALLYIDONG;调用移动显示子程序,显示按键的键号
LKP:
ACALLDIR;调用显示子程序,显示按键的键号
ACALLKS1;调用判有无键闭合子程序
CJNEA,#18H,LKP;判键释放否,未释放,则循环
AJMPKEY;重新开始判键
KS1:
CLRP1.5
CLRP1.6
MOVA,P1
ANLA,#18H
RET
YIDONG:
MOV60H,61H;移动显示子程序,从左向右移动
MOV61H,62H
MOV62H,63H
MOV63H,R5
DIR:
MOVA,63H;最左边数码管
MOVDPTR,#TAB
MOVCA,@A+DPTR;查表
MOVDPTR,#6000H;段控制口
MOVX@DPTR,A
MOVDPTR,#8000H;位控制口
MOVX@DPTR,A
MOVA,62H
CJNEA,#10H,DIR1;只按下一个键,返回,只有一个管显示
AJMPFANHUI
DIR1:
MOVA,62H;从左第二个数码管
MOVDPTR,#TAB
MOVCA,@A+DPTR
MOVDPTR,#6000H
MOVX@DPTR,A
MOVDPTR,#0A000H
MOVX@DPTR,A
MOVA,61H
CJNEA,#10H,DIR2;只按下两个键,返回,只有两个管显示
AJMPFANHUI
DIR2:
MOVA,61H;从左第三个数码管
MOVDPTR,#TAB
MOVCA,@A+DPTR
MOVDPTR,#6000H
MOVX@DPTR,A
MOVDPTR,#0C000H
MOVX@DPTR,A
MOVA,60H
CJNEA,#10H,DIR3;超过四个键按下,全部显示
AJMPFANHUI;只按下三个键,返回,只有三个管显示
DIR3:
MOVA,60H;从左第四个数码管
MOVDPTR,#TAB
MOVCA,@A+DPTR
MOVDPTR,#6000H
MOVX@DPTR,A
MOVDPTR,#0E000H
MOVX@DPTR,A
FANHUI:
RET
DL12ms:
MOVR7,#0CH;延迟12ms子程序
DL:
MOVR6,#0FFH
DL6:
DJNZR6,DL6
DJNZR7,DL
RET
TAB:
DB0C0H,0F9H,0A4H,0B0H,99H,92H;段码表
DB82H,0F8H,80H,90H,88H,83H
DB0C6H,0A1H,86H,8EH,0FFH
END
良的程序流程图
为图3:
图3良的程序流程图
良的程序:
ORG0000H
LJMPMAIN
ORG000BH
LJMPITOP
ORG1000H
MAIN:
MOVSP,#80H
MOV71H,#00H
MOV72H,#00H
MOV73H,#00H
MOV74H,#00H
MOV60H,#00H
MOV61H,#00H
MOV50H,#00H
MOV51H,#00H
MOV30H,#00H
MOV31H,#00H
MOVR0,#00H
MOVR1,#00H
MOVTMOD,#01H;设T0工作方式1
MOV20H,#0AH;装入中断次数
CLRA
MOV40H,A;时单元清零
MOV41H,A;分单元清零
MOV42H,A;秒单元清零
SETBET0;允许T0申请中断
SETBEA;CPU开中断
MOVTH0,#3CH;给T0装入计数初值
MOVTL0,#0B0H
SETBTR0;启动T0
HERE:
ACALLDIR;调用显示子程序
NEXT0:
CJNER1,#00H,NEXT1;R1不等于0转NEXT1处理
MOV74H,51H;分的十位
MOV73H,#11H;"-"
MOV72H,30H;时的个位
MOV71H,31H;时的十位
AJMPPD
NEXT1:
CJNER1,#01H,NEXT2;R1不等于1转NEXT2处理
MOV74H,50H;分的个位
MOV73H,51H;分的十位
MOV72H,#11H;"-"
MOV71H,30H;时的个位
AJMPPD
NEXT2:
CJNER1,#02H,NEXT3;R1不等于2转NEXT3处理
MOV74H,#11H;"-"
MOV73H,50H;分的个位
MOV72H,51H;时的个位
MOV71H,#11H;"-"
AJMPPD
NEXT3:
CJNER1,#03H,NEXT4;R1不等于3转NEXT4处理
MOV74H,61H;秒的十位
MOV73H,#11H;"-"
MOV72H,50H;分的个位
MOV71H,51H;分的十位
AJMPPD
NEXT4:
MOVR1,#0FFH
MOV74H,60H;秒的个位
MOV73H,61H;秒的十位
MOV72H,#11H;"-"
MOV71H,50H;时的十位
AJMPPD
PD:
CJNER0,#03H,HER
MOVR0,#00H
INCR1
HER:
AJMPHERE
ITOP:
MOVTH0,#3CH;重新装入初值
MOVTL0,#0B0H
DJNZ20H,TURE;一秒未到返回
MOV20H,#0AH;重置中断次数
MOVA,#01H;秒单元增一
INCR0
ADDA,42H
DAA;秒单元十进制调整
MOV42H,A;秒的BCD码保存秒单元
CJNEA,#60H,TURE;是否到60秒,未到则返回
MOV42H,#00H;计满60秒,秒单元清零
MOVA,#01H;分单元增一
ADDA,41H
DAA;分单元十进制调整
MOV41H,A;分的BCD码存回分单元
CJNEA,#60H,TURE;是否到60分,未到则返回
MOV41H,#00H;计满60分,分单元清零
MOVA,#01H;时单元增一
ADDA,40H
DAA;时单元十进制调整
MOV40H,A;时的BCD码存回分单元
CJNEA,#24H,TURE;是否到24时,未到则返回
MOV40H,#00H;计满24时,时单元清零
TURE:
RETI;中断返回
DIR:
MOVA,42H;"秒"的BCD码存入A
ANLA,#0FH;屏蔽A的高四位
MOV60H,A;秒单元的个位存入60H
MOVA,42H;"秒"的BCD码存入A
ANLA,#0F0H;屏蔽A的低四位
SWAPA
MOV61H,A;秒单元的十位存入61H
MOVA,41H;"分"的BCD码存入A
ANLA,#0FH;屏蔽A的高四位
MOV50H,A;分单元的个位存入50H
MOVA,41H;"分"的BCD码存入A
ANLA,#0F0H;屏蔽A的低四位
SWAPA
MOV51H,A;分单元的十位存入51H
MOVA,40H;"时"的BCD码存入A
ANLA,#0FH;屏蔽A的高四位
MOV30H,A;时单元的个位存入30H
MOVA,40H;"时"的BCD码存入A
ANLA,#0F0H;屏蔽A的低四位
SWAPA
MOV31H,A;时单元的十位存入31H
MOVA,74H
MOVDPTR,#TAB
MOVCA,@A+DPTR;查表
MOVDPTR,#6000H;段控制口,秒或分的个位在第四个数码管显示
MOVX@DPTR,A
MOVDPTR,#0E000H;位控制口
MOVX@DPTR,A
MOVA,73H
MOVDPTR,#TAB
MOVCA,@A+DPTR;查表
MOVDPTR,#6000H;段控制口,秒或分的十位在第三个数码管显示
MOVX@DPTR,A
MOVDPTR,#0C000H;位控制口
MOVX@DPTR,A
MOVA,72H
MOVDPTR,#TAB
MOVCA,@A+DPTR;查表
MOVDPTR,#6000H;段控制口,分或时的个位在第二个数码管显示
MOVX@DPTR,A
MOVDPTR,#0A000H;位控制口
MOVX@DPTR,A
MOVA,71H
MOVDPTR,#TAB
MOVCA,@A+DPTR;查表
MOVDPTR,#6000H;段控制口,分或时的十位在第一个数码管显示
MOVX@DPTR,A
MOVDPTR,#8000H;位控制口
MOVX@DPTR,A
RET
TAB:
DB0C0H,0F9H,0A4H,0B0H,99H,92H
DB82H,0F8H,80H,90H,88H,83H,0C6H
DB0A1H,86H,8EH,0FFH,0BFH
DELAY:
MOVR5,#14H;延迟10ms子程序
LOOP2:
MOVR6,#0F9H
LOOP1:
DJNZR6,LOOP1
DJNZR5,LOOP2
RET
END
优的程序流程图为图4
优的程序:
ORG0000H
LJMPMAIN
ORG000BH
LJMPITOP
ORG1000H
MAIN:
MOVSP,#80H
MOV71H,#00H
MOV72H,#00H
MOV73H,#00H
MOV74H,#00H
MOV60H,#00H
MOV61H,#00H
MOV50H,#00H
MOV51H,#00H
MOV30H,#00H
MOV31H,#00H
MOVR0,#00H
MOVR1,#00H
MOVR3,#0FFH
MOVTMOD,#01H;设T0工作方式1
MOV20H,#0AH;装入中断次数
CLRA
MOV40H,A;时单元清零
MOV41H,A;分单元清零
MOV42H,A;秒单元清零
SETBET0;允许T0申请中断
SETBEA;CPU开中断
MOVTH0,#3CH;给T0装入计数初值
MOVTL0,#0B0H
SETBTR0;启动T0
HERE:
ACALLDIR;调用显示子程序
KEY1:
ACALLKS1;调用判断是否有键按下子程序
CJNEA,#18H,LK1;A与18H不相等时有键按下,跳判键子程序
LJMPNEXT0;无键闭合,调用显示程序,延时
LK1:
ACALLDELAY;可能有键按下,延迟10ms软件去抖
ACALLKS1;调用判有无键闭合子程序
CJNEA,#18H,LK2;经去抖动,判断确实有键闭合,跳LK2去处理
LJMPNEXT0;抖动引起,跳NEXT0
LK2:
CLRP1.5;先判断第一列有无键按下
SETBP1.6
MOVA,P1
JBACC.3,LINE1;S2未按下,跳LINE1处理
INCR3
LK3:
CJNER3,#00H,KAI;R3不等于0时开中断
CLRTR0;R3等于0,关中断
XUN:
ACALLDIR
ACALLKS1
CJNEA,#18H,XUN;判断关中断的键是否释放
LINE1:
JBTR0,NEXT0
CLRP1.5;先判断第一列有无键按下
SETBP1.6
MOVA,P1
JBACC.4,NEXT;P1.4为高电平,转NEXT去处理
MOVR1,#02H;显示对应数码管分的位置
MOVR0,#00H
MOVA,#01H;S3键按下,分单元增一
ADDA,41H
DAA;分单元十进制调整
MOV41H,A;分的BCD码存回分单元
CJNEA,#60H,LK4;是否到60分,未到则返回
MOV41H,#00H;计满60分,分单元清零
LJMPLK4
NEXT:
JBTR0,NEXT0
SETBP1.5;第一列无键按下,判断第二列
CLRP1.6
MOVA,P1
JBACC.3,LINE2
MOVR0,#00H
MOVR1,#00H;显示对应数码管时的位置
MOVA,#01H;时单元增一
ADDA,40H
DAA;时单元十进制调整
MOV40H,A;时的BCD码存回分单元
CJNEA,#24H,LK4;是否到24时,未到则返回
MOV40H,#00H;计满24时,时单元清零
LJMPLK4
LINE2:
JBTR0,NEXT0
JBACC.4,TT
MOVR0,#00H;显示对应数码管秒的位置
MOVR1,#04H
MOVA,#01H;秒单元增一
ADDA,42H
DAA;秒单元十进制调整
MOV42H,A;秒的BCD码保存秒单元
CJNEA,#60H,LK4;是否到60秒,未到则返回
MOV42H,#00H;计满60秒,秒单元清零
LJMPLK4
TT:
MOVR3,#0FEH
LJMPLK4
KAI:
SETBTR0;R3不等于0时,开中断
LK4:
ACALLDIR
ACALLKS1
CJNEA,#18H,LK4;判键释放否,未释放,则循环
NEXT0:
CJNER1,#00H,NEXT1;R1不等于0转NEXT1处理
MOV74H,51H;分的十位存在第四个数