📄 万年历.a51
字号:
;***********************************************
;电子万年历程序
;作者:张朋坤
;2007.4.2
;***********************************************
ORG 0000H
AJMP MAIN
ORG 000BH ;T0中断服务程序入口
LJMP DISPLAY
;***********************************************
;30H~3DH单元显示缓冲区,定义如下:
;30H 月十位 31H 月个位
;32H 日十位 33H 日个位
;34H 时十位 35H 时个位
;36H 分十位 37H 分个位
;38H 秒十位 39H 秒个位
;3AH 星期位 3BH 未用
;3CH 年十位 3DH 年个位
;************************************************
;编程思想:
;用T0产生一个定时中断,在中断服务程序中,显示14个LED;
;主程序中,读DS1302的数据。
;主程序中加了一点延时的原因:
;在Proteus中,不停的访问DS1302所占用CPU的时间太多,;加了延时后,访问减少,CPU的占有时间大大减少。
;****************************************************************
MAIN: MOV TMOD,#02H ;T0定时,工作方式2
MOV TH0,#00H ;T0计数初值
MOV TL0,#00H
SETB EA
SETB ET0
SETB TR0
MOV R1,#30H
MOV R6,#14
L0:ACALL PR1302
ACALL DELAY
AJMP L0
DELAY: MOV R3,#0
L1: MOV R5,#0
DJNZ R5,$
DJNZ R3,L1
RET
;**********************************************
;显示程序
;**********************************************
DISPLAY:PUSH ACC
MOV DPTR,#TAB1
MOV A,R6
MOVC A,@A+DPTR
MOV P2,A
MOV DPTR,#TAB2
MOV A,R6
MOVC A,@A+DPTR
MOV P3,A
MOV A,@R1
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P0,A
INC R1
DJNZ R6,LOOP
MOV R1,#30H
MOV R6,#14
LOOP: POP ACC
RETI
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,98H
TAB1:
DB 00H,00H,00H,00H,00H,00H,00H,80H,40H,20H,10H,08H,04H,02H,01H
TAB2:
DB 00H,20H,10H,08H,04H,02H,01H,00H,00H,00H,00H,00H,00H,00H,00H
;********************************************************
;处理DS1302子程序
;功能:1302得到的时间是以压缩的BCD码存在44~49H中,次程序把它们
;分解成单字节的BCD码,并存入显示缓冲区
;********************************************************
PR1302:ACALL GET1302
MOV A,44H ;S
SWAP A
ANL A,#0FH
MOV 38H,A
MOV A,44H
ANL A,#0FH
MOV 39H,A
MOV A,45H ;M
SWAP A
ANL A,#0FH
MOV 36H,A
MOV A,45H
ANL A,#0FH
MOV 37H,A
MOV A,46H ;H
SWAP A
ANL A,#0FH
MOV 34H,A
MOV A,46H
ANL A,#0FH
MOV 35H,A
MOV A,47H ;D
SWAP A
ANL A,#0FH
MOV 32H,A
MOV A,47H
ANL A,#0FH
MOV 33H,A
MOV A,48H ;M
SWAP A
ANL A,#0FH
MOV 30H,A
MOV A,48H
ANL A,#0FH
MOV 31H,A
MOV A,49H ;W
ANL A,#0FH
DEC A
MOV 3AH,A
MOV A,4AH ;y
SWAP A
ANL A,#0FH
MOV 3CH,A
MOV A,4AH
ANL A,#0FH
MOV 3DH,A
RET
;**************************************************
;读DS1302时钟子程序
;**************************************************
RST EQU P1.0
SCLK EQU P1.1
IO EQU P1.2
GET1302:
MOV R0,#44H;
MOV R7,#7
MOV R2,#81H ;秒地址
G13021: CLR RST
CLR SCLK
SETB RST
MOV B,R2 ;秒 分 时 日 月 星期 年 地址
LCALL RTInputByte
LCALL RTOutputByte
MOV @R0,A ;秒
INC R0
INC R2
INC R2
SETB SCLK
CLR RST
DJNZ R7,G13021
RET
;*********************************************************
RTInputByte:
MOV R4,#8
Inbit1: MOV A,B
RRC A
MOV B,A
MOV IO, C
SETB SCLK
CLR SCLK
DJNZ R4,Inbit1
RET
;***************************************************
RTOutputByte:
MOV R4,#8
Outbit1: MOV C,IO
RRC A
SETB SCLK
CLR SCLK
DJNZ R4,Outbit1
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -