📄 subroutine.asm
字号:
;;WAN NIAN LI SUBROUTINE PART
;;ESTABLISHED DATE: 2005/08/29
;;********************************************
;;INITIAL RAM
INI_RAM:
MOV A,28H
MOV MP0,A
MLP_INI_RAM:
CLR R0
INC MP0
MOV A,MP0
XOR A,80H
SNZ Z
JMP MLP_INI_RAM
MOV A,10010010B
MOV R_LEDFLAG,A ;;INITIATE YEAR 20,AM AND DOT LED
SET F_HOURMODE
SET F_UPDATEDATE
M_MOV R_ALARMON,0AAH
M_MOV R_ALARMNUMBER,01H
MOV A,18H
MOV R_ALARMHOUR1,A
MOV R_ALARMHOUR2,A
MOV R_HOUR,A
M_MOV R_TEMPERATURE,0B3H ;;INITIAL '--' CHARACTER
MOV A,55H
MOV R_TCODE1,A
MOV A,0AAH
MOV R_TCODE2,A
M_MOV R_DATE_SOLAR,C_DATE
M_MOV R_MONTH_SOLAR,C_MONTH
M_MOV R_YEAR_SOLAR,C_YEAR
RET
;;********************************************
INI_REGISTER:
MOV A,1FH
MOV PA,A
MOV A,0E0H
MOV PAC,A
MOV A,0E0H
MOV PB,A
MOV A,03H ;;PB3 IS RTC,PB4 IS RESISTOR
MOV PBC,A ;;PB2,PB3 AND PB4 PORT OUTPUT LOW LEVEL(DISCHARGING)
MOV A,0FFH
MOV PC,A ;;SETTING PC PORT INPUT
MOV PD,A ;;SETTING PD PORT INPUT
MOV PE,A ;;SETTING PE PORT INPUT
MOV A,00000100B
MOV INTC,A ;;SETTING THE CONTROL TIMER INTERRUPT ENABLE
MOV A,80H
MOV TMR,A
MOV A,10000000B
MOV TMRC,A ;;SETTING TIMER COUNTER MODE
RET
;;********************************************
;;CALCULATE CURRENT SOLAR CALENDAR DATE IS WHICH LUNAR CALENDAR
SBR_GETLUNARCALENDAR:
CLR F_NLEAPMONTH
CLR F_CLUNARDATEOK
CLR R_DAYNUMBERL
CLR R_DAYNUMBERH
CALL SBR_GETDAYSNUMBER ;;GET TOTAL DAYS FROM CURRENT DATE TO ONE DATE JANUARY SOLAR CALENDAR
MOV A,R_YEAR_SOLAR
CALL SBR_GETLUNARDATEOF1_1 ;;GET SOLAR DATE OF ONE DATE JANUARY LUNAR CALENDAR
MOV A,R_LUNARDATE_1
ADDM A,R_DAYNUMBERL
MOV A,0H
ADCM A,R_DAYNUMBERH
M_MOV R_MONTH_LUNAR,R_LUNARMONTH_1
MOV A,R_YEAR_SOLAR ;;GET NOVEMBER AND DECEMBER LUNAR MONTH ID OF LAST YEAR
DEC ACC
CALL SBR_GETLUNARMONTHID
M_MOV R_TEMP0,R_LUNARMONTHIDL
MOV A,R_YEAR_SOLAR ;;GET LEAP MONTH OF LAST YEAR
DEC ACC
CALL SBR_GETLEAPMONTH
SZ R_LEAPMONTH
JMP L_LYLEAPMONTH
JMP L_LYNOLEAPMONTH
L_LYLEAPMONTH: ;;LAST YEAR LEAP MONTH
CLR C
RLC R_TEMP0 ;;R_TEMP0 VALUE IS LUNAR MONTH ID OF LAST YEAR
SZ R_LUNARMONTHIDH.4
SET R_TEMP0.0
L_LYNOLEAPMONTH: ;;LAST YEAR NO LEAP MONTH
MOV A,R_YEAR_SOLAR
CALL SBR_GETLUNARMONTHID
MOV A,R_YEAR_SOLAR
CALL SBR_GETLEAPMONTH
CLR C
RLC R_LUNARMONTHIDL
RLC R_LUNARMONTHIDH
RLC R_LUNARMONTHIDL
RLC R_LUNARMONTHIDH
SZ R_LEAPMONTH
JMP L_CYLEAPMONTH
JMP L_CYNOLEAPMONTH
L_CYLEAPMONTH:
SZ R_LUNARMONTHIDH.6
SET R_LUNARMONTHIDL.1
CLR R_LUNARMONTHIDH.6
L_CYNOLEAPMONTH:
L_NOVEMBER_1_1:
SZ R_TEMP0.1
SET R_LUNARMONTHIDH.7
L_SETDECEMBERID:
SZ R_TEMP0.0
SET R_LUNARMONTHIDH.6
MOV A,R_MONTH_LUNAR
XOR A,0CH
SNZ Z ;;ONE DATE JANUARY SOLAR OF LUNAR MONTH IS DECEMBER OR NOVEMBER
JMP MLP_GETLUNARCALENDAR ;;NOVEMBER
RLC R_LUNARMONTHIDL ;;DECEMBER
RLC R_LUNARMONTHIDH
MLP_GETLUNARCALENDAR:
M_MOV R_TEMP0,C_BDAYS
RLC R_LUNARMONTHIDL
RLC R_LUNARMONTHIDH
SZ C
JMP L_GETLUNARMONTH
M_MOV R_TEMP0,C_SDAYS
L_GETLUNARMONTH:
MOV A,R_DAYNUMBERL
SUB A,R_TEMP0
SNZ C
JMP L_CHECKDAYNUMBERH ;;R_DAYNUMBERL<LUNAR MONTH DAYS
SNZ Z ;;R_DAYNUMBERL>=LUNAR MONTH DAYS
JMP L_INCLUNARMONTH ;;R_DAYNUMBERL>LUNAR MONTH DAYS
;;R_DAYNUMBERL=LUNAR MONTH DAYS
L_CHECKDAYNUMBERH:
SZ R_DAYNUMBERH
JMP L_DAYNUMBERHNEQU0
; JMP L_DAYNUMBERHEQU0
;;--------------------------------------------
L_DAYNUMBERHEQU0:
SET F_CLUNARDATEOK
SZ R_DAYNUMBERL
JMP L_GETLUNARDATE
MOV A,01H
MOV R_DATE_LUNAR,A
JMP L_INCLUNARMONTH
L_GETLUNARDATE:
MOV A,R_DAYNUMBERL
MOV R_DATE_LUNAR,A
RET
;;---------------------------------------------
L_DAYNUMBERHNEQU0:
SZ Z
INC R_DAYNUMBERH
DEC R_DAYNUMBERH
L_INCLUNARMONTH:
; CLR C
INC R_MONTH_LUNAR
MOV R_DAYNUMBERL,A
SNZ F_NLEAPMONTH ;;F_LEAPMONTH EQU 1,THEN INDICATED LAST MONTH IS LEAP MONTH,AND LUNAR MONTH NOT INCREMENT
JMP L_CHECKLEAPMONTH
DEC R_MONTH_LUNAR
CLR F_NLEAPMONTH
SET F_CLEAPMONTH ;;THE CURRENT MONTH IS LEAP MONTH
L_CHECKLEAPMONTH:
SZ R_LEAPMONTH
JMP $+2
JMP L_CHECKMONTH13 ;;CURRENT YEAR THERE IS NOT LEAPMONTH
MOV A,R_LEAPMONTH ;;CURRENT YEAR THERE IS LEAPMONTH
XOR A,R_MONTH_LUNAR
SNZ Z
JMP L_CHECKMONTH13 ;;CURRENT LUNAR MONTH IS NOT LEAPMONTH
; JMP L_CMONTHLEAPMONTH ;;CURRENT LUNAR MONTH IS LEAP MONTH
L_CMONTHLEAPMONTH:
CLR R_LEAPMONTH
SET F_NLEAPMONTH
; JMP L_CHECKMONTH13
L_CHECKMONTH13:
MOV A,R_MONTH_LUNAR
XOR A,0DH
SNZ Z
JMP L_CHECKGETLUNARCALENDAREND
MOV A,1H
MOV R_MONTH_LUNAR,A
; JMP L_CHECKGETLUNARCALENDAREND
L_CHECKGETLUNARCALENDAREND:
SNZ F_CLUNARDATEOK
JMP MLP_GETLUNARCALENDAR
RET
;;********************************************
SBR_GETWEEK:
CLR R_DAYNUMBERL
CLR R_DAYNUMBERH
CALL SBR_GETDAYSNUMBER
CALL SBR_GETWEEK1_1
MLP_GETWEEK:
MOV A,R_DAYNUMBERL
SUB A,07H
SNZ C
JMP L_CHECKDAYNUMBERH2 ;;R_DAYNUMBERL<7
MOV R_DAYNUMBERL,A ;;R_DAYNUMBERL>=7
SNZ Z
JMP MLP_GETWEEK ;;R_DAYNUMBERL>7
; JMP L_CHECKDAYNUMBERH2 ;;R_DAYNUMBERL=7
L_CHECKDAYNUMBERH2:
SZ R_DAYNUMBERH
JMP L_DECDAYNUMBERH2
MOV A,R_DAYNUMBERL
ADDM A,R_WEEK
MOV A,R_WEEK
SUB A,07H
SNZ C
JMP L_GETWEEK2 ;;R_DAYNUMBERH=0, AND R_WEEK<7
SZ Z ;;R_WEEK>=7
MOV A,08H ;;R_WEEK=7
MOV R_WEEK,A ;;R_WEEK>7
RET
L_GETWEEK2:
SZ R_WEEK
RET
MOV A,01H
MOV R_WEEK,A
RET
L_DECDAYNUMBERH2:
SZ Z
INC R_DAYNUMBERH
DEC R_DAYNUMBERH
MOV R_DAYNUMBERL,A
JMP MLP_GETWEEK
;;********************************************
SBR_GETSOLARTERM:
M_MOV R_SOLARTERMNUMBER,17H
MOV A,R_MONTH_SOLAR
SUB A,01H
MOV R_TEMP0,A
ADD A,R_TEMP0 ;;(R_MONTH_SOLAR-1)*2
ADDM A,R_SOLARTERMNUMBER
L_GETSOLARTERMSTART:
MOV A,R_MONTH_SOLAR
CALL SBR_GETSOLARTERMDATE
MOV A,R_YEAR_SOLAR
MOV TBLP,A
MOV A,R_MONTH_SOLAR
SUB A,07H
SNZ C
JMP L_GETSOLARTERMDELTADATELOW
; JMP L_GETSOLARTERMDELTADATEHIGH
L_GETSOLARTERMDELTADATEHIGH:
MOV R_TEMP0,A ;;R_TEMP0 IS MONTH
INC R_TEMP0 ;;IF JULY THEN R_TEMP0 EQU 0,SO IT IS INCREASE 1
MOV A,LOW T_SOLARTERMDELTADATEHIGH
ADDM A,TBLP
CALL SBR_GETSOLARTERMDELTADATEHIGH
JMP L_GETSOLARTERM
L_GETSOLARTERMDELTADATELOW:
M_MOV R_TEMP0,R_MONTH_SOLAR
MOV A,LOW T_SOLARTERMDELTADATELOW
ADDM A,TBLP
CALL SBR_GETSOLARTERMDELTADATELOW
; JMP L_GETSOLARTERM
L_GETSOLARTERM:
M_MOV R_TEMP3,TBLH
MOV A,R_TEMP0
ADDM A,R_TEMP0
DEC R_TEMP0
MLP_GETSOLARTERM:
SDZ R_TEMP0
JMP $+2
JMP L_GETSOLARTERMLOOPEND
CLR C
RRC R_TEMP3
RRC R_TEMP2
JMP MLP_GETSOLARTERM
L_GETSOLARTERMLOOPEND:
SZ R_TEMP2.0
INC R_SOLARTERMDATE
M_MOV R_TEMP0,R_SOLARTERMDATE ;;R_TEMP0 IS FIRST SOLARTERM DATE BACKUP
CLR C
RRC R_TEMP2
SZ R_TEMP2.0
INC R_TEMP1 ;;R_TEMP1 IS SECOND SOLARTERM DATE
M_MOV R_TEMP3,R_TEMP1 ;;R_TEMP3 IS SECOND SOLARTERM DATE BACKUP
MOV A,R_DATE_SOLAR
SUB A,R_SOLARTERMDATE
SZ C
JMP L_CHECKDELTADAYS_0 ;;R_DATE_SOLAR>=SOLAR TERM DATE(LOW)
L_GETDELTADAYS: ;;R_DATE_SOLAR<SOLAR TERM(LOW)
MOV A,R_SOLARTERMDATE
SUB A,R_DATE_SOLAR
MOV R_DELTADAYS,A
JMP L_GETSOLARTERMFINISHED
L_CHECKDELTADAYS_0: ;;CHECK CURRENT DATE IS OR NOT SOLARTERM
SZ Z
JMP L_GETDELTADAYS ;;R_DATE_SOLAR=SOLAR TERM DATE(LOW)
; JMP L_GETNEXTSOLARTERM ;;R_DATE_SOLAR>SOLAR TERM DATE(LOW)
L_GETNEXTSOLARTERM:
INC R_SOLARTERMNUMBER
MOV A,R_DATE_SOLAR
SUB A,R_TEMP1
SZ C
JMP L_CHECKNEXTDELTADAYS_0 ;;R_DATE_SOLAR>=SOLAR TERM DATE(HIGH)
L_GETNEXTDELTADAYS: ;;R_DATE_SOLAR<SOLAR TERM DATE(HIGH)
MOV A,R_TEMP1
SUB A,R_DATE_SOLAR
MOV R_DELTADAYS,A
M_MOV R_SOLARTERMDATE,R_TEMP1
JMP L_GETSOLARTERMFINISHED
L_CHECKNEXTDELTADAYS_0:
SZ Z
JMP L_GETNEXTDELTADAYS ;;R_DATE_SOLAR=SOLAR TERM DATE(HIGH)
; JMP L_GETNEXTMONTHSOLARTERM
;;--------------------------------------------
L_GETNEXTMONTHSOLARTERM: ;;R_DATE_SOLAR>SOLAR TERM DATE(HIGH)
INC R_SOLARTERMNUMBER
MOV A,R_MONTH_SOLAR
XOR A,0CH ;;THE CURRENT MONTH IS OR NOT DECEMBER
SZ Z
JMP L_NEXTYEARSOLARTERM ;;IS DECEMBER
MOV A,R_MONTH_SOLAR
XOR A,06H
SZ Z
JMP L_GETJULYSOLARTERM ;;IS JUNE
MOV A,R_MONTH_SOLAR ;;IS NOT DECEMBER
INC ACC ;;GET NEXT MONTH SOLARTERM DATE
CALL SBR_GETSOLARTERMDATE
CLR C
RRC R_TEMP2
SZ R_TEMP2.0
INC R_SOLARTERMDATE
MOV A,R_SOLARTERMDATE
MOV R_DELTADAYS,A
MOV A,R_MONTH_SOLAR
MOV TBLP,A
MOV A,LOW T_MONTHDAYS_WEEK
ADDM A,TBLP
CALL SBR_GETMONTHDAYS
; MOV A,TBLH
SUB A,R_DATE_SOLAR
ADDM A,R_DELTADAYS
JMP L_GETSOLARTERMFINISHED
;;--------------------------------------------
L_GETJULYSOLARTERM:
MOV A,R_YEAR_SOLAR
MOV TBLP,A
MOV A,LOW T_SOLARTERMDELTADATEHIGH
ADDM A,TBLP
CALL SBR_GETSOLARTERMDELTADATEHIGH
MOV A,07H
CALL SBR_GETSOLARTERMDATE
SZ R_TEMP2.0
INC R_SOLARTERMDATE
MOV A,R_SOLARTERMDATE
MOV R_DELTADAYS,A
MOV A,1EH ;;JUNE IS 30 DAYS
SUB A,R_DATE_SOLAR
ADDM A,R_DELTADAYS
JMP L_GETSOLARTERMFINISHED
;;--------------------------------------------
L_NEXTYEARSOLARTERM:
MOV A,01H
CALL SBR_GETSOLARTERMDATE
M_MOV R_DELTADAYS,R_SOLARTERMDATE
MOV A,R_YEAR_SOLAR
INC ACC
MOV TBLP,A
MOV A,LOW T_SOLARTERMDELTADATELOW
ADDM A,TBLP
CALL SBR_GETSOLARTERMDELTADATELOW
SZ R_TEMP2.0
INC R_DELTADAYS
MOV A,1FH ;;DECEMBER IS 31 DAYS
SUB A,R_DATE_SOLAR
ADDM A,R_DELTADAYS
JMP L_GETSOLARTERMFINISHED
;;-------------------------------------------
L_GETSOLARTERMFINISHED:
CLR R_SOLARTERMIDL
CLR R_SOLARTERMIDM
CLR R_SOLARTERMIDH
SET R_SOLARTERMIDH.6
MOV A,17H
SUB A,R_SOLARTERMNUMBER
SNZ C
JMP L_GETSOLARTERMNUMBER ;;17H<SOLARTERMNUMBER
SNZ Z ;;17H>=SOLARTERMNUMBER
JMP L_GETSOLARTERID ;;17H>SOLARTERMNUMBER
L_GETSOLARTERMNUMBER: ;;17H=SOLARTERMNUMBER
MOV A,R_SOLARTERMNUMBER ;;IF SOLARTERMNUMBER>17H,THEN SOLARTERNUMBER EQU (SOLARTERMNUMBER-18H)
SUB A,17H
MOV R_SOLARTERMNUMBER,A
CLR C
L_GETSOLARTERID:
SZ R_SOLARTERMNUMBER
JMP MLP_GETSOLARTERMID
JMP L_GETSOLARTERMIDRET
MLP_GETSOLARTERMID:
DEC R_SOLARTERMNUMBER
RLC R_SOLARTERMIDH
RLC R_SOLARTERMIDL
RLC R_SOLARTERMIDM
SZ C
RLC R_SOLARTERMIDH
JMP L_GETSOLARTERID
L_GETSOLARTERMIDRET:
M_MOV R_SOLARTERMIDHBAK,R_SOLARTERMIDH
M_MOV R_SOLARTERMIDMBAK,R_SOLARTERMIDM
M_MOV R_SOLARTERMIDLBAK,R_SOLARTERMIDL
SET F_STLEDINTIAL
CLR F_UPDATEDATE
RET
;;********************************************
SBR_GETCHARGINGTIME:
; SNZ F_CHARGING
; RET
; CLR F_CHARGING
SZ F_CHARGINGOK
RET
CLR R_TEMP0
CLR R_TEMP1
SNZ F_RTCCHARGING
JMP L_RESISTORCHARGING
; JMP L_RTCCHARGING
L_RTCCHARGING:
MOV A,00010100B
ORM A,PBC ;;PB2 AND PB4 PORT INPUT(NONE PULL-HIGH)
MOV A,00001000B
ORM A,PB ;;PB3(RTC) OUTPUT HIGH LEVEL
MLP_RTCCHARGING:
; SZ PB.2
MOV A,00000100B
XOR A,PB
SNZ ACC.2
JMP L_RTCCHARGINGOK
CLR WDT
MOV A,01H
ADDM A,R_TEMP0
; MOV A,00H
; ADCM A,R_TEMP1
JMP MLP_RTCCHARGING
L_RTCCHARGINGOK:
MOV A,0E3H
ANDM A,PB
ANDM A,PBC
MOV A,R_TEMP0
ADDM A,R_RTCCTL
MOV A,00H
ADCM A,R_RTCCTH
CLR F_RTCCHARGING
INC R_CHARGINGCOUNT
SNZ R_CHARGINGCOUNT.3 ;;CHARGING 8 TIMES FINISHED OR NOT
JMP L_CHARGINGRET ;;NOT CHARGING 8 TIMES
CLR R_CHARGINGCOUNT
SET F_CHARGINGOK
MOV A,04H
MOV R_TEMP2,A
MLP_CHECKDIVEND:
SDZ R_TEMP2
JMP L_DIV
JMP L_CHARGINGRET
L_DIV:
CLR C ;;CHARGING 8 TIMES
RRC R_RTCCTH
RRC R_RTCCTL
CLR C
RRC R_RESISTORCTH
RRC R_RESISTORCTL
JMP MLP_CHECKDIVEND
L_CHARGINGRET:
RET
;;--------------------------------------------
L_RESISTORCHARGING:
MOV A,00001100B ;;PB2 AND PB3 INPUT(NONE PULL-HIGH)
ORM A,PBC
MOV A,00010000B ;;PB4(RESISTOR) OUTPUT HIGH LEVEL(CHARGING)
ORM A,PB
MLP_RESISTORCHARGING:
; SZ PB.2
MOV A,00000100B
XOR A,PB
SNZ ACC.2
JMP L_RESISTORCHARGINGOK
CLR WDT
MOV A,01H
ADDM A,R_TEMP0
JMP MLP_RESISTORCHARGING
L_RESISTORCHARGINGOK:
MOV A,0E3H
ANDM A,PB
ANDM A,PBC
MOV A,R_TEMP0
ADDM A,R_RESISTORCTL
MOV A,00H
ADCM A,R_RESISTORCTH
SET F_RTCCHARGING
RET
;;********************************************
SBR_GETTEMPERATURE:
SNZ F_CHARGINGOK
RET
SZ F_TEMPTABLE
JMP L_GETTEMPERATURE
L_CHECKRTCCTL:
SZ R_RTCCTL
JMP L_CHECKRESISTORCTL
JMP L_TEMPERATUREERROR
L_CHECKRESISTORCTL:
SZ R_RESISTORCTL
JMP MLP_GETINTEGER
JMP L_TEMPERATUREERROR
;;---------------------------------------------
MLP_GETINTEGER: ;;GET R_RTCCT/R_RESISTORCT INTEGER PART
MOV A,R_RTCCTL
SUB A,R_RESISTORCTL
SNZ C
JMP L_GETDECIMAL2 ;;R_RTCCTL<R_RESISTORCTL
INC R_RTCINT ;;R_RTCCTL>=R_RESISTORCTL
SZ Z
; JMP L_GETINTEGEREND
JMP L_CHECKRTCINT ;;R_RTCCTL=R_RESISTORCTL
MOV R_RTCCTL,A ;;R_RTCCTL>R_RESISTORCTL
JMP MLP_GETINTEGER
;L_GETINTEGEREND:
; JMP L_CHECKRTCINT
L_GETDECIMAL2: ;;GET R_RTCCT/R_RESISTORCT DECIMAL PART
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -