📄 at89c2051日期闹钟.asm
字号:
SETMM:LCALL DDL
JB P1.7,SET4
MOV R0,#77H
LCALL ADD1 ;分+1
MOV A,R3
CJNE A,#60H,SETMM
LCALL CLR0
AJMP SETMM
SET4: INC R5 ;R5=B
SEET4:LCALL DISPLAY
JB P1.7,SEET4
SETHH:LCALL DDL
JB P1.7,SETOUT1
MOV R0,#79H
LCALL ADD1 ;时+1
MOV A,R3
CJNE A,#24H,SETHH
LCALL CLR0
AJMP SETHH
;;;;;;;;;;;;;;;;;;;;;;;;;延时1秒钟;;;;;;;;;;;;;;;;;;;;;;;;;;
DDL:MOV 18H,#18
DDL0:MOV 17H,#245
DDL1:LCALL DISPLAY
DJNZ 17H,DDL1
DJNZ 18H,DDL0
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;T0中断程序;;;;;;;;;;;;;;;;;;;;;;;;;;;
INTT0: PUSH ACC ;打包
PUSH PSW
CLR ET0
CLR TR0
MOV A,#0DCH ;(#0D*H)调整时间快慢
ADD A,TL0
MOV TL0,A
MOV A,#0BH
ADDC A,TH0
MOV TH0,A
SETB TR0
DJNZ R4, OUTT0 ;16次中断未到中断退出
INC 30H
ADDSS: MOV R4,#10H ;16次中断到(1秒)重赋初值
MOV R0,#71H ;指向秒计时单元(70-71H)
ACALL ADD1 ;调用加1程序(加1秒操作)
MOV A,R3 ;秒数据放入A(R3为2位十进制数组合)
CJNE A,#60H,OUTT01 ;小于60秒退出
ACALL CLR0 ;等于或大于60秒清0
MOV R0,#77H ;指向分计时单元(76H-77H)
ACALL ADD1
MOV A,R3
CJNE A,#60H,OUTT0
ACALL CLR0
MOV R0,#79H ;指向小时计时单元(78H-79H)
ACALL ADD1
MOV A,R3
CJNE A,#24H,OUTT0
ACALL CLR0
jmp pd
OUTT0: MOV A,66H ;查询标志
CJNE A,#1,OUTT01
MOV 72H,76H ;中断退出时将分、时计时单元数据移入对应显示单元
MOV 73H,77H
MOV 74H,78H
MOV 75H,79H
OUTT01:POP PSW ;出栈
POP ACC
SETB ET0 ;开放T0
RETI ;中断返回
pd:mov a,42H;日判断
swap a;
orl a,41H;
cjne a,#01H,pd2;1月转31日处理
jmp rq31;
pd2:cjne a,#02H,pd3;2月判断是否闰年
mov a,46H;
swap a;
orl a,45H;
mov b,#4;
div ab;
mov a,b;
cjne a,#00H,rq28;2月不是闰年转28日处理
jmp rq29;
pd3:cjne a,#03H,pd4;3月转31日处理
jmp rq31;
pd4:cjne a,#04H,pd5;4月转30日处理
jmp rq30;
pd5:cjne a,#05H,pd6;5月转31日处理
jmp rq31;
pd6:cjne a,#06H,pd7;6月转30日处理
jmp rq30;
pd7:cjne a,#07H,pd8;7月转31日处理
jmp rq31;
pd8:cjne a,#08H,pd9;8月转31日处理
jmp rq31;
pd9:cjne a,#09H,pd10;9月转30日处理
jmp rq30;
pd10:cjne a,#10H,pd11;10月转31日处理
jmp rq31;
pd11:cjne a,#11H,pd12;11月转30日处理
jmp rq30;
pd12:cjne a,#12H,out0;12月转31日处理
rq31: mov r0,#42H;月31日+1
acall add1;
mov a,r3;
cjne a,#32h,out0;到31日清0
acall clr0;
mov 41H,#01H
jmp yue
rq30: mov r0,#42H;月30日+1
acall add1;
mov a,r3;
cjne a,#31h,out0;到30日清0
acall clr0;
mov 41H,#01H
jmp yue
rq28: mov r0,#42H;月28日+1
acall add1;
mov a,r3;
cjne a,#29h,out0;到28日清0
acall clr0;
mov 41H,#01H
jmp yue
rq29: mov r0,#42H;月29日+1
acall add1;
mov a,r3;
cjne a,#30h,out0;到29日清0
acall clr0;
mov 41H,#01H;
yue: mov r0,#44H ;月+1
call add1;
mov a,r3;
cjne a,#13h,out0;
call clr0;
MOV 43H,#01H
nan: mov r0,#46H ;年+1
call add1;
mov a,r3;
cjne a,#99h,out0;
call clr0;
OUT0:JMP OUTT0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;加1程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ADD1: MOV A,@R0 ;取当前计时单元数据到A
DEC R0 ;指向前一地址
SWAP A ;A中数据高四位与低四位交换
ORL A,@R0 ;前一地址中数据放入A中低四位
ADD A,#01H ;A加1操作
DA A ;十进制调整
MOV R3,A ;移入R3寄存器
ANL A,#0FH ;高四位变0
MOV @R0,A ;放回前一地址单元
MOV A,R3 ;取回R3中暂存数据
INC R0 ;指向当前地址单元
SWAP A ;A中数据高四位与低四位交换
ANL A,#0FH ;高四位变0
MOV @R0,A ;数据放入当削地址单元中
RET
CLR0: CLR C
CLR A ;清累加器
MOV @R0,A ;清当前地址单元
DEC R0 ;指向前一地址
MOV @R0,A ;前一地址单元清0
RET ;子程序返回
;-------------------------调时闪烁程序----------------------;
INTT1: PUSH ACC
PUSH PSW
MOV TL1,#0b0H
MOV TH1,#3cH
DJNZ R2,INTT1OUT ;0.3秒未到退出中断(50MS中断6次)
MOV R2,#05H ;重装0.3秒定时用初值
CPL 02H ;0.3秒定时到对闪烁标志取反
JB 02H,FL ;02H位为1时显示单元"熄灭"
MOV A,R5
CJNE A,#01H,NL
JMP NNN1
NL:CJNE A,#02H,NL1
LJMP NNN1
NL1:CJNE A,#03H,NL2;
LJMP NNN2;
NL2:CJNE A,#04H,NL3;
LJMP NNN2;
NL3:CJNE A,#05H,NL4
LJMP NNN3;
NL4:CJNE A,#06H,NL5
LJMP NNN3
NL5:CJNE A,#07H,NL6;
LJMP NNN4;
NL6:CJNE A,#08H,NL7;
LJMP NNN4;
NL7:CJNE A,#09H,NL8
LJMP NNN4;
NL8:CJNE A,#0AH,NL9
LJMP NLL
NL9:CJNE A,#0BH,INTT1OUT
LJMP NLL
fl:jmp FLASH1
INTT1OUT:POP PSW ;恢复现场
POP ACC
RETI ;中断退出
NLL:MOV 72H,76H ;时间移入显示缓存器
MOV 73H,77H
MOV 74H,78H
MOV 75H,79H
AJMP INTT1OUT
NNN1:MOV 72H,7BH ;1闹钟时间移入显示缓存器
MOV 73H,7CH
MOV 74H,7DH
MOV 75H,7EH
AJMP INTT1OUT
NNN2:MOV 72H,50H ;2闹钟时间移入显示缓存器
MOV 73H,51H
MOV 74H,52H
MOV 75H,53H
AJMP INTT1OUT
NNN3:MOV 72H,54H ;3闹钟时间移入显示缓存器
MOV 73H,55H
MOV 74H,56H
MOV 75H,57H
AJMP INTT1OUT
NNN4:MOV 70H,41H;年月日移入显示缓存器
MOV 71H,42H;
MOV 72H,43H;
MOV 73H,44H;
MOV 74H,45H;
MOV 75H,46H;
AJMP INTT1OUT
FLASH1:MOV A,R5
CJNE A,#01H,ML
LJMP MNN1
ML:CJNE A,#02H,ML1
LJMP MNN11
ML1:CJNE A,#03H,ML2;
LJMP MNN2;
ML2:CJNE A,#04H,ML3;
LJMP MNN22;
ML3:CJNE A,#05H,ML4;
LJMP MNN3;
ML4:CJNE A,#06H,ML5
LJMP MNN33
ML5:CJNE A,#07H,ML6
LJMP MNN4
ML6:CJNE A,#08H,ML7
LJMP MNN44
ML7:CJNE A,#09H,ML8
LJMP MNN444
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -