📄 battery_check.asm.bak
字号:
;************************************
include HT46R47.inc
;*************************************
;*************************************************
data .section 'data'
on_01 db ?
off_01 db ?
on_off_bit db ?
onpower_ch db ?
timer_in db ?
time5min db ?
time_a db ?
time30min db ?
time60min db ?
adbuf_h db ?
adbuf_hc db ?
adbuf_l db ?
adbuf_lc db ?
adcnt db ?
times1_bit db ?
check_power_bit db ?
check_power_in db ?
check_power_5min db ?
adcr_bak db ?
pac_bak db ?
pa_bak db ?
pbc_bak db ?
pb_bak db ?
intc_bak db ?
temp db ?
;***************************************
code .section at 0 'code'
org 000h
jmp main
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
org 004h ;external interrupt
jmp exitint
reti
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
org 008h ;intial timer interrupt
jmp timint
reti
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
org 00ch ;intial a/d converter interrupt
nop
reti
;***************************************
; external interrupt
exitint:
nop
reti
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;timing interrupt
timint: ;timer interrupt ISR
dec timer_in ;timer interrupt 1 times is 8ms
dec check_power_in
reti
;***************************************
mmov macro a1,b1
mov a,b1
mov a1,a
endm
;***************************************
;initial process section
initial:
clr intc
clr tmrc
clr adcr
clr on_off_bit
clr on_01
clr status
; I/O setup
mmov pa, 0h ;pa0 pa3 pa7 input
mmov pac, 089h ;pa1 pa2 pa5 pa6 output,pa4 timer, enabled
mmov pbc, 08h ;pb3 input ,pb0 is a/d
mmov pb, 0h ;pb1, pb2 is output
set pdc ;pd0 input
clr pd
; check batter power setup
mmov adcnt, 0fch ;set consecutive times
mmov onpower_ch, 01h ;on power check battery
mmov times1_bit, 02h
mmov check_power_bit, 01h
mmov check_power_in, 0fah
clr adbuf_h
clr adbuf_hc
clr adbuf_l
; clear ram
mov a, 40h ;general purpose data memory
mov mp, a
clrram: ;clear data memory
clr r0
inc mp
inc temp
mov a, temp
xor a, 07fh ;data memory end address
sz z
jmp clrram
;timer setup
mmov tmrc, 097h ;time clock is fsys/128
mmov tmr, 06h ;timer is 8ms
mmov timer_in, 019h ;1time interrupt is 2s(8msX250=2000ms)
mmov time5min, 096h
mmov time_a, 064h ;200s loop
mmov time30min, 09h
mmov time60min, 012h
mmov intc, 055h ;enable only timer interrupt.
ret
;***************************************
; before sleep, backup all I/O status, backup all register's
sleep:
mmov intc_bak, intc
mmov adcr_bak, adcr
mmov pac_bak, pac
mmov pa_bak, pa
mmov pbc_bak, pbc
mmov pb_bak, pb
mmov pac, 0h
mmov pa, 0h
mmov pbc, 0h
mmov pb, 0h
mmov adcr, 0h
mmov intc, 063h
halt
mmov intc, intc_bak
mmov pac, pac_bak
mmov pa, pa_bak
clr pa.7
mmov pbc, pbc_bak
mmov pb, pb_bak
mmov timer_in, 0fah ;2s
mmov time5min, 096h ;2X150=300s
mmov time_a, 064h ;2X100=200s loop
mmov time30min, 09h ;200X9=30min loop
mmov time60min, 012h ;200X18=60min loop
ret
;***************************************
adpro: ;A/D conversion
dec times1_bit
mmov adcr, 08h ;pb0 is a/d pin
mmov acsr, 02h ;a/d clock is fsys/32
clr adcr.7
nop
nop
nop
set adcr.7 ; reset A/D
nop
nop
nop
clr adcr.7 ; start A/D
lpask:
sz adcr.6 ; poll the ADCR register EOCB bit to detect end of A/D conversion
jmp lpask
sz times1_bit
jmp adpro
mmov times1_bit, 01h
mov a, adrh ;read A/D conversion result
addm a, adbuf_h ;to add
sz status.0
inc adbuf_hc
mmov temp, adrl
mov a, 080h
and a, temp
snz status.2
inc adbuf_l
siz adcnt
jmp adpro ;4 times convert if end? no, return
mmov onpower_ch, 0h
mmov adcnt, 0fch ;update times of continue conversion
clr status.0
rrc adbuf_hc
rrc adbuf_h ;AD result/2
rr adbuf_l
; clr status.0
rrc adbuf_h ;AD result/2, get average of 4_times and save average to adbuf_h
rrc adbuf_hc
rr adbuf_l
rl adbuf_h
mov a, 01h
and a, adbuf_l
addm a, adbuf_h
call voltage_check ;battery voltage check
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
voltage_check: ;b5-3.5v c4-3.8v cf-4.0v d9-4.2v;;;;vdd is 3.27v
mov a, 0b5h ;7a-3.6v(1.2) 7e-3.7v(1.233) 8a-4.1v(1.366) 8e-4.2v(1.4)
sub a, adbuf_h ;c=0 if result is negative
sz status.0
jmp voltage_35 ;voltage>=3.5V
mov a, 0c4h
sub a, adbuf_h
sz status.0
jmp voltage_38 ;voltage>=3.8v
mov a, 0cfh
sub a, adbuf_h
sz status.0
jmp voltage_40 ;voltage>=4.0v
mov a, 0d9h
sub a, adbuf_h
sz status.0
jmp voltage_42 ;voltage>=4.2v
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
voltage_42:
clr adbuf_h
clr adbuf_hc
clr adbuf_l
clr pb.1
clr pb.2
ret
voltage_40:
clr adbuf_h
clr adbuf_hc
clr adbuf_l
clr pb.1
set pb.2
ret
voltage_38:
clr adbuf_h
clr adbuf_hc
clr adbuf_l
set pb.1
clr pb.2
ret
voltage_35:
clr adbuf_h
clr adbuf_hc
clr adbuf_l
set pb.1
set pb.2
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 5min check power 1times
check_power:
sz onpower_ch ;if first open pvi ,so check power of battery
call adpro
clr status.2
mov a, 0fah
and a, check_power_in ;if timer_in=0 so result is 0
snz status.2 ;if result=0 so status.2=1
ret ;1 times loop is 2s
mmov check_power_in, 0fah
clr status.2
dec check_power_5min ;time5min is 150
snz status.2 ;2X150=300s is 5 minutes
ret
mmov check_power_5min, 096h ;reset time5min=150
call adpro
mmov check_power_bit, 01h ;5min time reached, call ouptu I/O set
ret
;***************************************
; enter timing mode , backup register
bak:
mmov adcr, 0h
clr pa.2
; mmov pac_bak, pac
; mmov pa_bak, pa
; mmov pbc_bak, pbc
; mmov pb_bak, pb
mmov intc_bak, intc
; mmov pac, 0h
; mmov pa, 04h
; mmov pbc, 0h
; mmov pb, 0h
mmov intc, 055h
; clr pdc
; clr pd
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; timing end , comeback register and reset timer paramiter
back_write:
mmov intc, intc_bak
; mmov pac, pac_bak
; mmov pa, pa_bak
; clr pa.7
; mmov pbc, pbc_bak
; mmov pb, pb_bak
; set pdc
; clr pd
set pa.2
mmov timer_in, 019h ;2s
mmov time5min, 096h ;2X150=300s
mmov time_a, 064h ;2X100=200s loop
mmov time30min, 09h ;200X9=30min loop
mmov time60min, 012h ;200X18=60min loop
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
check_mode1:
mov a, 01h
and a, pd
sz status.2
jmp time0 ;if pd=0, no time set
jmp time_5min ;if pd=1, enter 5min set
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
check_mode2:
mov a, 01h
and a, pd
sz status.2
jmp time_30min
jmp time_60min
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
time0_set:
; clr pa.5
clr pa.6
ret
time_min_set:
; clr pa.5
set pa.6
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; default mode, timer is no seting
time0:
call time0_set
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 5min timing
time_5min:
call bak ;do bak IO status, all IO set output 0
loop1:
call ptled
call long_push
clr status.2
mov a, 0fah
and a, timer_in ;if timer_in=0 so result is 0
snz status.2 ;if result=0 so status.2=1
jmp loop1 ;1 times loop is 2s
mmov timer_in, 0fah
clr status.2
dec time5min ;time5min is 150
snz status.2 ;2X150=300s is 5 minutes
jmp loop1
mmov time5min, 096h ;reset time5min=150
call back_write ; back write IO status
call time_min_set ;5min time reached, call ouptu I/O set
nop
nop
nop
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 30min timing
time_30min:
call bak
loop2:
call ptled
call long_push
clr status.2
mov a, 0fah
and a, timer_in
snz status.2
jmp loop2 ;2s timer reached
mmov timer_in, 0fah
clr status.2
dec time_a ;time_a=100
snz status.2 ;100X2=200s status.2=1
jmp loop2
mmov time_a, 064h ;reset time_a
clr status.2
dec time30min ;time30min=9
snz status.2 ;200X9=1800s status.2=1
jmp loop2
mmov time30min, 09h ;reset time30min
call back_write
call time_min_set ;30min reached, call ouput I/O set
nop
nop
nop
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 60min timing
time_60min:
call bak
loop3:
call ptled
call long_push
clr status.2
mov a, 019h
and a, timer_in
snz status.2
jmp loop3 ;2s reached
mmov timer_in, 019h
clr status.2
dec time_a
snz status.2
jmp loop3 ;200s reached
mmov time_a, 064h
clr status.2
dec time60min ;time60min=18
snz status.2 ;200X18=3600s
jmp loop3
mmov time60min, 012h ;reset time60min=18
call back_write
call time_min_set ;1h time reached, call ouput I/O set
nop
nop
nop
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
time_set:
mov a, 08h
and a, pa
sz status.2
jmp check_mode1
jmp check_mode2
ret
;***************************************
; open pvi
open:
sz on_off_bit ;if on_off_bit = 0, so open pvi
jmp over ;if on_off_bit = 1, so do nothing
set pa.1
set pa.2
mmov on_off_bit, 01h ;open after set on_off_bit
mmov timer_in, 019h
mmov tmrc, 097h ;time clock is fsys/128
mmov tmr, 06h ;interrupt 1 time is 8ms
mmov on_01, 01h ;if first on power, so on_01=1
over:
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; shutdown pvi
shut_down:
clr pa.1
clr pa.2
mmov on_off_bit, 0h ; used on IDE
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;photosensitive diode
ptled:
clr status.2 ;if photosensitive diode = 0, so enter sleep
mov a, 08h
and a, pb
sz status.2
jmp sleep ;if pb3=0 enter sleep
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; if on_off_bit is 0, open_pvi , then shutdown pvi
open_down:
sz on_off_bit
jmp shut_down
jmp open
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 256ms timer_delay
key_holding_time:
mmov timer_in, 020h
loop:
mov a, 020h
and a, timer_in
snz status.2
jmp loop
mmov timer_in, 020h
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
check_on_01: ;if on_01 = 1, indicate key don't undo on last times, so not check open_down function
sz on_01
jmp next1
call open_down if on_01 = 0, call open_down function
next1:
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; if POWERCK is pushed, and holding_timer > 200ms, to justify
long_push:
mov a, 01h
and a, pa
snz status.2 ;pa.0 = 0, indicat switch_key did pushed
ret
clr status.2
call key_holding_time ;256ms delay
clr status.2
mov a, 01h
and a, pa
sz status.2 ;powerck push_holding >256ms
call check_on_01 ;check switch_key that didn't undo on last time
ret
;***************************************
main:
call initial
main_loop:
call long_push ; long_time push_key run pvi
clr status.2
mov a, 01h
and a, pa
sz status.2
jmp next2
mov a, 0h
mov on_01, a
next2:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;enter sleep mode check
call ptled
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; power check
sz on_off_bit ;only run status, check battery's power
call check_power
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; timing check
clr status.2
mov a, 080h ;if pa7=1 check time_mode
and a, pa
snz status.2
call time_set
jmp main_loop
;*************************************************
;*************************************************
end
jmp main_loop
jmp main_loop
jmp main_loop
jmp main_loop
jmp main_loop
jmp main_loop
jmp main_loop
jmp main_loop
jmp main_loop
jmp main_loop
jmp main_loop
jmp main_loop
jmp main_loop
jmp main_loop
jmp main_loop
jmp main_loop
jmp main_loop
jmp main_loop
jmp main_loop
jmp main_loop
jmp main_loop
jmp main_loop
jmp main_loop
jmp main_loop
jmp main_loop
jmp main_loop
jmp main_loop
jmp main_loop
jmp main_loop
jmp main_loop
jmp main_loop
jmp main_loop
jmp main_loop
jmp main_loop
jmp main_loop
jmp main_loop
jmp main_loop
jmp main_loop
jmp main_loop
jmp main_loop
jmp main_loop
jmp main_loop
jmp main_loop
jmp main_loop
jmp main_loop
jmp main_loop
jmp main_loop
jmp main_loop
jmp main_loop
jmp main_loop
jmp main_loop
jmp main_loop
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -