📄 万年历.asm
字号:
;*****************************
;* 万年历程序 *
;*****************************
;67H(高两位年)66H(低两位年)65H(月)64H(星期)
;63H(日)62H(小时)61H(分)60H(秒)57H(农历月)56H(农历日)
;显示缓冲单元7CH~7BH(4CH~4BH)年低位,7AH~79H(4AH~49H)月,
;78H(48H)星期,77H~76H(47H~46H)日,75H~74H(45H~44H)时,
;73H72H(43H~42H)分,71H~70H(41H~40H)秒,5EH~5DH(55H~54H)农历年
;5CH~5BH(53H~52H)农历月,5AH~59H(51H~50H)农历日
;闰年标志为F0,定时器T1为调整时候闪烁用
;
;
SCLK EQU P3.2
IO EQU P3.3
RST EQU P3.4
TIME_YEAR DATA 66H
TIME_MONTH DATA 65H
WEEK DATA 64H
TIME_DAY DATA 63H
HOUR DATA 62H
MINTUE DATA 61H
SECOND DATA 60H
DS1302_ADDR DATA 32H
DS1302_DATA DATA 31H
start_year EQU 01; 定义查询表起始年份 ,01--199 表示 1901-2099 年
week_byte1 DATA 3AH
WEEK_BYTE2 DATA 3BH
WEEK_BYTE3 DATA 3CH
WEEK_BYTE4 DATA 3DH
WEEK_BYTE5 DATA 3EH
CONvert_year DATA 6dh
CONvert_month DATA 6eh ;BIT7 为 1 表示闰月
CONvert_date DATA 6fh
temp_Byte1 DATA 68h
temp_Byte2 DATA 69h
temp_Byte3 DATA 6Ah
temp_Byte4 DATA 6Bh
temp_Byte5 DATA 6Ch
ORG 0000H
AJMP START
ORG 0003H
RETI
ORG 000BH
RETI
ORG 0013H
RETI
ORG 001BH
LJMP INTT1
ORG 0023H
RETI
ORG 002BH
RETI
;************************************
;* 主程序 *
;************************************
start: mov r1,#7Eh
mov r0,#2
mov a,#0
clear: mov @r0,a
inc r0
djnz r1,clear
mov r0,A
MOV SCON,#00H ;串行输出,方式0
MOV TMOD,#10H ;计数器1,方式1
MOV TL1,#00H
MOV TH1,#00H
MOV DS1302_ADDR,#8EH
MOV DS1302_DATA,#00H ;允许写1302
LCALL WRITE
main1:
SETB EA
MOV DS1302_ADDR,#8DH ;READ OUT YEAR
LCALL READ
MOV TIME_YEAR,DS1302_DATA
MOV DS1302_ADDR,#8BH ;READ OUT WEEK
LCALL READ
MOV WEEK,DS1302_DATA
MOV DS1302_ADDR,#89H ;READ OUT MONTH
LCALL READ
MOV TIME_MONTH,DS1302_DATA
MOV DS1302_ADDR,#87H ;READ OUT DAY
LCALL READ
MOV TIME_DAY,DS1302_DATA
MOV DS1302_ADDR,#85H ;READ OUT HOUR
LCALL READ
MOV HOUR,DS1302_DATA
MOV DS1302_ADDR,#83H ;READ OUT MINTUE
LCALL READ
MOV MINTUE,DS1302_DATA
MOV DS1302_ADDR,#81H ;READ OUT SECOND
LCALL READ
MOV SECOND,DS1302_DATA
MOV R0,TIME_YEAR ;年分离,送显示缓存
LCALL DIVIDE
MOV 7BH,R1
MOV 4BH,R1
MOV 7CH,R2
MOV 4CH,R2
MOV 78H,WEEK
MOV 48H,WEEK
MOV R0,TIME_MONTH ;月分离,送显示缓存
LCALL DIVIDE
MOV 79H,R1
MOV 49H,R1
MOV 7AH,R2
MOV 4AH,R2
MOV R0,TIME_DAY ;日分离,送显示缓存
LCALL DIVIDE
MOV 76H,R1
MOV 46H,R1
MOV 77H,R2
MOV 47H,R2
MOV R0,HOUR ;小时分离,送显示缓存
LCALL DIVIDE
MOV 74H,R1
MOV 44H,R1
MOV 75H,R2
MOV 45H,R2
MOV R0,MINTUE ;分分离,送显示缓存
LCALL DIVIDE
MOV 72H,R1
MOV 42H,R1
MOV 73H,R2
MOV 43H,R2
MOV R0,SECOND ;秒分离,送显示缓存
LCALL DIVIDE
MOV 70H,R1
MOV 40H,R1
MOV 71H,R2
MOV 41H,R2
LCALL GENGXIN ;更新农历程序
MOV R0,CONVERT_MONTH ;农历月分离,送显示缓存
LCALL DIVIDE
MOV 5BH,R1
MOV 52H,R1
MOV 5CH,R2
MOV 53H,R2
MOV R0,CONVERT_DATE
LCALL DIVIDE
MOV 59H,R1
MOV 50H,R1
MOV 5AH,R2
MOV 51H,R2
LCALL GETWEEK
MOV 78H,WEEK
LCALL DISPLAY
JNB P1.1,SETGG
JNB F0,SSS
CLR P1.0 ;闰月,则p1.0清0,指示灯亮
LJMP MAIN1
SSS: SETB P1.0 ;非闰月,则p1.0置位,指示灯灭
LJMP MAIN1
SETGG: LJMP SETG
;*******************************
;* 公历设置程序 *
;*******************************
SETG: SETB TR1
SETB ET1
CLR 08H
CLR 09H
CLR 0AH
CLR 0BH
CLR 0CH
CLR 0DH
CLR 0EH
CLR 0FH
MOV DS1302_ADDR,#8EH
MOV DS1302_DATA,#00H ;允许写1302
LCALL WRITE
MOV DS1302_ADDR,#80H
MOV DS1302_DATA,#80H ;1302停止振荡
LCALL WRITE
GWAIT: LCALL DISPLAY
JNB P1.1,GWAIT
SETG1: LCALL DISPLAY
JNB P1.1,SETGMON
JNB P1.3,GADDYEAR
JNB P1.4,GDECYEAR
JNB F0,SSSYEAR
CLR P1.0 ;闰月,则p1.1清0,指示灯亮
LJMP SETG1
SSSYEAR: SETB P1.0
AJMP SETG1
SETGMON: AJMP SETG2
GADDYEAR: MOV R7,66H ;年加1
LCALL ADD1
MOV 66H,A
CJNE A,#99H,GADDYEAR1
MOV 66H,#00H
GADDYEAR1: LCALL GETWEEK ;年加1同时换算出星期
LCALL YMD ;转换农历月日
MOV DS1302_ADDR,#8CH ;年值送1302
MOV DS1302_DATA,66H
LCALL WRITE
MOV DS1302_ADDR,#8AH ;星期值送1302
MOV DS1302_DATA,64H
LCALL WRITE
MOV R0,66H
LCALL DIVIDE ;年分离送显示缓冲
MOV 4BH,R1
MOV 7BH,R1
MOV 4CH,R2
MOV 7CH,R2
MOV R0,64H
LCALL DIVIDE ;星期分离送显示缓冲
MOV 48H,week
MOV 78H,week
WAIT1: LCALL DISPLAY
JNB P1.3,WAIT1
AJMP SETG1
GDECYEAR: MOV R7,66H ;年减1
LCALL DEC1
MOV 66H,A
CJNE A,#99H,GDECYEAR1
MOV 66H,#99H
GDECYEAR1: LCALL GETWEEK ;年减1同时换算出星期
LCALL YMD ;转换农历月日
MOV DS1302_ADDR,#8CH ;年值送1302
MOV DS1302_DATA,66H
LCALL WRITE
MOV DS1302_ADDR,#8AH ;星期值送1302
MOV DS1302_DATA,64H
LCALL WRITE
MOV R0,66H
LCALL DIVIDE ;年分离送显示缓冲
MOV 4BH,R1
MOV 7BH,R1
MOV 4CH,R2
MOV 7CH,R2
MOV R0,64H
LCALL DIVIDE ;星期分离送显示缓冲
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -