📄 subroutine.asm
字号:
;;
;;SUBROUTINE PART
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ISR_TIMER:
M_PUSH
CLR TMRC.4
SDZ R_TMRH
JMP ISR_TIMEREXIT
CLR PD.0
MOV A,0FBH
MOV R_TMRH,A
MOV A,0FH
ORM A,PA ;;SETTING PA.0,PA.1,PA.2,PA.3 HIGH LEVEL SO THAT BATTERIES STOP CHARGING
CALL SBR_DELAY50MS
;;----------------------------------------------------
L_C_BAT1STATUS:
CLR WDT
MOV A,28H
MOV ADCR,A ;;CHECK BATTERY 1 STATUS
CALL SBR_CHECKBATSTATUS
SNZ F_BAT1ON
JMP L_C_BAT1REMOVED
SZ F_OCBAT1
JMP L_BAT1CHARGINGOK
JMP L_C_BAT2STATUS
L_C_BAT1REMOVED:
MOV A,02H
ORM A,PC ;;SET PC.1 HIGH LEVEL, IF THERE IS NO BATTERY 1 IN THE PACK
CLR F_OLDBAT1
JMP L_BAT1CHARGINGEXIT
L_BAT1CHARGINGOK:
MOV A,0FDH
ANDM A,PC
SET F_OLDBAT1
L_BAT1CHARGINGEXIT:
CLR F_BAT1CHARGE
CLR R_BAT1CHARGETIMEL
CLR R_BAT1CHARGETIMEH
CLR R_BAT1VPEAKTIMEL
CLR R_BAT1VPEAKTIMEH
CLR R_BAT1_VPEAKVL
CLR R_BAT1_VPEAKVH
;;-----------------------------------------------------
L_C_BAT2STATUS:
CLR WDT
MOV A,29H
MOV ADCR,A ;;CHECK BATTERY 2 STATUS
CALL SBR_CHECKBATSTATUS
SNZ F_BAT2ON
JMP L_C_BAT2REMOVED
SZ F_OCBAT2
JMP L_BAT2CHARGINGOK
JMP L_C_BAT3STATUS
L_C_BAT2REMOVED:
MOV A,04H
ORM A,PC
CLR F_OLDBAT2
JMP L_BAT2CHARGINGEXIT
L_BAT2CHARGINGOK:
MOV A,0FBH
ANDM A,PC
SET F_OLDBAT2
L_BAT2CHARGINGEXIT:
CLR F_BAT2CHARGE
CLR R_BAT2CHARGETIMEL
CLR R_BAT2CHARGETIMEH
CLR R_BAT2VPEAKTIMEL
CLR R_BAT2VPEAKTIMEH
CLR R_BAT2_VPEAKVL
CLR R_BAT2_VPEAKVH
;;------------------------------------------------------
L_C_BAT3STATUS:
CLR WDT
MOV A,2AH
MOV ADCR,A ;;CHECK BATTERY 3 STATUS
CALL SBR_CHECKBATSTATUS
SNZ F_BAT3ON
JMP L_C_BAT3REMOVED
SZ F_OCBAT3
JMP L_BAT3CHARGINGOK
JMP L_C_BAT4STATUS
L_C_BAT3REMOVED:
MOV A,08H
ORM A,PC
CLR F_OLDBAT3
JMP L_BAT3CHARGINGEXIT
L_BAT3CHARGINGOK:
MOV A,0F7H
ANDM A,PC
SET F_OLDBAT3
L_BAT3CHARGINGEXIT:
CLR F_BAT3CHARGE
CLR R_BAT3CHARGETIMEL
CLR R_BAT3CHARGETIMEH
CLR R_BAT3VPEAKTIMEL
CLR R_BAT3VPEAKTIMEH
CLR R_BAT3_VPEAKVL
CLR R_BAT3_VPEAKVH
;;----------------------------------------------------
L_C_BAT4STATUS:
CLR WDT
MOV A,2BH
MOV ADCR,A ;;CHECK BATTERY 4 STATUS
CALL SBR_CHECKBATSTATUS
SNZ F_BAT4ON
JMP L_C_BAT4REMOVED
SZ F_OCBAT4
JMP L_BAT4CHARGINGOK
JMP L_CHECKCHARGINGFLAG
L_C_BAT4REMOVED:
MOV A,10H
ORM A,PC
CLR F_OLDBAT4
JMP L_BAT4CHARGINGEXIT
L_BAT4CHARGINGOK:
MOV A,0EFH
ANDM A,PC
SET F_OLDBAT4
L_BAT4CHARGINGEXIT:
CLR F_BAT4CHARGE
CLR R_BAT4CHARGETIMEL
CLR R_BAT4CHARGETIMEH
CLR R_BAT4VPEAKTIMEL
CLR R_BAT4VPEAKTIMEH
CLR R_BAT4_VPEAKVL
CLR R_BAT4_VPEAKVH
;;----------------------------------------------------
L_CHECKCHARGINGFLAG:
CLR WDT
MOV A,0F0H
AND A,R_FLAG2
SWAP ACC
ADDM A,PCL
JMP L_CHECKCHARGINGFLAG0 ;;IF THE F_BATXCHARGE EQU 1
JMP L_CHECKCHARGINGFLAG1 ;;IF THE F_BAT1CHARGE EQU 1
JMP L_CHECKCHARGINGFLAG2 ;;IF THE F_BAT2CHARGE EQU 1
JMP ISR_TIMEREXIT
JMP L_CHECKCHARGINGFLAG3 ;;IF THE F_BAT3CHARGE EQU 1
JMP ISR_TIMEREXIT
JMP ISR_TIMEREXIT
JMP ISR_TIMEREXIT
JMP L_CHECKCHARGINGFLAG4 ;;IF THE F_BAT4CHARGE EQU 1
JMP ISR_TIMEREXIT
JMP ISR_TIMEREXIT
JMP ISR_TIMEREXIT
JMP ISR_TIMEREXIT
JMP ISR_TIMEREXIT
JMP ISR_TIMEREXIT
JMP ISR_TIMEREXIT
;;-----------------------------------------------------
L_CHECKCHARGINGFLAG0:
L_CHECKCHARGINGFLAG0_BAT1:
SNZ F_BAT1ON
JMP L_CHECKCHARGINGFLAG0_BAT2
SZ F_OCBAT1
JMP L_CHECKCHARGINGFLAG0_BAT2
SZ F_OLDBAT1
JMP L_CHECKCHARGINGFLAG0_BAT2
SET F_BAT1CHARGE
MOV A,02H
XORM A,PC
JMP ISR_TIMEREXIT
L_CHECKCHARGINGFLAG0_BAT2:
SNZ F_BAT2ON
JMP L_CHECKCHARGINGFLAG0_BAT3
SZ F_OCBAT2
JMP L_CHECKCHARGINGFLAG0_BAT3
SZ F_OLDBAT2
JMP L_CHECKCHARGINGFLAG0_BAT3
SET F_BAT2CHARGE
MOV A,04H
XORM A,PC
JMP ISR_TIMEREXIT
L_CHECKCHARGINGFLAG0_BAT3:
SNZ F_BAT3ON
JMP L_CHECKCHARGINGFLAG0_BAT4
SZ F_OCBAT3
JMP L_CHECKCHARGINGFLAG0_BAT4
SZ F_OLDBAT3
JMP L_CHECKCHARGINGFLAG0_BAT4
SET F_BAT3CHARGE
MOV A,08H
XORM A,PC
JMP ISR_TIMEREXIT
L_CHECKCHARGINGFLAG0_BAT4:
SNZ F_BAT4ON
JMP ISR_TIMEREXIT
SZ F_OCBAT4
JMP ISR_TIMEREXIT
SZ F_OLDBAT4
JMP ISR_TIMEREXIT
SET F_BAT4CHARGE
MOV A,10H
XORM A,PC
JMP ISR_TIMEREXIT
;;-----------------------------------------------------
L_CHECKCHARGINGFLAG1:
MOV A,0FH
ANDM A,R_FLAG2 ;;SETTING THE R_FLAG2 HIGH NIBBLE EQU 0
MOV A,01H
ADDM A,R_BAT1CHARGETIMEL
MOV A,00H
ADCM A,R_BAT1CHARGETIMEH
MOV A,01H
ADDM A,R_BAT1VPEAKTIMEL
MOV A,00H
ADCM A,R_BAT1VPEAKTIMEH
L_CHECKCHARGINGFLAG1_BAT2:
SNZ F_BAT2ON
JMP L_CHECKCHARGINGFLAG1_BAT3
SZ F_OCBAT2
JMP L_CHECKCHARGINGFLAG1_BAT3
SZ F_OLDBAT2
JMP L_CHECKCHARGINGFLAG1_BAT3
SET F_BAT2CHARGE
MOV A,04H
XORM A,PC
JMP ISR_TIMEREXIT
L_CHECKCHARGINGFLAG1_BAT3:
SNZ F_BAT3ON
JMP L_CHECKCHARGINGFLAG1_BAT4
SZ F_OCBAT3
JMP L_CHECKCHARGINGFLAG1_BAT4
SZ F_OLDBAT3
JMP L_CHECKCHARGINGFLAG1_BAT4
SET F_BAT3CHARGE
MOV A,08H
XORM A,PC
JMP ISR_TIMEREXIT
L_CHECKCHARGINGFLAG1_BAT4:
SNZ F_BAT4ON
JMP L_CHECKCHARGINGFLAG1_BAT1
SZ F_OCBAT4
JMP L_CHECKCHARGINGFLAG1_BAT1
SZ F_OLDBAT4
JMP L_CHECKCHARGINGFLAG1_BAT1
SET F_BAT4CHARGE
MOV A,10H
XORM A,PC
JMP ISR_TIMEREXIT
L_CHECKCHARGINGFLAG1_BAT1:
SNZ F_BAT1ON
JMP ISR_TIMEREXIT
SZ F_OCBAT1
JMP ISR_TIMEREXIT
SZ F_OLDBAT1
JMP ISR_TIMEREXIT
SET F_BAT1CHARGE
MOV A,02H
XORM A,PC ;;CPL PC.1
JMP ISR_TIMEREXIT
;;-----------------------------------------------------
L_CHECKCHARGINGFLAG2:
MOV A,0FH
ANDM A,R_FLAG2 ;;SETTING THE R_FLAG2 HIGH NIBBLE EQU 0
MOV A,01H
ADDM A,R_BAT2CHARGETIMEL
MOV A,00H
ADCM A,R_BAT2CHARGETIMEH
MOV A,01H
ADDM A,R_BAT2VPEAKTIMEL
MOV A,00H
ADCM A,R_BAT2VPEAKTIMEH
L_CHECKCHARGINGFLAG2_BAT3:
SNZ F_BAT3ON
JMP L_CHECKCHARGINGFLAG2_BAT4
SZ F_OCBAT3
JMP L_CHECKCHARGINGFLAG2_BAT4
SZ F_OLDBAT3
JMP L_CHECKCHARGINGFLAG2_BAT4
SET F_BAT3CHARGE
MOV A,08H
XORM A,PC
JMP ISR_TIMEREXIT
L_CHECKCHARGINGFLAG2_BAT4:
SNZ F_BAT4ON
JMP L_CHECKCHARGINGFLAG2_BAT1
SZ F_OCBAT4
JMP L_CHECKCHARGINGFLAG2_BAT1
SZ F_OLDBAT4
JMP L_CHECKCHARGINGFLAG2_BAT1
SET F_BAT4CHARGE
MOV A,10H
XORM A,PC
JMP ISR_TIMEREXIT
L_CHECKCHARGINGFLAG2_BAT1:
SNZ F_BAT1ON
JMP L_CHECKCHARGINGFLAG2_BAT2
SZ F_OCBAT1
JMP L_CHECKCHARGINGFLAG2_BAT2
SZ F_OLDBAT1
JMP L_CHECKCHARGINGFLAG2_BAT2
SET F_BAT1CHARGE
MOV A,02H
XORM A,PC
JMP ISR_TIMEREXIT
L_CHECKCHARGINGFLAG2_BAT2:
SNZ F_BAT2ON
JMP ISR_TIMEREXIT
SZ F_OCBAT2
JMP ISR_TIMEREXIT
SZ F_OLDBAT2
JMP ISR_TIMEREXIT
SET F_BAT2CHARGE
MOV A,04H
XORM A,PC ;;CPL PC.2
JMP ISR_TIMEREXIT
;;-----------------------------------------------------
L_CHECKCHARGINGFLAG3:
MOV A,0FH
ANDM A,R_FLAG2 ;;SETTING THE R_FLAG2 HIGH NIBBLE EQU 0
MOV A,01H
ADDM A,R_BAT3CHARGETIMEL
MOV A,00H
ADCM A,R_BAT3CHARGETIMEH
MOV A,01H
ADDM A,R_BAT3VPEAKTIMEL
MOV A,00H
ADCM A,R_BAT3VPEAKTIMEH
L_CHECKCHARGINGFLAG3_BAT4:
SNZ F_BAT4ON
JMP L_CHECKCHARGINGFLAG3_BAT1
SZ F_OCBAT4
JMP L_CHECKCHARGINGFLAG3_BAT1
SZ F_OLDBAT4
JMP L_CHECKCHARGINGFLAG3_BAT1
SET F_BAT4CHARGE
MOV A,10H
XORM A,PC
JMP ISR_TIMEREXIT
L_CHECKCHARGINGFLAG3_BAT1:
SNZ F_BAT1ON
JMP L_CHECKCHARGINGFLAG3_BAT2
SZ F_OCBAT1
JMP L_CHECKCHARGINGFLAG3_BAT2
SZ F_OLDBAT1
JMP L_CHECKCHARGINGFLAG3_BAT2
SET F_BAT1CHARGE
MOV A,02H
XORM A,PC
JMP ISR_TIMEREXIT
L_CHECKCHARGINGFLAG3_BAT2:
SNZ F_BAT2ON
JMP L_CHECKCHARGINGFLAG3_BAT3
SZ F_OCBAT2
JMP L_CHECKCHARGINGFLAG3_BAT3
SZ F_OLDBAT2
JMP L_CHECKCHARGINGFLAG3_BAT3
SET F_BAT2CHARGE
MOV A,04H
XORM A,PC
JMP ISR_TIMEREXIT
L_CHECKCHARGINGFLAG3_BAT3:
SNZ F_BAT3ON
JMP ISR_TIMEREXIT
SZ F_OCBAT3
JMP ISR_TIMEREXIT
SZ F_OLDBAT3
JMP ISR_TIMEREXIT
SET F_BAT3CHARGE
MOV A,08H
XORM A,PC ;;CPL PC.3
JMP ISR_TIMEREXIT
;;-----------------------------------------------------
L_CHECKCHARGINGFLAG4:
MOV A,0FH
ANDM A,R_FLAG2 ;;SETTING THE R_FLAG2 HIGH NIBBLE EQU 0
MOV A,01H
ADDM A,R_BAT4CHARGETIMEL
MOV A,00H
ADCM A,R_BAT4CHARGETIMEH
MOV A,01H
ADDM A,R_BAT4VPEAKTIMEL
MOV A,00H
ADCM A,R_BAT4VPEAKTIMEH
L_CHECKCHARGINGFLAG4_BAT1:
SNZ F_BAT1ON
JMP L_CHECKCHARGINGFLAG4_BAT2
SZ F_OCBAT1
JMP L_CHECKCHARGINGFLAG4_BAT2
SZ F_OLDBAT1
JMP L_CHECKCHARGINGFLAG4_BAT2
SET F_BAT1CHARGE
MOV A,02H
XORM A,PC
JMP ISR_TIMEREXIT
L_CHECKCHARGINGFLAG4_BAT2:
SNZ F_BAT2ON
JMP L_CHECKCHARGINGFLAG4_BAT3
SZ F_OCBAT2
JMP L_CHECKCHARGINGFLAG4_BAT3
SZ F_OLDBAT2
JMP L_CHECKCHARGINGFLAG4_BAT3
SET F_BAT2CHARGE
MOV A,04H
XORM A,PC
JMP ISR_TIMEREXIT
L_CHECKCHARGINGFLAG4_BAT3:
SNZ F_BAT3ON
JMP L_CHECKCHARGINGFLAG4_BAT4
SZ F_OCBAT3
JMP L_CHECKCHARGINGFLAG4_BAT4
SZ F_OLDBAT3
JMP L_CHECKCHARGINGFLAG4_BAT4
SET F_BAT3CHARGE
MOV A,08H
XORM A,PC
JMP ISR_TIMEREXIT
L_CHECKCHARGINGFLAG4_BAT4:
SNZ F_BAT4ON
JMP ISR_TIMEREXIT
SZ F_OCBAT4
JMP ISR_TIMEREXIT
SZ F_OLDBAT4
JMP ISR_TIMEREXIT
SET F_BAT4CHARGE
MOV A,10H
XORM A,PC ;;CPL PC.4
JMP ISR_TIMEREXIT
;;-----------------------------------------------------
ISR_TIMEREXIT:
M_POP
SET TMRC.4
RETI
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SBR_CHECKBATSTATUS:
CALL SBR_ADCONVERT
MOV A,ADRL
MOV R_ADRL_TEMP1,A
MOV A,ADRH
MOV R_ADRH_TEMP1,A
CALL SBR_ADCONVERT
MOV A,ADRL
MOV R_ADRL_TEMP2,A
MOV A,ADRH
MOV R_ADRH_TEMP2,A
CALL SBR_ADCONVERT
MOV A,ADRL
MOV R_ADRL_TEMP3,A
MOV A,ADRH
MOV R_ADRH_TEMP3,A
CALL SBR_AD_FILTER
CALL SBR_CONVERT16212
M_JLESS R_ADRL_BAK,R_ADRH_BAK,V100MVL,V100MVH,L_BAT_LESS_0D1V ;;CHECK THERE HAVE OR NOT BATTERY IN THE PACK
M_JLESS R_ADRL_BAK,R_ADRH_BAK,DISCHARGEVL,DISCHARGEVH,L_BAT_LESS_1D15V
M_JLESS R_ADRL_BAK,R_ADRH_BAK,QCHARGEVL,QCHARGEVH,L_BAT_LESS_1D25V
M_JLESS R_ADRL_BAK,R_ADRH_BAK,MAXVL,MAXVH,L_BAT_LESS_1D55V ;;CHECK EACH BATTERY VOLTAGE IS OR NOT LESS THAN 1.8V
L_BAT_BIGGER_1D55V:
MOV A,07H
AND A,ADCR
MOV R_TEMP1,A
L_BAT1_BIGGER_1D55V:
MOV A,00H
XOR A,R_TEMP1
SNZ Z
JMP L_BAT2_BIGGER_1D55V
SET F_BAT1ON
SET F_OCBAT1
CLR F_QCBAT1
CLR F_DISCHARGEOK1
RET
L_BAT2_BIGGER_1D55V:
MOV A,01H
XOR A,R_TEMP1
SNZ Z
JMP L_BAT3_BIGGER_1D55V
SET F_BAT2ON
SET F_OCBAT2
CLR F_QCBAT2
CLR F_DISCHARGEOK2
RET
L_BAT3_BIGGER_1D55V:
MOV A,02H
XOR A,R_TEMP1
SNZ Z
JMP L_BAT4_BIGGER_1D55V
SET F_BAT3ON
SET F_OCBAT3
CLR F_QCBAT3
CLR F_DISCHARGEOK3
RET
L_BAT4_BIGGER_1D55V:
MOV A,03H
XOR A,R_TEMP1
SNZ Z
RET
SET F_BAT4ON
SET F_OCBAT4
CLR F_QCBAT4
CLR F_DISCHARGEOK4
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -