MOV 3FH,#12H ;<根据需要设置> MOV 40H,#20H
MOV 55H,#02H ;闹钟的初始值 MOV 56H,#00H
MOV 52H,#01H ;时间状态显示 MOV 25H,#0FFH ;正常进程下的闪烁值 MOV 26H,#0FFH ;调整时的闪烁值 MOV R2,#11 ;自动切换计数
MOV R4,#0 ;长时间无操作计数 CLR 61H ;闹钟满一分钟的标志位 CLR 62H ;闹钟开关
CLR 63H ;满一秒标志位(正常进程自动切换) CLR 64H ;满0.25秒标志位
;******************************主程序循环**************** LOOP: LCALL ZDQH ;自动切换子程序 LCALL NZ ;闹钟子程序
LCALL CZ ;调用拆字子程序 LCALL SKEY ;调用键盘扫描加处理 LCALL DISP ;调用显示子程序 LCALL RUNPING ;判断闰年平年 LCALL FLASH ;闪烁子程序
LCALL NO_SKEY ;长时间无键按下则返回 SJMP LOOP ;反复循环主流程
;***********************T0中断*************************** TP0:PUSH ACC ;T0 500微秒中断服务程序 PUSH PSW ;保护现场
DJNZ 38H,DONE ;每250微秒减1,满0.05秒? MOV 38H,#200
DJNZ 39H,DONE ;每0.05秒减1,满0.25S? MOV 39H,#5 SETB 64H DJNZ 4AH,DONE MOV 4AH,#4 ;每0.25秒减1,满1秒? INC R4 ;长时间无操作 SETB 63H MOV A,3AH ;秒单元(按BCD码)加1 ADD A,#1 DA A MOV 3AH,A
CJNE A,#60H,DONE ;满1分钟? SETB 61H
MOV 3AH,#0 ;秒单元清零
MOV A,3BH ;分钟单元(按BCD码)加1 ADD A,#1
DA A MOV 3BH,A
CJNE A,#60H,DONE ;满1小时? MOV 3BH,#0 ;分钟单元清零 MOV A,3CH ;小时单元(按BCD码)加1 ADD A,#1 DA A MOV 3CH,A
CJNE A,#24H,DONE ;满24小时? MOV 3CH,#0 ;小时单元清零 MOV A,3DH ;天单元(按BCD码)加1 ADD A,#1 DA A MOV 3DH,A
MOV A,53H ;闰年和平年的表 CJNE A,#00H,L2
MOV DPTR,#TAB2-1 SJMP L4
L2:MOV DPTR,#TAB1-1 L4:MOV A,3EH
MOVC A,@A+DPTR MOV 50H,A MOV A, 3DH
CJNE A,50H,DONE ;满一月? (50H存放表中的值) MOV 3DH,#01H ;日单元变为1
MOV A,3EH ;月单元(按BCD码)加1 ADD A,#1 DA A MOV 3EH,A
CJNE A,#13H,DONE ;满年?
MOV 3EH,#01H ;月单元变为1 MOV A,3FH ;年单元(按BCD码)加1 ADD A,#1 DA A MOV 3FH,A CJNE A,#00H,DONE MOV 3FH,#01H DONE:POP PSW
POP ACC ;恢复现场 RETI ;中断返回
;**************************自动切换子程序*************** ZDQH:JNB 63H,L1 CLR 20H.2
DJNZ R2 ,N1
MOV A,52H
MOV R2,#11;自动切换的计数秒数 CJNE A,#01H,L0
MOV 52H,#02H;日期状态显示标志 L1: RET
L0: CJNE A,#02H,N1 MOV 52H,#01H N1:RET
;*************************闹钟子程序**************** NZ:
JNB 62H,Q3 ;开关标志位为1则响 MOV A,3BH CJNE A,55H,Q3 MOV A,3CH CJNE A,56H,Q3 CLR P3.2 RET
Q3:SETB P3.2 RET
; ************************拆字子程序******************** CZ:MOV A,52H
CJNE A,#01H,CZ2
MOV R0,#3AH ;拆字子程序 MOV R1,#30H CZ1:MOV A,@R0 ;时间的拆字 ANL A,#0FH MOV @R1,A INC R1 MOV A,@R0 ANL A,#0F0H SWAP A
MOV @R1,A INC R0 INC R1 INC R1
CJNE R0,#3DH,CZ1 MOV 32H,#0AH
MOV 35H,#0AH ;第3、6位显示“-” RET CZ2: CJNE A,#02H, Q2 MOV R0,#3DH
MOV R1,#30H ;30H~37H为显示缓冲单元 L3: MOV A,@R0 ;日期的拆字 ANL A,#0FH
MOV @R1,A INC R1 MOV A,@R0 ANL A,#0F0H SWAP A
MOV @R1,A INC R0 INC R1
CJNE R0,#41H,L3 MOV A,32H ADD A,#0BH MOV 32H,A MOV A,34H ADD A,#0BH MOV 34H,A Q2:RET
;*******************************显示子程序*********************** DISP:MOV R0,#30H ;显示更新子程序。置显示缓冲单元首地址(对应最右位)
MOV R3,#01H ;位码初值(从最右位起) DISP1:MOV A,R3 ANL A,25H MOV DPTR,#0FEFDH ; 8255-B口(位码输出口) MOVX @DPTR,A ; 输出当前字位码 MOV A,@R0 ; 取当前位显示数据码 ADD A,#TAB-NPC ; 加TAB与NEXTPC差址 MOVC A,@A+PC ; 查表得相应字段码
NPC:MOV DPTR,#0FEFCH ; 8255-A口(字段码输出口) MOVX @DPTR,A ; 输出字段码 LCALL D1MS ; 保持显示1毫秒 INC R0 ; 指向下一显示缓冲单元 MOV DPTR,#0FEFCH ;消窜显。 MOV A,#0FFH MOVX @DPTR,A
MOV A,R3 ; 取出原来的位码 JB ACC.7,DISP2 ; 判断若已显示到最左位则结束
RL A ; 未完,字位码左移1位 MOV R3,A ; 回存新的位码 LJMP DISP1 ; 转下一位的显示驱动 DISP2:RET
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ;0-9
相关推荐: