电子钟实现参考程序.docx
《电子钟实现参考程序.docx》由会员分享,可在线阅读,更多相关《电子钟实现参考程序.docx(12页珍藏版)》请在冰豆网上搜索。
电子钟实现参考程序
;-------------------------------------------------------------------
;本电子钟实现24小时制,8位数码管显示时分秒,可整点报时
;显示格式:
00-00-00(设置小时十位为0时,不显示)
;通过3只按键来调整时间
;调整选择键SET_KEY:
P1.0;通过选择键选择调整位,选中位闪烁
;增加键ADD_KEY:
P1.1;按一次使选中位加1
;减少键DEC_KEY:
P1.2;按一次使选中位减1
;如果长按ADD_KEY或DEC_KEY,可进行调时、调分快进快减,并停止闪烁
;如果选中位是秒,则按增加键或减少键可实现,但无调时快进和快减功能
;P0口输出数码管段选信号,P3口输出数码管位选信号;晶振11.0592M
;P2.1为蜂鸣器发声报时
;编程人:
郑振凡编写日期:
2009年12月2日修改日期(最终):
2009年12月6日
;-------------------------------------------------------------------
;-----------
;程序入口
;-----------
ORG0000H;程序入口地址
LJMPSTART
ORG000BH;定时器0中断入口地址
LJMPTIMET0
ORG1000H
;----------------------------------
;显P.程序
;功能:
可以在8个数码闪烁移位进行屏保
;----------------------------------
START:
MOVR6,#2;闪烁次数
MOVA,#01H;位选
TT:
MOVP3,A
MOVP0,#0CH;段码"P."
LCALLDELAY
MOVP3,#00H
DJNZR6,TT
LCALLDELAY
LCALLDELAY1
RRA
JBP1.0,TT;键是否按下,没按下则转移
LCALLDELAY;延时去抖
JNBP1.0,KAI;再次判断键是否按下
KAI:
SETBP1.0
CLRA;状态恢复
MOVP0,#0FFH
LCALLDELAY1
SETB48H;用于调时闪烁标志
SETB47H;用于产生脉冲用于调时快进的脉冲
MOVR1,#0;调整选择键功能标志:
0计时、1调时、2调分、3调秒
;-------------------------------
;清16位寄存器及初始化
;50H用于控制秒基准时钟源的产生
;51H清零秒寄存器
;52H清零分寄存器
;53H清零时寄存器
;5FH用于秒个位;5EH用于秒十位
;5DH用于分个位;5CH用于分十位
;5BH用于时个位;5AH用于时十位
;54H用于控制调时闪烁
;-------------------------------
MOVR0,#50H;初始化
MOVR6,#10H
CLEARJCQ:
MOV@R0,#00H;清寄存器
INCR0
DJNZR6,CLEARJCQ
MOVIP,#02H
SETBEA
SETBET0
MOVTMOD,#01H;设定定时器0工作方式1
MOVTH0,#3CH
MOVTL0,#0B0H;赋定时初值,定时50ms
SETBTR0;启动定时器0
MOVSP,#70H;堆栈
;--------
;主程序
;--------
MAIN:
LCALLDISPLAY
LCALLKEY_SCAN
JZMAIN
LCALLSET_KEY
JB46H,MAIN;如果已进行调时快进,则不再执行下面的调整
LCALLADD_KEY;调用增加键处理子程序,加一
LCALLDEC_KEY;调用减少键处理子程序,减一
LJMPMAIN;重新循环
;---------------
;显示处理程序
;---------------
DISPLAY:
MOVA,51H
ANLA,#0FH
MOV5FH,A;转换出秒个位,存入5FH
MOVA,51H
ANLA,#0F0H
SWAPA
MOV5EH,A;转换出秒十位,存入5EH
JB46H,MIN;如果调时快进,则跳过闪烁处理程序
CJNER1,#3,MIN;如果R1为3,闪烁秒位待调整
JB48H,MIN
MOV5FH,#0AH;使该位为10,查表得到使该位不显示
MOV5EH,#0AH
MIN:
MOVA,52H
ANLA,#0FH
MOV5DH,A;转换出分个位,存入5DH
MOVA,52H
ANLA,#0F0H
SWAPA
MOV5CH,A;转换出分十位,存入5CH
JB46H,HOUR
CJNER1,#2,HOUR;如果R1为2,闪烁分位待调整
JB48H,HOUR
MOV5DH,#0AH
MOV5CH,#0AH
HOUR:
MOVA,53H
ANLA,#0FH
MOV5BH,A;转换出时个位,存入5BH
MOVA,53H
ANLA,#0F0H
SWAPA
MOV5AH,A;转换出时十位,存入5AH
JB46H,DISP
CJNER1,#1,DISP;如果R1为1,闪烁时位待调整
JB48H,DISP
MOV5BH,#0AH;使该位为10,查表得到使该位不显示
MOV5AH,#0AH
;-------------------
;数码管动态扫描显示
;-------------------
DISP:
MOVDPTR,#TABLE
MOVA,5FH
MOVCA,@A+DPTR
MOVP0,A
SETBP3.7
LCALLDELAY
CLRP3.7;显示秒个位
MOVA,5EH
MOVCA,@A+DPTR
MOVP0,A
SETBP3.6
LCALLDELAY
CLRP3.6;显示秒十位
MOVA,#0BFH
MOVP0,A
SETBP3.5
LCALLDELAY
CLRP3.5;显示“-”
MOVA,5DH
MOVCA,@A+DPTR
MOVP0,A
SETBP3.4
LCALLDELAY
CLRP3.4;显示分个位
MOVA,5CH
MOVCA,@A+DPTR
MOVP0,A
SETBP3.3
LCALLDELAY
CLRP3.3;显示分十位
MOVA,#0BFH
MOVP0,A
SETBP3.2
LCALLDELAY
CLRP3.2;显示“-”
MOVA,5BH
MOVCA,@A+DPTR
MOVP0,A
SETBP3.1
LCALLDELAY
CLRP3.1;显示时个位
MOVDPTR,#TABLE1;该位使用TABLE1以消除时的十位置0
MOVA,5AH
MOVCA,@A+DPTR
MOVP0,A
SETBP3.0
LCALLDELAY
CLRP3.0;显示时十位
RET
;-----------------
;定时器中断1s程序
;-----------------
TIMET0:
PUSHACC;保护现场
PUSHPSW
MOVTH0,#3CH
MOVTL0,#0B0H
CPL47H;产生脉冲用于调时快进
INC54H
MOVA,54H
CJNEA,#10,ADD_TIME;产生0.5秒,用于调时闪烁
CPL48H;取反调时闪烁标志位
MOV54H,#00H
ADD_TIME:
INC50H
MOVA,50H
CJNEA,#10,ZDBACD;整点报时时蜂鸣器响延迟时间
SETBP2.1;关蜂鸣器
ZDBACD:
CJNEA,#20,RETI1;产生1秒时钟
MOV50H,#00H;一秒钟时间到,清零50H
MOVA,51H
ADDA,#01H
DAA;十进制调整
MOV51H,A
CJNEA,#60H,RETI1
MOV51H,#00H;一分钟到
MOVA,52H
ADDA,#01H
DAA
MOV52H,A
CJNEA,#60H,RETI1
CLRP2.1
MOV52H,#00H;一小时到,开蜂鸣器,清分显示
MOVA,53H
ADDA,#01H
DAA
MOV53H,A
CJNEA,#24H,RETI1
MOV53H,#00H;到24点,清零小时
RETI1:
POPPSW
POPACC;恢复现场
RETI;中断返回
;-------------
;键盘扫描程序
;R4设置为00H是为了在进入长按处理前加长延时,以区分长按与短按键
;-------------
KEY_SCAN:
CLR46H;关闭调时快进标志
MOVP1,#0FFH;将P1口设置成输入状态
MOVA,P1
CPLA
ANLA,#07H;1口低3位连接3个按键,只判断该3位
JZEXIT_KEY
LCALLDELAY;延时去抖动
MOVA,P1;重新判断
CPLA
ANLA,#07H
JZEXIT_KEY
MOVR5,A
MOVR4,#00H;用于控制调时快进速度
LOOP:
LCALLDISPLAY;进入长按处理
MOVA,P1
CPLA
ANLA,#07H
JB47H,LOOP1
INCR4;调时快进间隔时间基准加1
LOOP1:
CJNER1,#03H,LOOP2;如果调秒时长按,则不处理
LJMPLOOP3
LOOP2:
CJNER4,#99H,LOOP3
MOVR4,#70H;确认长按后,加快调时快进速度
SETB46H
LCALLADD_KEY
LCALLDEC_KEY
LOOP3:
JNZLOOP;等待键释放
MOVA,R5;输出键值
RET
EXIT_KEY:
RET
;------------
;延时子程序
;------------
DELAY:
MOVR7,#200
DJNZR7,$
RET
DELAY1:
MOVR3,#50
MOVTMOD,#00H
MOVTH1,#63H
MOVTL1,#18H
SETBTR1
LP1:
JBCTF1,LP2
SJMPLP1
LP2:
MOVTH1,#63H
MOVTL1,#18H
DJNZR3,LP1
RET
;-----------------
;选择键处理子程序
;-----------------
SET_KEY:
CJNER5,#01H,EXIT;选择键键值
INCR1;调整选择功能标志加一
CJNER1,#4,EXIT
MOVR1,#0
MOV54H,#00H;调时闪烁清零
RET
;----------
;加1子程序
;----------
ADD_KEY:
CJNER5,#02H,EXIT;加1键值
CJNER1,#01H,NEXT1;选择键功能标志为1调时,否则跳出
MOVA,53H
ADDA,#01H
DAA
MOV53H,A
CJNEA,#24H,EXIT
MOV53H,#00H
NEXT1:
CJNER1,#02H,NEXT2;选择键功能标志为2调分,否则跳出
MOVA,52H
ADDA,#01H
DAA
MOV52H,A
CJNEA,#60H,EXIT
MOV52H,#00H
NEXT2:
CJNER1,#03H,EXIT;选择键功能标志为3调秒,否则跳出
MOVA,51H
ADDA,#01H
DAA
MOV51H,A
CJNEA,#60H,EXIT
MOV51H,#00H;如加1键按下直接清零秒
RET
;----------
;减1子程序
;----------
DEC_KEY:
CJNER5,#04H,EXIT;减1键键值
CJNER1,#01H,NEXT3;选择键功能标志为1调时,否则跳出
MOVA,53H
ADDA,#99H
DAA
MOV53H,A
CJNEA,#99H,EXIT
MOV53H,#23H
NEXT3:
CJNER1,#02H,NEXT4;选择键功能标志为2调分,否则跳出
MOVA,52H
ADDA,#99H
DAA
MOV52H,A
CJNEA,#99H,EXIT
MOV52H,#59H
NEXT4:
CJNER1,#03H,EXIT;选择键功能标志为3调秒,否则跳出
MOVA,51H
ADDA,#99H
DAA
MOV51H,A
CJNEA,#99H,EXIT
MOV51H,#59H
RET
;-----------
;返回子程序
;-----------
EXIT:
RET
;-----------------
;数码管字形编码表
;-----------------
TABLE:
DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH
;"0","1","2","3","4","5","6","7","8"",9","不显示"
TABLE1:
DB0FFH,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH;小时位的十位数编码
;"不显示","1","2","3","4","5","6","7","8","9","不显示"
;--------
;程序结束
;--------
END