📄 battery_check.lst
字号:
文件:BATTERY_CHECK.ASM 盛群编译器版本 2.86 页次1
1 0000 ;************************************
2 0000 include HT46R47.inc
3 0000 ;*************************************
4 0000 ;*************************************************
5 0000 data .section 'data'
6 0000 00 on_01 db ?
7 0001 00 main_01 db ?
8 0002 00 on_off_bit db ?
9 0003 00 sl_idle db ?
10 0004 00 idle_01 db ?
11 0005 00 pac_bak db ?
12 0006 00 pa_bak db ?
13 0007 00 pbc_bak db ?
14 0008 00 pb_bak db ?
15 0009 00 intc_bak db ?
16 000A 00 spb_bak db ?
17 000B 00 spbc_bak db ?
18 000C 00 sintc_bak db ?
19 000D 00 temp db ?
20 000E 00 intc_out db ?
21 000F 00 delay_in db ?
22 0010 00 delay_4s db ?
23 0011 00 check_4s db ?
24 0012 00 check_01 db ?
25 0013 00 check_times db ?
26 0014 00 adbuf_h db ?
27 0015 00 adbuf_hc db ?
28 0016 00 adbuf_l db ?
29 0017 00 adcnt db ?
30 0018 00 check_end db ?
31 0019 00 times1_bit db ?
32 001A 00 timer_in db ?
33 001B 00 time5min db ?
34 001C 00 time_a db ?
35 001D 00 time30min db ?
36 001E 00 time60min db ?
37 001F ;***************************************
38 0000 code .section at 0 'code'
39 0000 org 000h
40 0000 29E2 jmp main
41 0001 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
42 0001 org 004h ;external interrupt
43 0004 280E jmp exitint
44 0005 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
45 0005 org 008h ;intial timer interrupt
46 0008 281C jmp timint
47 0009 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
48 0009 org 00ch ;intial a/d converter interrupt
49 000C 0000 nop
50 000D 0004 reti
51 000E ;***************************************
52 000E
53 000E mmov macro a1,b1
54 000E mov a, b1
55 000E mov a1, a
56 000E endm
57 000E ;***************************************
文件:BATTERY_CHECK.ASM 盛群编译器版本 2.86 页次2
58 000E
59 000E ; external interrupt
60 000E exitint:
61 000E mmov idle_01, 01h ;idle mode check bit
62 0010 1F00 R clr timer_in
63 0011 mmov time5min, 0ffh
64 0013 mmov time_a, 0ffh
65 0015 mmov time30min, 0ffh
66 0017 mmov time60min, 0ffh
67 0019 mmov intc_out, 01h
68 001B 0003 ret
69 001C ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
70 001C
71 001C ;timing interrupt
72 001C timint: ;timer interrupt ISR
73 001C 1580 R dec timer_in ;timer interrupt 1 times is 8ms
74 001D 1580 R dec delay_in ;check power delay
75 001E 0004 reti
76 001F ;***************************************
77 001F ;initial process section
78 001F initial:
79 001F 1F0B clr intc
80 0020 1F0E clr tmrc
81 0021 1F22 clr adcr
82 0022 1F00 R clr on_off_bit ;control open & shut_down
83 0023 1F00 R clr on_01 ;
84 0024 1F0A clr status
85 0025
86 0025 ; I/O setup
87 0025 mmov pac, 089h ;pa1 pa2 pa5 pa6 output,pa4 timer enabled
88 0027 mmov pa, 0h ;pa0 pa3 pa7 input
89 0029 mmov pbc, 08h ;pb3 input ,pb0 is a/d
90 002B mmov pb, 0h ;pb1, pb2 is output
91 002D 1F99 set pdc ;pd0 input
92 002E 1F18 clr pd
93 002F
94 002F ; check batter power setup
95 002F mmov adcnt, 0fch ;set consecutive times
96 0031 mmov times1_bit, 02h ;on power check battery
97 0033 1F00 R clr adbuf_h
98 0034 1F00 R clr adbuf_hc
99 0035 1F00 R clr adbuf_l
100 0036 1F00 R clr check_times
101 0037 1F00 R clr check_01
102 0038 mmov delay_in, 07dh ;check power time set
103 003A mmov check_4s, 05h ;check power delay 14s
104 003C
105 003C ; clear ram
106 003C 0F40 mov a, 40h ;general purpose data memory
107 003D 0081 mov mp, a
108 003E clrram: ;clear data memory
109 003E 1F00 clr r0
110 003F 1481 inc mp
111 0040 1480 R inc temp
112 0041 0700 R mov a, temp
113 0042 0C7F xor a, 07fh ;data memory end address
114 0043 3D0A sz z
115 0044 283E jmp clrram
116 0045
117 0045 ;timer setup
文件:BATTERY_CHECK.ASM 盛群编译器版本 2.86 页次3
118 0045 mmov tmrc, 097h ;time clock is fsys/128
119 0047 mmov tmr, 06h ;timer is 8ms
120 0049 mmov timer_in, 0fah ;1time interrupt is 2s(8msX250=2000ms)
121 004B mmov time5min, 06ah
122 004D mmov time_a, 09ch ;200s loop
123 004F mmov time30min, 0f7h ;200X9=1800s , 10min
124 0051 mmov time60min, 0eeh ;200X18=3600s, 1h
125 0053 ;interrupt set
126 0053 mmov intc, 055h ;enable only timer interrupt.
127 0055 1F00 R clr intc_out
128 0056 mmov delay_4s, 02h ;interrupt inform to main_cpu
129 0058 ;idle mode
130 0058 mmov idle_01, 01h ;
131 005A 0003 ret
132 005B ;***************************************
133 005B
134 005B sleep_bak:
135 005B 3312 set pa.6
136 005C wait_pa7:
137 005C 3B92 snz pa.7 ;如果pa7=1 进入“睡眠模式”
138 005D 285C jmp wait_pa7
139 005E 3712 clr pa.6
140 005F mmov adcr, 0h
141 0061 mmov spbc_bak, pbc
142 0063 mmov spb_bak, pb
143 0065 mmov sintc_bak, intc
144 0067 3413 clr pac.0
145 0068 3492 clr pa.1
146 0069 3414 clr pb.0
147 006A 3494 clr pb.1
148 006B 3514 clr pb.2
149 006C 340B clr intc.0
150 006D 0003 ret
151 006E ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
152 006E
153 006E sleep_wake_up:
154 006E 3092 set pa.1
155 006F mmov intc, sintc_bak
156 0071 mmov pbc, spbc_bak
157 0073 mmov pb, spb_bak
158 0075 3013 set pac.0
159 0076 0003 ret
160 0077 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
161 0077
162 0077 ; before sleep_mode, backup all I/O status, backup all register's
163 0077 sleep_mode:
164 0077 1080 R sz main_01 ;if main_01 = 1, indicate from mian_loop enter sleep
165 0078 205B call sleep_bak
166 0079 360E clr tmrc.4 ;if main_01 = 0, indicate from timing enter sleep
167 007A 340B clr intc.0
168 007B loop_sleep:
169 007B 3994 snz pb.3
170 007C 287B jmp loop_sleep
171 007D 320E set tmrc.4
172 007E 300B set intc.0
173 007F 1080 R sz main_01
174 0080 206E call sleep_wake_up
175 0081 0003 ret
176 0082 ;***************************************
177 0082
文件:BATTERY_CHECK.ASM 盛群编译器版本 2.86 页次4
178 0082 idle_wake_up:
179 0082 3092 set pa.1
180 0083 1F0B clr intc
181 0084 mmov intc, intc_bak
182 0086 3792 clr pa.7
183 0087 0003 ret
184 0088 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
185 0088
186 0088 ; before enter idle_mode, backup all I/O status, backup all register's
187 0088 idle_mode:
188 0088 1F00 R clr idle_01 ;before enter idle mode, clear idle_01
189 0089 mmov adcr, 0h
190 008B mmov intc_bak, intc
191 008D mmov pb_bak, pb
192 008F 3492 clr pa.1
193 0090 3414 clr pb.0
194 0091 3494 clr pb.1
195 0092 3514 clr pb.2
196 0093 1F0B clr intc
197 0094 mmov intc, 047h ;external and timer interrupt
198 0096 loop_idle1:
199 0096 0000 nop
200 0097 3C12 sz pa.0
201 0098 1F00 R clr on_01
202 0099 21D1 call long_push ; long_time push_key run pvi
203 009A 1080 R sz idle_01 ;if idle_01=0 , in idle_01
204 009B 28A1 jmp loop_idle3 ;if idle_01=1, indiate return from ISR
205 009C 3D94 sz pb.3
206 009D 2896 jmp loop_idle1
207 009E 340B clr intc.0
208 009F loop_idle2:
209 009F 3994 snz pb.3
210 00A0 289F jmp loop_idle2
211 00A1 loop_idle3:
212 00A1 2082 call idle_wake_up
213 00A2 0003 ret
214 00A3
215 00A3 ;***************************************
216 00A3 adpro: ;A/D conversion
217 00A3 1580 R dec times1_bit
218 00A4 mmov adcr, 08h ;pb0 is a/d pin
219 00A6 mmov acsr, 02h ;a/d clock is fsys/32
220 00A8 37A2 clr adcr.7
221 00A9 0000 nop
222 00AA 0000 nop
223 00AB 0000 nop
224 00AC 33A2 set adcr.7 ; reset A/D
225 00AD 0000 nop
226 00AE 0000 nop
227 00AF 0000 nop
228 00B0 37A2 clr adcr.7 ; start A/D
229 00B1 lpask:
230 00B1 0000 nop
231 00B2 3F22 sz adcr.6 ; poll the ADCR register EOCB bit to detect end of A/D conversion
232 00B3 28B1 jmp lpask
233 00B4 1080 R sz times1_bit
234 00B5 28A3 jmp adpro
235 00B6
236 00B6 mmov times1_bit, 01h
237 00B8 0721 mov a, adrh ;read A/D conversion result
文件:BATTERY_CHECK.ASM 盛群编译器版本 2.86 页次5
238 00B9 0380 R addm a, adbuf_h ;to add
239 00BA 3C0A sz status.0
240 00BB 1480 R inc adbuf_hc
241 00BC mmov temp, adrl
242 00BE 0F80 mov a, 080h
243 00BF 0600 R and a, temp
244 00C0 390A snz status.2
245 00C1 1480 R inc adbuf_l
246 00C2 1680 R siz adcnt
247 00C3 28A3 jmp adpro ;4 times convert if end? no, return
248 00C4
249 00C4 mmov check_4s, 05h
250 00C6 1F00 R clr check_01
251 00C7 mmov adcnt, 0fch ;update times of continue conversion
252 00C9 340A clr status.0
253 00CA 1B80 R rrc adbuf_hc
254 00CB 1B80 R rrc adbuf_h ;AD result/2
255 00CC 1980 R rr adbuf_l
256 00CD ; clr status.0
257 00CD 1B80 R rrc adbuf_h ;AD result/2, get average of 4_times and save average to adbuf_h
258 00CE 1B80 R rrc adbuf_hc
259 00CF 1980 R rr adbuf_l
260 00D0
261 00D0 1880 R rl adbuf_h
262 00D1 0F01 mov a, 01h
263 00D2 0600 R and a, adbuf_l
264 00D3 0380 R addm a, adbuf_h
265 00D4 20D6 call voltage_check ;battery voltage check
266 00D5 0003 ret
267 00D6 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
268 00D6 voltage_check: ;b5-3.5v c4-3.8v cf-4.0v d9-4.2v;;;;vdd is 3.27v
269 00D6 0FB5 mov a, 0b5h
270 00D7 0200 R sub a, adbuf_h ;c=0 if result is negative
271 00D8 3C0A sz status.0
272 00D9 2108 call voltage_35 ;voltage>=3.5V
273 00DA 1080 R sz check_end
274 00DB 0003 ret
275 00DC 0FC4 mov a, 0c4h
276 00DD 0200 R sub a, adbuf_h
277 00DE 3C0A sz status.0
278 00DF 20FF call voltage_38 ;voltage>=3.8v
279 00E0 1080 R sz check_end
280 00E1 0003 ret
281 00E2 0FCF mov a, 0cfh
282 00E3 0200 R sub a, adbuf_h
283 00E4 3C0A sz status.0
284 00E5 20F6 call voltage_40 ;voltage>=4.0v
285 00E6 1080 R sz check_end
286 00E7 0003 ret
287 00E8 0FD9 mov a, 0d9h
288 00E9 0200 R sub a, adbuf_h
289 00EA 3C0A sz status.0
290 00EB 20ED call voltage_42 ;voltage>=4.2v
291 00EC 0003 ret
292 00ED ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
293 00ED voltage_42:
294 00ED 1F00 R clr adbuf_h
295 00EE 1F00 R clr adbuf_hc
296 00EF 1F00 R clr adbuf_l
297 00F0 3494 clr pb.1
文件:BATTERY_CHECK.ASM 盛群编译器版本 2.86 页次6
298 00F1 3514 clr pb.2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -