⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 battery_check.asm.bak

📁 ht46r47,电源管理源码
💻 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 + -