📄 万年历.asm
字号:
exit:nop
RET
;********************************
;* 阳历调整同时显示农历月日程序 *
;*********************************
YMD:
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
RET
;*********************************
;* 分离程序 *
;*********************************
DIVIDE: MOV A,R0
ANL A,#0FH
MOV R1,A
MOV A,R0
SWAP A
ANL A,#0FH
MOV R2,A
RET
;*********************************
;* 写1302程序 *
;*********************************
WRITE: CLR SCLK
NOP
SETB RST
NOP
MOV A,DS1302_ADDR
MOV R4,#8
WRITE1: RRC A ;送地址给1302
NOP
NOP
CLR SCLK
NOP
NOP
NOP
MOV IO,C
SETB SCLK ;时钟上升沿有效
NOP
NOP
NOP
NOP
DJNZ R4,WRITE1
CLR SCLK
NOP
MOV A,DS1302_DATA
MOV R4,#8
WRITE2: RRC A
NOP ;送数据给1302
CLR SCLK
NOP
NOP
MOV IO,C
NOP
NOP
NOP
SETB SCLK
NOP
NOP
DJNZ R4,WRITE2
CLR RST
RET
;*******************************
;* 读1302程序 *
;*******************************
READ: CLR SCLK
NOP
NOP
SETB RST
NOP
MOV A,DS1302_ADDR
MOV R4,#8
READ1: RRC A
NOP
MOV IO,C
NOP
NOP
NOP
SETB SCLK ;读数据在时钟上升沿有效
NOP
NOP
NOP
CLR SCLK
NOP
NOP
DJNZ R4,READ1
MOV R4,#8
READ2: CLR SCLK
NOP
NOP
NOP
MOV C,IO
NOP
NOP
NOP
NOP
NOP
RRC A
NOP
NOP
NOP
NOP
SETB SCLK
NOP
DJNZ R4,READ2
MOV DS1302_DATA,A
CLR RST
RET
;********************************
;* 显示程序 *
;********************************
DISPLAY: MOV 7EH,#02H
MOV 7DH,#00H
MOV R0,#76H
MOV R1,#70H
MOV R2,79H
MOV R3,#79H
MOV R5,#0FEH
MOV A,7AH
CJNE A,#0,PLAY1
MOV 7AH,#0BH
PLAY1: MOV A,#0FFH
MOV P2,A
MOV A,@R0
MOV DPTR,#TAB1
MOVC A,@A+DPTR
MOV SBUF,A ;送第1字节,送日,农历月、日数据。
JNB TI,$
CLR TI
MOV A,@R1
MOV DPTR,#TAB1
MOVC A,@A+DPTR
MOV SBUF,A ;送第2字节,送秒、分、时数据。
JNB TI,$
CLR TI
MOV A,R2
MOV DPTR,#TAB1
MOVC A,@A+DPTR
MOV SBUF,A ;送第3字节,送月、年数据。
JNB TI,$
CLR TI
INC R0
INC R1
INC R3
MOV A,R3
SETB PSW.4 ;选2组寄存器
MOV R0,A
MOV A,@R0
CLR PSW.4
MOV R2,A
MOV A,R0
CJNE A,#78H,PLAY2
MOV R0,#50H
PLAY2: CJNE A,#54H,PLAY3
MOV R0,#78H
PLAY3: MOV A,R5
MOV P2,A
LCALL DL500us
MOV A,R5
JNB ACC.6,PLAYOUT
RL A
MOV R5,A
MOV A,R0
CJNE A,#77H,JNDATE ;日的高位消隐
MOV A,77H
CJNE A,#00,JNDATE
MOV 77H,#0BH
JNDATE:CJNE A,#51H,JNMONTH ;农历日的高位消隐
MOV A,51H
CJNE A,#00,JNMONTH
MOV 51H,#0AH
JNMONTH: CJNE A,#53H,JHOUR ;农历月的高位消隐
MOV A,53H
CJNE A,#00,JHOUR
MOV 53H,#0AH
JHOUR: MOV A,R1
CJNE A,#75H,JOUT
MOV A,75H
CJNE A,#00,JOUT
MOV A,74H
CJNE A,#0,JJHOUR
AJMP JOUT
JJHOUR: MOV 75H,#0AH
JOUT:
LJMP PLAY1
PLAYOUT: SETB P2.6
RET
DL500uS: SETB PSW.3 ;选择一号寄存器
MOV R7,#180
DL1: DJNZ R7,DL1
CLR PSW.3
RET
;*****************************
;* 数据表 *
;*****************************
TAB1: DB 03H,9FH,25H,0DH,99H
DB 49H,41H,1FH,01H,09H,0FFH,0FDH
; ***************************
; * 公历年月日推算星期 *
; ***************************
; 以下子程序用于从当前公历日期 , 推算星期 ,
; 入口 :time_yeAr,time_month ,time_date , 定义公历年月日 ,BCD 码 , 其中月的
;BIT7 表示世纪 ,0 表示 20 世纪 ,1 表示 19 世纪 , 与 PCF8563 一致
; 出口 time_week, 0-6 表示星期日 - 星期六 , 与 PCF8563 一致 , 程序不改变入口数据
; 使用资源 :ACC,B,psw,temp_Byte1,temp_Byte2,temp_Byte3
GetWeek: MOV A,time_year
MOV B,#16
DIV AB
MOV week_Byte1,B
MOV B,#10
MUL AB
ADD A,week_Byte1
MOV week_Byte1,A ;temp_Byte1= 年
MOV A,time_month
JB ACC.7,getw02
MOV A,#100
ADD A,week_Byte1
MOV week_Byte1,A ;20 世纪年 +100
MOV A,time_month
CLR ACC.7
getw02: JNB ACC.4,getw04
ADD A,#10
CLR ACC.4
getw04: MOV week_Byte2,A ;temp_Byte2= 月
MOV A,time_day
MOV B,#16
DIV AB
MOV week_Byte3,B
MOV B,#10
MUL AB
ADD A,week_Byte3
MOV week_Byte3,A ;temp_Byte3= 日
MOV A,week_Byte1;
ANL A,#03h
JNZ getw10 ; 非闰年转移
MOV A,week_Byte2
CJNE A,#3,getw06
getw06: JNC getw10 ; 月大于 2 转移
DEC week_Byte3 ; 份小于等于 2, 又是闰年 , 日减 1
getw10: MOV A,week_Byte2;
LCALL get_CorreCt ; 取月校正表数据
ADD A,week_Byte1
MOV B,#7
DIV AB ;B 放年加校正日数之和后除 7 的余数不先做这一步
; 有可能数据溢出
MOV A,week_Byte1
ANL A,#0fCh
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -