数字电子时钟程序.docx
《数字电子时钟程序.docx》由会员分享,可在线阅读,更多相关《数字电子时钟程序.docx(20页珍藏版)》请在冰豆网上搜索。
数字电子时钟程序
附录:
程序
ORG0000H
AJMPMAIN
ORG0003H
RETI
ORG0013H
RETI
ORG000BH
AJMPINTT0
ORG001BH
AJMPINTT1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;主程序;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORG0030H
MAIN:
MOVSP,#50H
MOVR0,#60H;清60H-7AH共27个内存单元
MOVR7,#27
CLEARDISP:
MOV@R0,#00H
INCR0
DJNZR7,CLEARDISP
MOVR2,#100;定时1s用初值
MOV71H,#02H;小时初始显示12时
MOV70H,#01H
MOV20H,#00H;清20H(标志用)
MOVTMOD,#11H;设T0、T1为16位定时器
MOVTL0,#0F0H;10MS定时初值(T0计时用)
MOVTH0,#0D8H;10MS定时初值
MOVTL1,#0B0H;50MS定时初值(T1闪烁定时用)
MOVTH1,#3CH;50MS定时初值
SETBEA;总中断开放
SETBET0;允许T0中断
SETBTR0;开启T0定时器
START:
LCALLDISP;调用时间显示子程序
JNBP3.0,SETMM;位选键按下则跳到时间调整程序
JNBP3.2,SETMB;使用秒表功能则跳到秒表程序
AJMPSTART;返回start循环扫描
SETMM:
LJMPSETTIME
SETMB:
LJMPSETMBCX
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;T0中断服务程序时间秒加1/秒表加10MS;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INTT0:
PUSHACC;保护现场
PUSHPSW
MOVTH0,#0E0H;重装定时初值
MOVTL0,#0AH;
DJNZR2,RETT0;20次中断(1秒)未到转到判断是否在使用秒表功能
MOVR2,#100;20次中断到(1秒)重赋初值
INC75H;秒个位加1
MOVA,75H
CJNEA,#10,RETT0;秒个位小于10转到判断是否在使用秒表功能
MOV75H,#00;等于10秒个位计时单元清0
INC74H;秒十位加1
MOVA,74H
CJNEA,#06,RETT0;秒十位小于6转到判断是否在使用秒表功能
MOV74H,#00;等于6秒十位计时单元清0
INC73H;分个位加1
MOVA,73H
CJNEA,#10,RETT0;分个位小于10转到判断是否在使用秒表功能
MOV73H,#00;等于10分个位计时单元清0
INC72H;分十位加1
MOVA,72H
CJNEA,#06,RETT0;分十位小于6转到判断是否在使用秒表功能
MOV72H,#00;等于6分十位计时单元清0
INC71H;时个位加1
MOVA,70H
MOVB,#10
MULAB
ADDA,71H
CJNEA,#24,PROG1;小时小于24转到判断时个位是否小于10
MOV71H,#00;等于24时个位计时单元清0
AJMPPROG2;转到时十位加1
PROG1:
MOVA,71H
CJNEA,#10,RETT0;时个位小于10转到判断是否在使用秒表功能
MOV71H,#00;等于10分十位计时单元清0
PROG2:
INC70H;时十位加1
MOVA,70H
CJNEA,#03,RETT0;时十位小于3转到判断是否在使用秒表功能
MOV70H,#00;等于3时十位计时单元清0
RETT0:
JNB07H,RETT01;没使用秒表功能转RETT01(保护现场退出中断)
INC76H;0.01秒位加1
MOVA,76H
CJNEA,#10,RETT01;0.01秒位小于10转到RETT01(保护现场退出中断)
MOV76H,#00;等于10则0.01秒位计时单元清0
INC77H;0.1秒位加1
MOVA,77H
CJNEA,#10,RETT01;0.1秒位小于10转到RETT01
MOV77H,#00;等于10则0.1秒位计时单元清0
INC78H;1秒位加1
MOVA,78H
CJNEA,#10,RETT01;1秒位小于10转到RETT01
MOV78H,#00;等于10则1秒位计时单元清0
INC79H;10秒位加1
MOVA,79H
CJNEA,#10,RETT01;10秒位小于10转到RETT01
MOV79H,#00;等于10则10秒位计时单元清0
INC7AH;100秒位加1
MOVA,7AH
CJNEA,#10,RETT01;100秒位小于10转到RETT01
MOV7AH,#00;等于10则100秒位计时单元清0
RETT01:
POPPSW;恢复现场
POPACC
RETI;退出中断
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;T1中断服务程序闪动调时程序;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INTT1:
PUSHACC;中断现场保护
PUSHPSW;
MOVTL1,#0B0H;装T1定时初值
MOVTH1,#3CH;
DJNZR4,INTT1OUT;0.3秒未到退出中断(50MS中断6次)
MOVR4,#06H;重装0.3秒定时用初值
CPL06H;0.3秒定时到对闪烁标志取反
JB06H,FLASH1;06H位为1时显示单元"熄灭"
MOV70H,60H;06H位为0时正常显示
MOV71H,61H
MOV72H,62H
MOV73H,63H
MOV74H,64H
MOV75H,65H
INTT1OUT:
POPPSW;恢复现场
POPACC
RETI;中断退出
FLASH1:
JB00H,FLASH2;00H位为1时,转时十位熄灭控制
JB01H,FLASH3;01H位为1时,转时个位熄灭控制
JB02H,FLASH4;02H位为1时,转分十位熄灭控制
JB03H,FLASH5;03H位为1时,转分个位熄灭控制
JB04H,FLASH6;04H位为1时,转秒十位熄灭控制
JB05H,FLASH7;05H位为1时,转秒个位熄灭控制
AJMPINTT1OUT;转中断退出
FLASH2:
MOV70H,#10;00H位为1时,"熄灭符"数据放入时十位
MOV71H,61H
MOV72H,62H
MOV73H,63H
MOV74H,64H
MOV75H,65H
AJMPINTT1OUT;转中断退出
FLASH3:
MOV70H,60H
MOV71H,#10;01H位为1时,"熄灭符"数据放入时个位
MOV72H,62H
MOV73H,63H
MOV74H,64H
MOV75H,65H
AJMPINTT1OUT;转中断退出
FLASH4:
MOV70H,60H
MOV71H,61H
MOV72H,#10;02H位为1时,"熄灭符"数据放入分十位
MOV73H,63H
MOV74H,64H
MOV75H,65H
AJMPINTT1OUT;转中断退出
FLASH5:
MOV70H,60H
MOV71H,71H
MOV72H,62H
MOV73H,#10;03H位为1时,"熄灭符"数据放入分个位
MOV74H,64H
MOV75H,65H
AJMPINTT1OUT;转中断退出
FLASH6:
MOV70H,60H
MOV71H,61H
MOV72H,62H
MOV73H,63H
MOV74H,#10;04H位为1时,"熄灭符"数据放入秒十位
MOV75H,65H
AJMPINTT1OUT;转中断退出
FLASH7:
MOV70H,60H
MOV71H,71H
MOV72H,62H
MOV73H,63H
MOV74H,64H
MOV75H,#10;05H位为1时,"熄灭符"数据放入秒十位
AJMPINTT1OUT;转中断退出
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;时间显示程序;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;显示数据在70H-75H单元内,用两个4位LED共阳数码管显示,P0口输出段码数据,
;P2口作扫描控制,每个LED数码管亮1MS时间再逐位循环。
DISP:
MOVDPTR,#TABLE;数据表格起始地址送DPTR
MOVA,75H;取显示数据到A
MOVCA,@A+DPTR;查显示数据对应段码
MOVP0,A;段码放入P0口
SETBP2.7;显示秒个位
LCALLDELAY;显示1MS
CLRP2.7
MOVA,74H;取显示数据到A
MOVCA,@A+DPTR;查显示数据对应段码
MOVP0,A;段码放入P0口
SETBP2.6;显示秒十位
LCALLDELAY;显示1MS
CLRP2.6
MOVA,73H;取显示数据到A
MOVCA,@A+DPTR;查显示数据对应段码
MOVP0,A;段码放入P0口
SETBP2.4;显示分个位
LCALLDELAY;显示1MS
CLRP2.4
MOVA,72H;取显示数据到A
MOVCA,@A+DPTR;查显示数据对应段码
MOVP0,A;段码放入P0口
SETBP2.3;显示分十位
LCALLDELAY;显示1MS
CLRP2.3
MOVA,71H;取显示数据到A
MOVCA,@A+DPTR;查显示数据对应段码
MOVP0,A;段码放入P0口
SETBP2.1;显示时个位
LCALLDELAY;显示1MS
CLRP2.1
MOVA,70H;取显示数据到A
MOVCA,@A+DPTR;查显示数据对应段码
MOVP0,A;段码放入P0口
SETBP2.0;显示时十位
LCALLDELAY;显示1MS
CLRP2.0
MOVP0,#0BFH
SETBP2.2;时与分之间显示"-"
LCALLDELAY
CLRP2.2
MOVP0,#0BFH
SETBP2.5;分与秒之间显示"-"
LCALLDELAY
CLRP2.5
RET
TABLE:
DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH
;共阳段码表"0""1""2""3""4""5""6""7""8""9""不亮"
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;时间调整程序;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SETTIME:
LCALLDL1S;调用1秒延时程序
JBP3.0,LOP1;位选键按下时间小于1S则无效
AJMPLOP2
LOP1:
LJMPLOP3
LOP2:
MOV60H,70H;当前时间送60H-65H
MOV61H,71H
MOV62H,72H
MOV63H,73H
MOV64H,74H
MOV65H,75H
CLRET0;关定时器T0中断
CLRTR0;关定时器T0计数
MOVR4,#06H;进入调时状态,赋闪烁定时初值
SETBET1;允许T1中断
SETBTR1;开启定时器T1计数
SET2:
JNBP3.0,SET1;P3.0口为0(位选键未释放),等待
SETB00H;位选键释放,时十位调整闪烁标志置1
SET4:
JBP3.1,SET3;减一键按下执行减一否则跳判断位选键是否按下
DEC60H;时十位减一
MOVA,60H
CLRC;清进位标志
CJNEA,#0FFH,PROG3;时十位小于零则置2否则转PROG3
MOV60H,#02
PROG3:
MOVA,60H;小时数与24比较
MOVB,#10
MULAB
ADDA,61H
CLRC
CJNEA,#24,PROG4;小时与24进行比较
PROG4:
JCHHS;小时小于24转HHS
MOV60H,#01;大于24时十位计时单元置1
HHS:
JBP3.1,SET4;等待减一键放开
LCALLDISP
AJMPHHS
SET1:
LCALLDISP;等待位选键放开P3.0口为0(键未释放)
AJMPSET2
SET3:
LCALLDISP
JNBP3.0,SET22;判断位选键是否按下是则调时个位,否则继续等待
AJMPSET4
SET22:
JNBP3.0,SET21;P3.0口为0(键未释放),等待
CLR00H;位选键释放,时十位调整闪烁标志置0
SETB01H;位选键释放,时个位调整闪烁标志置1
SET24:
JBP3.1,SET23;减一键按下执行减一否则跳到判断位选键键是否按下
DEC61H;时个位减一
MOVA,61H
CLRC;清进位标志
CJNEA,#0FFH,PROG5;时个位小于零则置9否则转PROG4
MOV61H,#09
PROG5:
MOVA,60H;小时数与24比较
MOVB,#10
MULAB
ADDA,61H
CLRC
CJNEA,#24,PROG6;小时与24进行比较
PROG6:
JCHHG;小时小于24转HHG
MOV61H,#03;大于24时时个位计时单元置3
HHG:
JBP3.1,SET24;等待减一键放开
LCALLDISP
AJMPHHG
SET21:
LCALLDISP;等待位选键放开P3.0口为0(键未释放)
AJMPSET22
SET23:
LCALLDISP
JNBP3.0,SET6;判断位选键是否按下是则调分个位,否则继续等待
AJMPSET24
SET6:
JNBP3.0,SET5;P3.0口为0(键未释放),等待
CLR01H;位选键释放,时个位调整闪烁标志置0
SETB02H;位选键释放,分十位调整闪烁标志置1
SET8:
JBP3.1,SET7;减一键按下执行减一否则跳到判断位选键键是否按下
DEC62H;分十位减一
MOVA,62H
CLRC;清进位标志
CJNEA,#0FFH,MMS;分十位小于零则置5否则转MMS
MOV62H,#05
MMS:
JBP3.1,SET8;等待减一键放开
LCALLDISP
AJMPMMS
SET5:
LCALLDISP;等待位选键放开P3.0口为0(键未释放)
AJMPSET6
SET7:
LCALLDISP
JNBP3.0,SET10;判断位选键是否按下是则调分个位,否则继续等待
AJMPSET8
SET10:
JNBP3.0,SET9;P3.0口为0(键未释放),等待
CLR02H;位选键释放,分十位调整闪烁标志置0
SETB03H;位选键释放,分个位调整闪烁标志置1
SET12:
JBP3.1,SET11;减一键按下执行减一否则跳到判断位选键键是否按下
DEC63H;分个位减一
MOVA,63H
CLRC;清进位标志
CJNEA,#0FFH,MMG;分个位小于零则置9否则转MMG
MOV63H,#09
MMG:
JBP3.1,SET12;等待减一键放开
LCALLDISP
AJMPMMG
SET9:
LCALLDISP;等待位选键放开P3.0口为0(键未释放)
AJMPSET10
SET11:
LCALLDISP;判断位选键是否按下是则调秒十位,否则继续等待
JNBP3.0,SET14
AJMPSET12
SET14:
JNBP3.0,SET13;P3.0口为0(键未释放),等待
CLR03H;位选键释放,分个位调整闪烁标志置0
SETB04H;位选键释放,秒十位调整闪烁标志置1
SET16:
JBP3.1,SET15;减一键按下执行减一否则跳到判断位选键键是否按下
DEC64H;秒十位减一
MOVA,64H
CLRC;清进位标志
CJNEA,#0FFH,SSS;秒十位小于零则置5否则转SSS
MOV64H,#05
SSS:
JBP3.1,SET16;等待减一键放开
LCALLDISP
AJMPSSS
SET13:
LCALLDISP;等待位选键放开P3.0口为0(键未释放)
AJMPSET14
SET15:
LCALLDISP
JNBP3.0,SET18;判断位选键是否按下是则调秒个位,否则继续等待
AJMPSET16
SET18:
JNBP3.0,SET17;P3.0口为0(键未释放),等待
CLR04H;位选键释放,秒十位调整闪烁标志置0
SETB05H;位选键释放,秒个位调整闪烁标志置1
SET20:
JBP3.1,SET19;减一键按下执行减一否则跳到判断位选键键是否按下
DEC65H;秒个位减一
MOVA,65H
CLRC;清进位标志
CJNEA,#0FFH,SSG;秒个位小于零则置9否则转MMG
MOV65H,#09
SSG:
JBP3.1,SET20;等待减一键放开
LCALLDISP
AJMPSSG
SET17:
LCALLDISP;等待位选键放开P3.0口为0(键未释放)
AJMPSET18
SET19:
LCALLDISP
JNBP3.0,SETOUT;判断位选键是否按下是则准备退出调时状态,否则继续等待
AJMPSET20
SETOUT:
JNBP3.0,SETOUT1;调时退出程序。
等待键释放
MOV75H,65H
CLR00H;清调时十位闪烁标志
CLR01H;清调时个位闪烁标志
CLR02H;清调分十位闪烁标志
CLR03H;清调分个位闪烁标志
CLR04H;清调秒十位闪烁标志
CLR05H;清调秒个位闪烁标志
CLR06H;清闪烁标志
CLRTR1;关闭定时器T1
CLRET1;关定时器T1中断
SETBTR0;开启定时器T0
SETBET0;开定时器T0中断(计时开始)
LOP3:
LJMPSTART;跳回主程序
SETOUT1:
LCALLDISP;退出时钟调整时键释放等待
AJMPSETOUT;防止键按下时无时钟显示
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;秒表程序;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SETMBCX:
LCALLDL1S;调用按键时间延时程序
JBP3.2,LOOP1;键按下时间小于1秒则跳回主程序
AJMPLOOP2
LOOP1:
LJMPLOOP4
LOOP2:
JNBP3.2,LOOP5;P3.2口为0(键未释放),等待
LOOP7:
JBP3.2,LOOP6;等待键按下
SETB07H;秒表开始计时
LOOP8:
JNBP3.2,LOOP11;秒表计时中
CLR07H;秒表停止计时
LOOP20:
JBP3.2,LOOP21;等待键按下
MOV76H,#00H;秒表显示清零
MOV77H,#00H
MOV78H,#00H
MOV79H,#00H
MOV7AH,#00H
LOOP22:
JNBP3.2,LOOP23;P3.0口为0(键未释放),等待
LOOP9:
JBP3.2,LOOP12;等待键按下
LJMPLOOP13
LOOP5:
LCALLLOOP3
AJMPLOOP2
LOOP6:
LCALLLOOP3
AJMPLOOP7
LOOP11:
LCALLLOOP3
AJMPLOOP8
LOOP12:
LCALLLOOP3
AJMPLOOP9
LOOP21:
LCALLLOOP3
AJMPLOOP20
LOOP23:
LCALLLOOP3
AJMPLOOP22
LOOP3:
MOVDPTR,#TABLE1;数据表格起始地址送DPTR
MOVA,76H;取显示数据到A
MOVCA,@A+DPTR;查显示数据对应段码
MOVP0,A;段码放入P1口
SETBP2.7;显示0.01S位
LCALLDELAY;显示1MS
CLRP2.7
MOVA,77H;取显示数据到A
MOVCA,@A+DPTR;查显示数据对应段码
MOVP0,A;段码放入P1口
SETBP2.6;显示0.1S位
LCALLDELAY;显示1MS
CLRP2.6
MOVA,78H;取显示数据到A
MOVCA,@A+DPTR;查显示数据对应段码
MOVP0,A;段码放入P1口
SETBP2.4;显示1S位
LCALLDELAY;显示1MS
CLRP2.4
MOVA,79H;取显示数据到A
MOVCA,@A+DPTR;查显示数据对应段码
M