MOV B,#16
DIV AB
MOV TEMP_BYTE3,B
MOV B,#10
MUL AB
ADD A,TEMP_BYTE3
MOV TEMP_BYTE3,A ;TEMP_BYTE3=日
MOV A,TEMP_BYTE1;
ANL A,#03H
JNZ GETW10 ;非闰年转移
MOV A,TEMP_BYTE2
CJNE A,#3,GETW06
GETW06: JNC GETW10 ;月大于2 转移
DEC TEMP_BYTE3 ;月份小于等于2,又是闰年,日减1
GETW10: MOV A,TEMP_BYTE2;
LCALL GET_CORRECT ;取月校正表数据
ADD A,TEMP_BYTE1
MOV B,#7
DIV AB ;B放年加校正日数之和后除7 的余数不先做这一步
;有可能数据溢出
MOV A,TEMP_BYTE1
ANL A,#0FCH
RR A
RR A ;以上年除4 即闰年数
ADD A,B
ADD A,TEMP_BYTE3
DEC A;
MOV B,#7
DIV AB
MOV A,B;
MOV WEEK,B;
RET
GET_CORRECT:
MOVC A,@A+PC
RET
DB 0,3,3,6,1,4,6,2,5,0,3,5
;***********************************************************
;以下为公历转农历子程序
;入口信息:
;出口信息:
;影响资源:
;占用资源:
;***********************************************************
GONG_NONG: MOV A,YEAR_SG ;将年月日转化为HEX 格式
MOV B,#16
DIV AB
MOV NONG_YEAR_SG,B
MOV B,#10
MUL AB
ADD A,NONG_YEAR_SG
MOV NONG_YEAR_SG,A
MOV A,MONTH_SG
JNB ACC.4,CON_02
CLR ACC.4 ;ACC.4 为1 表示大于10 月
ADD A,#10
CON_02: MOV NONG_MONTH_SG,A
MOV A,DATE_SG
MOV B,#16
DIV AB
MOV NONG_DATE_SG,B
MOV B,#10
MUL AB
ADD A,NONG_DATE_SG
MOV NONG_DATE_SG,A
MOV DPTR,#MONTH_DATA ;以下定位本年数据在表格中的位置
MOV A,NONG_YEAR_SG
CLR C
SUBB A,#START_YEAR;
MOV B,#3;表格每年3 字节
MUL AB
ADD A,DPL
MOV DPL,A
MOV A,B
ADDC A,DPH
MOV DPH,A
MOV A,#2
MOVC A,@A+DPTR ;读本年表格最后一字节(春节日期)
CLR ACC.7 ;ACC.7 是闰年第13 个月大小,在此不用
MOV B,#32
DIV AB
MOV TEMP_BYTE1,A ;春节月份
MOV TEMP_BYTE2,B ;春节日
; 以下计算当前日期距元旦天数
MOV TEMP_BYTE3,#0 ;设距元旦天数高位为0
MOV A,NONG_MONTH_SG
CJNE A,#10,CON_08
CON_08: JC CON_09 ;9月以前日子数小于256 天,高字节为0
(9 月份过去的整月为8 个月)
MOV TEMP_BYTE3,#1
CON_09: MOV A,NONG_YEAR_SG
ANL A,#03H ;ACC 为除4 的余数
JNZ CON_10 ;转常年处理
; 年除4 余数为0 是闰年














