-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathFireLight_v2.asm
3166 lines (2464 loc) · 72.7 KB
/
FireLight_v2.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
;*****************************************************
;Company :
;File Name : FireLight.asm
;Author :
;Create Data : 2015-12-16
;Last Modified : 2015-12-16
;Description :
;Version : 2.0
;*****************************************************
LIST P=69P48
ROMSIZE=4096
;*****************************************************
;系统寄存器 ($000 ~ $02F, $380 ~ $38C)
;*****************************************************
IE EQU 00H ;中断使能/禁能控制
IRQ EQU 01H ;中断请求标志
TM0 EQU 02H ;Timer0 模式寄存器
TM1 EQU 03H ;Timer1 模式寄存器
TL0 EQU 04H ;Timer0 重载值低4位
TH0 EQU 05H ;Timer0 重载值高4位
TL1 EQU 06H ;Timer1 重载值低4位
TH1 EQU 07H ;Timer1 重载值高4位
PORTA EQU 08H ;PortA 数据寄存器
PORTB EQU 09H ;PortB 数据寄存器
PORTC EQU 0AH ;PortC 数据寄存器
PORTD EQU 0BH ;PortD 数据寄存器
PORTE EQU 0CH ;PortE 数据寄存器
;0DH Reserved
TBR EQU 0EH ;查表寄存器
INX EQU 0FH ;间接寻址伪索引寄存器
DPL EQU 10H ;INX数据指针低4位
DPM EQU 11H ;INX数据指针中4位
DPH EQU 12H ;INX数据指针高4位
TCTL1 EQU 13H ;Timer1 控制寄存器
ADCCTL EQU 14H ;ADC 使能与参考电压
ADCCFG EQU 15H ;ADC configuration
ADCPORT EQU 16H ;ADC PORT CONFIGURATION
ADCCHN EQU 17H ;ADC channel selection
PACR EQU 18H ;PortA 控制寄存器
PBCR EQU 19H ;PortB 控制寄存器
PCCR EQU 1AH ;PortC 控制寄存器
PDCR EQU 1BH ;PortD 控制寄存器
PECR EQU 1CH ;PortE 控制寄存器
;1DH Reserved
WDT EQU 1EH ;Whichdog timer control
PWMC0 EQU 20H ;PWM0 控制寄存器
PWMC1 EQU 21H ;PWM1 控制寄存器
PWMP00 EQU 22H ;PWM0 周期控制寄存器低4位
PWMP01 EQU 23H ;PWM0 周期控制寄存器高4位
PWMD00 EQU 24H ;PWM0 占空比控制寄存器低2位
PWMD01 EQU 25H ;PWM0 占空比控制寄存器中4位
PWMD02 EQU 26H ;PWM0 占空比控制寄存器高4位
PWMP10 EQU 27H ;PWM1 周期控制寄存器低4位
PWMP11 EQU 28H ;PWM1 周期控制寄存器高4位
PWMD10 EQU 29H ;PWM1 占空比控制寄存器低2位
PWMD11 EQU 2AH ;PWM1 占空比控制寄存器中4位
PWMD12 EQU 2BH ;PWM1 占空比控制寄存器高4位
;2CH Reserved
AD_RET0 EQU 2DH ;ADC 转换结果低2位
AD_RET1 EQU 2EH ;ADC 转换结果中4位
AD_RET2 EQU 2FH ;ADC 转换结果高4位
PPACR EQU 388H ;PORTA 口上拉电阻控制寄存器
PPBCR EQU 389H ;PORTB 口上拉电阻控制寄存器
PPCCR EQU 38AH ;PORTC 口上拉电阻控制寄存器
PPDCR EQU 38BH ;PORTD 口上拉电阻控制寄存器
PPECR EQU 38CH ;PORTE 口上拉电阻控制寄存器
;*****************************************************
;用户自定义寄存器 ($030 ~ $0EF)
;*****************************************************
;Bank0
;------------------------------------------------------------------
AC_BAK EQU 30H ;AC 值备份寄存器
SYSTEM_STATE EQU 31H ;bit 0: 0 - 主电状态(主电源正常), 1 - 应急状态(主电源停电)
SELF_STATE EQU 32H ;bit 0: 0 - 主电状态(主电源正常), 1 - 模拟应急状态(模拟主电源停电)
;bit 1: 0 - 非月检状态, 1 - 月检状态
;bit 2: 0 - 非年检状态, 1 - 年检状态
;bit 3: 0 - 自动模式 1 - 手动模式
;注释:自动模式是指,bit 0 - bit 2 均为时间流逝或是停电导致系统进入的相应状态
;手动模式是指,bit 0 - bit 2 均为通过持续不同时长的按键而导致系统进入的相应状态
ALREADY_ENTER EQU 33H ;bit 0: 0 - 当前并未开始充电, 1 - 当前已经开始充电
;bit 1: 0 - 当前并未开始放电(应急),1 - 当前已经开始放电(应急)
;bit 2: 0 - 当前并未进入手动月检, 1 - 当前已经进入手动月检状态
;bit 3: 0 - 当前并未进入手动年检, 1 - 当前已经进入手动年检状态
; 用于TIMER 定时
F_496MS_1S EQU 35H ;bit0 = 1, 496ms 到,供按键检测使用
;bit1 = 1, 1s 到,用于计时应急时长
F_TIME EQU 36H ;bit0 = 1, 1秒到;
;bit1 = 1, 1月到;
;bit2 = 1, 1年到;
;bit3 = 1, 1分钟到。
CNT0_8MS EQU 37H ;CNT1_8MS, CNT0_8MS组成的8BIT数据达到125时,即Timer0产生125次中断后,表示1S计时已到
CNT1_8MS EQU 38H ;所以,初始化CNT1_8MS=07H, CNT0_8MS=0DH
SEC_CNT0 EQU 39H ;SEC_CNT0/1/2 以秒为单位计时
SEC_CNT1 EQU 3AH ;当数值达到1小时,即3600(E10H)秒时,向HOUR_CNT0/1进位,自身清零。
SEC_CNT2 EQU 3BH
HOUR_CNT0 EQU 3CH ;HOUR_CNT0/1 以小时为单位计时
HOUR_CNT1 EQU 3DH ;当数值达到1月时,即744(2EBH)小时时,向MONTH_CNT0/1进位,同时置F_TIME.1,自身清零。
HOUR_CNT2 EQU 3EH
MONTH_CNT EQU 3FH ;MONTH_CNT0/1 以月为单位计时
;当数值达到1年时,即12(0CH)月时,,同时置F_TIME.2,自身清零。
TEMP_SUM_CY EQU 40H ;AD子程序参数临时变量
FLAG_OCCUPIED EQU 41H ;bit0/1/2/3 = 1时分别表示CHN0、1、6、7的转换结果(CHN0_FINAL_RET1等)正被前台使用,
;此时ADC中断不能修改这些数据。
FLAG_TYPE EQU 42H ;bit0 = 1表示已经完成灯具类型选择(PORTB.3/AN7),此位为1后不再需要对AN7进行AD采样
CMP_MIN_PWR0 EQU 43H ;上电自检时,灯具电源最小电压值.(1.396V -> 0x23B ->(丢弃最低2位) 0x8E)
CMP_MIN_PWR1 EQU 44H ;
CMP_TYPE00 EQU 45H ;灯具类型门限0
CMP_TYPE01 EQU 46H ;
CMP_TYPE10 EQU 47H ;灯具类型门限1
CMP_TYPE11 EQU 48H ;
CMP_TYPE20 EQU 49H ;灯具类型门限2
CMP_TYPE21 EQU 4AH ;
LIGHT_TYPE EQU 4BH ;灯具类型
;bit0 = 1, 锂电池,常亮型
;bit1 = 1, 锂电池,常灭型
;bit2 = 1, 镍镉电池,常亮型
;bit3 = 1, 镍镉电池,常灭型
CMP_SUPPLY0 EQU 4CH ;检测到电源电压小于此数值时,开始应急放电.(1.115V -> 0x72)
CMP_SUPPLY1 EQU 4DH
DURATION_EMER EQU 4EH ;bit0 = 1, 应急时长小于5分钟
;bit1 = 1, 应急时长大于5分钟,小于30分钟
;bit2 = 1, 应急时长大于30分钟
CNT0_EMERGENCY EQU 4FH ;对应急时长计时,单位s
CNT1_EMERGENCY EQU 50H
CNT2_EMERGENCY EQU 51H
CMP_EXIT_EMER0 EQU 52H ;检测到电池电压小于此数值时(0.96V -> 0x62),应该关闭应急放电功能
CMP_EXIT_EMER1 EQU 53H
CMP_BAT_OPEN0 EQU 54H ;检测到电池电压大于此数值时(1.56V -> 0x9F),视为电池充电回路开路
CMP_BAT_OPEN1 EQU 55H
CMP_BAT_FULL0 EQU 56H ;检测到电池电压大于此数值时(1.44V -> 0x93),视为电池已充满
CMP_BAT_FULL1 EQU 57H
CMP_BAT_CHARGE0 EQU 58H ;检测到电池电压小于此数值时(1.35V -> 0x8A),视为电池得开始充电了
CMP_BAT_CHARGE1 EQU 59H
BAT_STATE EQU 58H ;bit0 = 0, 表示充电回路未开路;bit0 = 1, 表示充电回路开路
;bit1 = 0, 表示电池未充满;bit1 = 1, 表示电池已充满
;bit2 = 0, 表示电池还不需要充电;bit2 = 1, 表示电池需要充电
;bit3 = 1, 表示电池电压过低,不能再继续应急放电了
CMP_LIGHT0 EQU 59H ;供光源检测使用,AD转换结果小于此数值时(0.2V -> 0x14),表示光源产生故障
CMP_LIGHT1 EQU 5AH
LIGHT_STATE EQU 5BH ;bit0 = 1, 表示光源故障
ALARM_STATE EQU 5CH ;bit0 = 1, 表示电池故障(开路或短路)
;bit1 = 1, 表示光源故障(开路或短路)
;bit2 = 1, 表示自检放电时间不足
CNT_LED_YELLOW EQU 5FH ;计数器,供翻转黄灯输出使用,计时单位为168MS
FLAG_SIMU_EMER EQU 60H ;bit0 = 1, 表示在"模拟停电"状态下已经打开应急功能
;bit1 = 1表示1s已到
CNT0_1MINUTE EQU 61H ;每1秒加1,直至计时满1分钟为止
CNT1_1MINUTE EQU 62H
CNT0_CHARGE EQU 63H ;还应充电多长时间,初始值为20小时,即20 * 60 =1200分钟(0x4B0)
CNT1_CHARGE EQU 64H
CNT2_CHARGE EQU 65H
GREEN_FLASH EQU 66H ;用于手动月检或手动年检时的LED闪烁
;BIT1 = 1, 按键时长超过了3秒,绿灯开始以1HZ的频率闪烁
;BIT2 = 1, 按键时长超过了5秒,绿灯开始以3HZ的频率闪烁
CNT_LED_GREEN EQU 67H ;供绿色LED翻转用
;按键相关寄存器
DELAY_TIMER2 EQU 71H ;延时子程序使用
DELAY_TIMER1 EQU 72H ;延时子程序使用
DELAY_TIMER0 EQU 73H ;延时子程序使用
CLEAR_AC EQU 74H ;清除累加器A 值用寄存器
TEMP EQU 75H ;临时寄存器
CNT0_496MS EQU 76H ;用于定时496MS
CNT1_496MS EQU 77H
BTN_PRE_STA EQU 78H ;bit0储存上一次按键状态,0:按下,1:未按下
BTN_PRESS_CNT EQU 79H ;按键按下时长,单位为496ms
;led
CNT0_168MS EQU 7AH ;用于定时168MS,供翻转LED用
CNT1_168MS EQU 7BH
F_168MS EQU 7CH ;每168ms将bit0 = 1
CMP_RESUME0 EQU 7DH ;检测到电源电压大于此数值时,表示市电供电已恢复,应关闭应急.(1.396V -> 0x8E)
CMP_RESUME1 EQU 7EH
PRESS_DURATION EQU 7FH ;按键被按下持续时长标志
;bit0 = 1; 被按下时长小于3秒
;bit1 = 1; 被按下时长大于3秒,小于5秒
;bit2 = 1; 被按下时长大于5秒,小于7秒
;bit3 = 1; 被按下时长大于7秒
;Bank1(以下寄存器真实地址应加上80H)
;------------------------------------------------------------------
CHN0_RET0_BAK0 EQU 00H ;ADC CHN0 转换结果低2位备份
CHN0_RET1_BAK0 EQU 01H ;ADC CHN0 转换结果中4位备份
CHN0_RET2_BAK0 EQU 02H ;ADC CHN0 转换结果高4位备份
CHN0_RET0_BAK1 EQU 03H ;ADC CHN0 转换结果低2位备份
CHN0_RET1_BAK1 EQU 04H ;ADC CHN0 转换结果中4位备份
CHN0_RET2_BAK1 EQU 05H ;ADC CHN0 转换结果高4位备份
CHN0_RET0_BAK2 EQU 06H ;ADC CHN0 转换结果低2位备份
CHN0_RET1_BAK2 EQU 07H ;ADC CHN0 转换结果中4位备份
CHN0_RET2_BAK2 EQU 08H ;ADC CHN0 转换结果高4位备份
CHN0_RET0_BAK3 EQU 09H ;ADC CHN0 转换结果低2位备份
CHN0_RET1_BAK3 EQU 0AH ;ADC CHN0 转换结果中4位备份
CHN0_RET2_BAK3 EQU 0BH ;ADC CHN0 转换结果高4位备份
CHN0_FINAL_RET0 EQU 0CH ;通道0平均后的结果
CHN0_FINAL_RET1 EQU 0DH ;
CHN0_FINAL_RET2 EQU 0EH
DET0_CT EQU 0FH ;ADC 通道0 转换结果个数
;------------------------------------------------------------------
CHN1_RET0_BAK0 EQU 10H ;ADC CHN1 转换结果低2位备份
CHN1_RET1_BAK0 EQU 11H ;ADC CHN1 转换结果中4位备份
CHN1_RET2_BAK0 EQU 12H ;ADC CHN1 转换结果高4位备份
CHN1_RET0_BAK1 EQU 13H ;ADC CHN1 转换结果低2位备份
CHN1_RET1_BAK1 EQU 14H ;ADC CHN1 转换结果中4位备份
CHN1_RET2_BAK1 EQU 15H ;ADC CHN1 转换结果高4位备份
CHN1_RET0_BAK2 EQU 16H ;ADC CHN1 转换结果低2位备份
CHN1_RET1_BAK2 EQU 17H ;ADC CHN1 转换结果中4位备份
CHN1_RET2_BAK2 EQU 18H ;ADC CHN1 转换结果高4位备份
CHN1_RET0_BAK3 EQU 19H ;ADC CHN1 转换结果低2位备份
CHN1_RET1_BAK3 EQU 1AH ;ADC CHN1 转换结果中4位备份
CHN1_RET2_BAK3 EQU 1BH ;ADC CHN1 转换结果高4位备份
CHN1_FINAL_RET0 EQU 1CH ;通道1平均后的结果
CHN1_FINAL_RET1 EQU 1DH ;
CHN1_FINAL_RET2 EQU 1EH ;
DET1_CT EQU 1FH ;ADC 通道1 转换结果个数
;------------------------------------------------------------------
CHN6_RET0_BAK0 EQU 20H ;ADC CHN6 转换结果低2位备份
CHN6_RET1_BAK0 EQU 21H ;ADC CHN6 转换结果中4位备份
CHN6_RET2_BAK0 EQU 22H ;ADC CHN6 转换结果高4位备份
CHN6_RET0_BAK1 EQU 23H ;ADC CHN6 转换结果低2位备份
CHN6_RET1_BAK1 EQU 24H ;ADC CHN6 转换结果中4位备份
CHN6_RET2_BAK1 EQU 25H ;ADC CHN6 转换结果高4位备份
CHN6_RET0_BAK2 EQU 26H ;ADC CHN6 转换结果低2位备份
CHN6_RET1_BAK2 EQU 27H ;ADC CHN6 转换结果中4位备份
CHN6_RET2_BAK2 EQU 28H ;ADC CHN6 转换结果高4位备份
CHN6_RET0_BAK3 EQU 29H ;ADC CHN6 转换结果低2位备份
CHN6_RET1_BAK3 EQU 2AH ;ADC CHN6 转换结果中4位备份
CHN6_RET2_BAK3 EQU 2BH ;ADC CHN6 转换结果高4位备份
CHN6_FINAL_RET0 EQU 2CH ;通道6平均后的结果
CHN6_FINAL_RET1 EQU 2DH ;
CHN6_FINAL_RET2 EQU 2EH
DET6_CT EQU 2FH ;ADC 通道6 转换结果个数
;------------------------------------------------------------------
CHN7_RET0_BAK0 EQU 30H ;ADC CHN7 转换结果低2位备份
CHN7_RET1_BAK0 EQU 31H ;ADC CHN7 转换结果中4位备份
CHN7_RET2_BAK0 EQU 32H ;ADC CHN7 转换结果高4位备份
CHN7_RET0_BAK1 EQU 33H ;ADC CHN7 转换结果低2位备份
CHN7_RET1_BAK1 EQU 34H ;ADC CHN7 转换结果中4位备份
CHN7_RET2_BAK1 EQU 35H ;ADC CHN7 转换结果高4位备份
CHN7_RET0_BAK2 EQU 36H ;ADC CHN7 转换结果低2位备份
CHN7_RET1_BAK2 EQU 37H ;ADC CHN7 转换结果中4位备份
CHN7_RET2_BAK2 EQU 38H ;ADC CHN7 转换结果高4位备份
CHN7_RET0_BAK3 EQU 39H ;ADC CHN7 转换结果低2位备份
CHN7_RET1_BAK3 EQU 3AH ;ADC CHN7 转换结果中4位备份
CHN7_RET2_BAK3 EQU 3BH ;ADC CHN7 转换结果高4位备份
CHN7_FINAL_RET0 EQU 3CH ;通道7平均后的结果
CHN7_FINAL_RET1 EQU 3DH ;
CHN7_FINAL_RET2 EQU 3EH ;
DET7_CT EQU 3FH ;ADC 通道7 转换结果个数
;*****************************************************
;程序
;*****************************************************
ORG 0000H
;中断向量表
JMP RESET ;RESET ISP
JMP ADC_ISP ;ADC INTERRUPT ISP
JMP TIMER0_ISP ;TIMER0 ISP
RTNI ;TIMER1 ISP
RTNI ;PORTB/D ISP
;*****************************************************
;Timer0 中断服务程序
;Timer0已配置为每8ms产生一次中断
;
;*****************************************************
TIMER0_ISP:
STA AC_BAK, 00H ;备份AC 值
ANDIM IRQ, 1011B ;清TIMER0 中断请求标志
J_168MS:
SBIM CNT0_168MS, 01H
LDI TBR, 00H
SBCM CNT1_168MS
BC J_496MS
LDI CNT0_168MS, 04H ;8ms * 21 = 168ms
LDI CNT1_168MS, 01H
ORIM F_168MS, 0001B ;设置 "168ms 到"标志,翻转LED用
J_496MS:
SBIM CNT0_496MS, 01H ;每次Timer0中断产生后,将CNT0_496MS减1
LDI TBR, 00H ;将累加器A 清0
SBCM CNT1_496MS ;每次CNT0-1产生借位时,将CNT1_496MS减1
BC J_1S ;如果未产生借位,则表示496MS还未计满
LDI CNT0_496MS, 0DH ;重置496ms 计数器,496 = 8 * 62
LDI CNT1_496MS, 03H ;重置496ms 计数器
ORIM F_496MS_1S, 0001B ;设置 "496ms 到"标志
J_1S:
SBIM CNT0_8MS, 01H ;每次Timer0中断产生后,将CNT0_8MS减1
LDI TBR, 00H
SBCM CNT1_8MS ;每次CNT0_8MS-1产生借位时,将CNT1_8MS减1
BC TIMER0_ISP_END
LDI CNT0_8MS, 0CH ;重置1s 计数器 1S = 125 * 8 MS
LDI CNT1_8MS, 07H ;重置1s 计数器
ORIM F_TIME, 0001B ;设置 "1s 到"标志
ORIM F_496MS_1S, 0010B ;为应急功能提供 "1s 到"标志
ORIM FLAG_SIMU_EMER, 0010B ;为手动自检提供 "1s 到"标志
J_MINUTE:
SBIM CNT0_1MINUTE, 01H
LDI TBR, 00H
SBCM CNT1_1MINUTE
BC J_HOUR ;因为J_HOUR是以秒为单位累加,所以应跳至J_HOUR
LDI CNT0_1MINUTE, 0BH ;0x3c * 1s = 60s
LDI CNT1_1MINUTE, 03H
ORIM F_TIME, 1000B ;设置 "1分钟 到"标志
J_HOUR:
SBIM SEC_CNT0, 01H ;SEC_CNT0 每秒减1
LDI TBR, 00H
SBCM SEC_CNT1 ;每次SEC_CNT0-1产生借位时,将SEC_CNT1减1
LDI TBR, 00H
SBCM SEC_CNT2 ;每次SEC_CNT1-1产生借位时,将SEC_CNT2减1
BC TIMER0_ISP_END ;SEC_CNT2减1产生借位时,则表示1小时计时已到
LDI SEC_CNT0, 0FH ;重置SEC_CNT0/1/2 为E10H-1(3600-1)
LDI SEC_CNT1, 00H
LDI SEC_CNT2, 0EH
J_MONTH:
SBIM HOUR_CNT0, 01H ;HOUR_CNT0 每小时减1
LDI TBR, 00H
SBCM HOUR_CNT1 ;每次 HOUR_CNT0 产生借位时,将 HOUR_CNT1 减1
BC TIMER0_ISP_END ;HOUR_CNT1 减1产生借位时,则表示1月计时已到
LDI HOUR_CNT0, 07H ;重置HOUR_CNT0/1/2 为2E8H-1(744-1)
LDI HOUR_CNT1, 0EH
LDI HOUR_CNT2, 02H
ORIM F_TIME, 0010B ;设置 "1月到" 标志
J_YEAR:
SBIM MONTH_CNT, 01H ;MONTH_CNT 每月减1
BC TIMER0_ISP_END ;MONTH_CNT 减1产生借位时,则表示1年计时已到
LDI MONTH_CNT, 0BH ;重置MONTH_CNT 为0CH-1(12-1)
ORIM F_TIME, 0100B ;设置 "1年到" 标志
TIMER0_ISP_END:
LDI IE, 1100B ;打开ADC,Timer0 中断
LDA AC_BAK, 00H ;恢复AC 值
RTNI
;*****************************************************
;ADC 中断服务程序
;*****************************************************
ADC_ISP:
STA AC_BAK, 00H ;备份AC 值
ANDIM IRQ, 0111B ;清ADC 中断请求标志
LDA ADCCHN
BAZ CHN0_VOL_1 ;此次为通道0 转换结果
SBI ADCCHN, 01H
BAZ CHN1_VOL_1 ;此次为通道1 转换结果
SBI ADCCHN, 06H
BAZ CHN6_VOL_1 ;此次为通道6 转换结果
SBI ADCCHN, 07H
BAZ CHN7_VOL_1 ;此次为通道7 转换结果
JMP ADC_ISP_END ;正常情况下不应执行此语句
;----------------------------------------------------------------
;转存通道0 转换结果
;----------------------------------------------------------------
CHN0_VOL_1:
LDI TBR, 01H ;次数加一
ADDM DET0_CT, 01H
LDI TBR, 04H ;DET0_CT - 4 -> A
SUB DET0_CT, 01H
BAZ CHN0_VOL_14 ;第4个转换结果
LDI TBR, 03H ;DET0_CT - 3 -> A
SUB DET0_CT, 01H
BAZ CHN0_VOL_13 ;第3个转换结果
LDI TBR, 02H ;DET0_CT - 2 -> A
SUB DET0_CT, 01H
BAZ CHN0_VOL_12 ;第2个转换结果
CHN0_VOL_11:
LDA AD_RET0, 00H ;保存第一次A/D 转换结果
STA CHN0_RET0_BAK0, 01H
LDA AD_RET1, 00H
STA CHN0_RET1_BAK0, 01H
LDA AD_RET2, 00H
STA CHN0_RET2_BAK0, 01H
JMP NEXT_CHN
CHN0_VOL_12:
LDA AD_RET0, 00H ;保存第二次A/D 转换结果
STA CHN0_RET0_BAK1, 01H
LDA AD_RET1, 00H
STA CHN0_RET1_BAK1, 01H
LDA AD_RET2, 00H
STA CHN0_RET2_BAK1, 01H
JMP NEXT_CHN
CHN0_VOL_13:
LDA AD_RET0, 00H ;保存第三次A/D 转换结果
STA CHN0_RET0_BAK2, 01H
LDA AD_RET1, 00H
STA CHN0_RET1_BAK2, 01H
LDA AD_RET2, 00H
STA CHN0_RET2_BAK2, 01H
JMP NEXT_CHN
CHN0_VOL_14:
LDA AD_RET0, 00H ;保存第四次A/D 转换结果
STA CHN0_RET0_BAK3, 01H
LDA AD_RET1, 00H
STA CHN0_RET1_BAK3, 01H
LDA AD_RET2, 00H
STA CHN0_RET2_BAK3, 01H
LDI TBR, 00H ;DET0_CT 清0
STA DET0_CT, 01H
CALL CAL_CHN0_ADCDATA
JMP NEXT_CHN
;----------------------------------------------------------------
;转存通道1 转换结果
;----------------------------------------------------------------
CHN1_VOL_1:
LDI TBR, 01H ;次数加一
ADDM DET1_CT, 01H
LDI TBR, 04H ;DET1_CT - 4 -> A
SUB DET1_CT, 01H
BAZ CHN1_VOL_14 ;第4个转换结果
LDI TBR, 03H ;DET1_CT - 3 -> A
SUB DET1_CT, 01H
BAZ CHN1_VOL_13 ;第3个转换结果
LDI TBR, 02H ;DET1_CT - 2 -> A
SUB DET1_CT, 01H
BAZ CHN1_VOL_12 ;第2个转换结果
CHN1_VOL_11:
LDA AD_RET0, 00H ;保存第一次A/D 转换结果
STA CHN1_RET0_BAK0, 01H
LDA AD_RET1, 00H
STA CHN1_RET1_BAK0, 01H
LDA AD_RET2, 00H
STA CHN1_RET2_BAK0, 01H
JMP NEXT_CHN
CHN1_VOL_12:
LDA AD_RET0, 00H ;保存第二次A/D 转换结果
STA CHN1_RET0_BAK1, 01H
LDA AD_RET1, 00H
STA CHN1_RET1_BAK1, 01H
LDA AD_RET2, 00H
STA CHN1_RET2_BAK1, 01H
JMP NEXT_CHN
CHN1_VOL_13:
LDA AD_RET0, 00H ;保存第三次A/D 转换结果
STA CHN1_RET0_BAK2, 01H
LDA AD_RET1, 00H
STA CHN1_RET1_BAK2, 01H
LDA AD_RET2, 00H
STA CHN1_RET2_BAK2, 01H
JMP NEXT_CHN
CHN1_VOL_14:
LDA AD_RET0, 00H ;保存第四次A/D 转换结果
STA CHN1_RET0_BAK3, 01H
LDA AD_RET1, 00H
STA CHN1_RET1_BAK3, 01H
LDA AD_RET2, 00H
STA CHN1_RET2_BAK3, 01H
LDI TBR, 00H ;DET1_CT 清0
STA DET1_CT, 01H
CALL CAL_CHN1_ADCDATA
JMP NEXT_CHN
;----------------------------------------------------------------
;转存通道6 转换结果
;----------------------------------------------------------------
CHN6_VOL_1:
LDI TBR, 01H ;次数加一
ADDM DET6_CT, 01H
LDI TBR, 04H ;DET6_CT - 4 -> A
SUB DET6_CT, 01H
BAZ CHN6_VOL_14 ;第4个转换结果
LDI TBR, 03H ;DET6_CT - 3 -> A
SUB DET6_CT, 01H
BAZ CHN6_VOL_13 ;第3个转换结果
LDI TBR, 02H ;DET6_CT - 2 -> A
SUB DET6_CT, 01H
BAZ CHN6_VOL_12 ;第2个转换结果
CHN6_VOL_11:
LDA AD_RET0, 00H ;保存第一次A/D 转换结果
STA CHN6_RET0_BAK0, 01H
LDA AD_RET1, 00H
STA CHN6_RET1_BAK0, 01H
LDA AD_RET2, 00H
STA CHN6_RET2_BAK0, 01H
JMP NEXT_CHN
CHN6_VOL_12:
LDA AD_RET0, 00H ;保存第二次A/D 转换结果
STA CHN6_RET0_BAK1, 01H
LDA AD_RET1, 00H
STA CHN6_RET1_BAK1, 01H
LDA AD_RET2, 00H
STA CHN6_RET2_BAK1, 01H
JMP NEXT_CHN
CHN6_VOL_13:
LDA AD_RET0, 00H ;保存第三次A/D 转换结果
STA CHN6_RET0_BAK2, 01H
LDA AD_RET1, 00H
STA CHN6_RET1_BAK2, 01H
LDA AD_RET2, 00H
STA CHN6_RET2_BAK2, 01H
JMP NEXT_CHN
CHN6_VOL_14:
LDA AD_RET0, 00H ;保存第四次A/D 转换结果
STA CHN6_RET0_BAK3, 01H
LDA AD_RET1, 00H
STA CHN6_RET1_BAK3, 01H
LDA AD_RET2, 00H
STA CHN6_RET2_BAK3, 01H
LDI TBR, 00H ;DET6_CT 清0
STA DET6_CT, 01H
CALL CAL_CHN6_ADCDATA
JMP NEXT_CHN
;----------------------------------------------------------------
;转存通道7 转换结果
;----------------------------------------------------------------
CHN7_VOL_1:
LDI TBR, 01H ;次数加一
ADDM DET7_CT, 01H
LDI TBR, 04H ;DET7_CT - 4 -> A
SUB DET7_CT, 01H
BAZ CHN7_VOL_14 ;第4个转换结果
LDI TBR, 03H ;DET7_CT - 3 -> A
SUB DET7_CT, 01H
BAZ CHN7_VOL_13 ;第3个转换结果
LDI TBR, 02H ;DET7_CT - 2 -> A
SUB DET7_CT, 01H
BAZ CHN7_VOL_12 ;第2个转换结果
CHN7_VOL_11:
LDA AD_RET0, 00H ;保存第一次A/D 转换结果
STA CHN7_RET0_BAK0, 01H
LDA AD_RET1, 00H
STA CHN7_RET1_BAK0, 01H
LDA AD_RET2, 00H
STA CHN7_RET2_BAK0, 01H
JMP NEXT_CHN
CHN7_VOL_12:
LDA AD_RET0, 00H ;保存第二次A/D 转换结果
STA CHN7_RET0_BAK1, 01H
LDA AD_RET1, 00H
STA CHN7_RET1_BAK1, 01H
LDA AD_RET2, 00H
STA CHN7_RET2_BAK1, 01H
JMP NEXT_CHN
CHN7_VOL_13:
LDA AD_RET0, 00H ;保存第三次A/D 转换结果
STA CHN7_RET0_BAK2, 01H
LDA AD_RET1, 00H
STA CHN7_RET1_BAK2, 01H
LDA AD_RET2, 00H
STA CHN7_RET2_BAK2, 01H
JMP NEXT_CHN
CHN7_VOL_14:
LDA AD_RET0, 00H ;保存第四次A/D 转换结果
STA CHN7_RET0_BAK3, 01H
LDA AD_RET1, 00H
STA CHN7_RET1_BAK3, 01H
LDA AD_RET2, 00H
STA CHN7_RET2_BAK3, 01H
LDI TBR, 00H ;DET7_CT 清0
STA DET7_CT, 01H
CALL CAL_CHN7_ADCDATA
JMP NEXT_CHN
;----------------------------------------------------------------
;----------------------------------------------------------------
NEXT_CHN:
LDA ADCCHN
BAZ NEXT_CHN1
SBI ADCCHN, 01H
BAZ NEXT_CHN6
SBI ADCCHN, 06H
BAZ NEXT_CHN7
SBI ADCCHN, 07H
BAZ NEXT_CHN0
JMP ADC_ISP_END ;不可能执行这一句
NEXT_CHN0:
LDI ADCCHN, 00H ;设定为CHN0
JMP ADC_ISP_END
NEXT_CHN1:
LDI ADCCHN, 01H ;设定为CHN1
JMP ADC_ISP_END
NEXT_CHN6:
LDI ADCCHN, 06H ;设定为CHN6
JMP ADC_ISP_END
NEXT_CHN7:
LDA FLAG_TYPE
BA0 NEXT_CHN0 ;若FLAG_TYPE的bit0=1,则表示已完成灯具类型选择,此时不再需要对AN7进行采样。
LDI ADCCHN, 07H ;设定为CHN7
;----------------------------------------------------------------
ADC_ISP_END:
ORIM ADCCFG, 1000B ;启动A/D 转换
LDI IE, 1100B ;打开ADC,Timer0 中断
LDA AC_BAK, 00H ;取出AC 值
RTNI
;*****************************************************
; 主程序
;*****************************************************
RESET:
NOP
LDI IE, 0000B ;关闭所有中断
NOP
CALL RESET_USER_DATA ;清除用户寄存器
CALL REGISTER_INITIAL ;初始化系统寄存器与用户数据寄存器
CALL PRE_START_PWR_CHK ;检查主电源是否正常,如异常则一直等待,直至恢复
CALL PRE_START_TYPE_CHK ;判断灯具的电池类型与光源类型
CALL CHARGE_BAT_ENABLE ;上电后,即开始对电池进行充电
MAIN_LOOP:
;CALL CHARGE_BAT_CTRL ;[充电控制] 根据主电源状态、待充电时长、电池是否充满标志位等进行电池充电控制
;CALL EMERGENCY_CTRL ;[放电控制] 主电源停电后的应急放电控制,退出应急状态时,计算此次应急放电时长
CALL KEY_PROCESS ;[按键扫描] 按键扫描
CALL SELF_CHK_STATE ;[自检状态] 根据系统运行时长与按键时长,置"停电","月检","年检"标志位
CALL SELF_CHK_PROCESS ;[系统自检] 根据自检标志位,进行自检
CALL BAT_STATE_CHK ;[电池状态] 检测电池状态,并置相应标志位
CALL LIGHT_STATE_CHK ;[光源状态] 光源状态检测,并置相应标志位
CALL TIPS_PROCESS ;[声光提示] 处理LED与蜂鸣器
JMP MAIN_LOOP
;*****************************************************
;清用户寄存器($030 ~ $0EF)
;*****************************************************
RESET_USER_DATA:
POWER_RESET:
LDI DPL, 00H
LDI DPM, 03H
LDI DPH, 00H ;从$30 开始
POWER_RESET_1:
LDI INX, 00H ;向DPH,DPM,DPL组成的地址处写0
ADIM DPL, 01H
LDI TBR, 00H ;将累加器A 清0
ADCM DPM, 00H
BA3 POWER_RESET_2
JMP POWER_RESET_3
POWER_RESET_2:
ADIM DPH, 01H
POWER_RESET_3:
SBI DPH, 01H ;到$EF 结束,即在地址001 111 000B时停止
BNZ POWER_RESET_1
SBI DPM, 07H
BNZ POWER_RESET_1
RESET_USER_DATA_END:
RTNI
;*****************************************************
;初始化系统寄存器
;*****************************************************
REGISTER_INITIAL:
;TIMER0 初始化
;
; fosc=4M, fsys=4M/4=1M
;
; fsys=1M 31250Hz 125Hz
; ------------- -------------
; -------->| Prescaler |----------->| Counter |----------->
; ------------- -------------
; (32) (250)
LDI TM0, 03H ;设置TIMER0 预分频为/32
LDI TL0, 06H
LDI TH0, 00H ;设置中断时间为8ms
LDI CNT0_168MS, 04H ;定时168ms
LDI CNT1_168MS, 01H ;
LDI CNT0_8MS, 0DH ;定时1s
LDI CNT1_8MS, 07H ;定时1s
LDI SEC_CNT0, 0FH ;SEC_CNT0/1/2 初始化为E10H - 1,即3600 -1
LDI SEC_CNT1, 00H
LDI SEC_CNT2, 0EH
LDI HOUR_CNT0, 07H ;HOUR_CNT0/1/2 初始化为2E8H - 1,即744 - 1
LDI HOUR_CNT1, 0EH
LDI HOUR_CNT2, 02H
LDI MONTH_CNT, 0BH ;MONTH_CNT 初始化为12 -1 个月
;I/O 口初始化
LDI PORTA, 00H
LDI PACR, 00H ;设置PortA 作为输入口
LDI PORTB, 00H
LDI PBCR, 00H ;设置PortB 作为输入口
LDI PORTC, 00H
LDI PCCR, 0FH ;设置PortC.0/PortC.1/PortC.2/PortC.3 作为输出
LDI PDCR, 1110B ;设置PD.0为输入,PD.3为输出
LDI TBR, 0001B ;打开PD.0 内部上拉电阻
STA PPDCR
LDI PORTE, 00H
LDI PECR, 0FH ;设置PortE 作为输出口
;ADC初始化
;tosc = 1/4M = 0.25us, tAD = 8tosc = 2us, 一次A/D 转换时间 = 204tAD = 408 us.
LDI PACR, 0000B ;设置PortA0/1 作为输入口
LDI PBCR, 0000B ;设置PortB2/3 作为输入口
LDI ADCCTL, 0001B ;选择内部参考电压VDD,使能ADC
LDI ADCCFG, 0100B ;A/D 时钟tAD=8tOSC, A/D 转换时间= 204tAD
LDI ADCPORT, 1100B ;使用AN0 ~ AN7
LDI ADCCHN, 00H ;选择AN0
ORIM ADCCFG, 1000B ;启动A/D 转换
;PWM初始化
LDI PWMC0, 0000B ;PWM0 Clock = tosc = 4M
LDI PWMP00, 0DH ;周期为125个PWM0 Clock
LDI PWMP01, 07H
LDI PWMD00, 00H ;无微调
LDI PWMD01, 0EH ;占空比为50%
LDI PWMD02, 03H
LDI PWMC1, 0000B ;PWM0 Clock = tosc = 4M
LDI PWMP10, 0DH ;周期为125个PWM0 Clock
LDI PWMP11, 07H
LDI PWMD10, 00H ;无微调
LDI PWMD11, 0EH ;占空比为50%
LDI PWMD12, 03H
;按键相关
LDI CNT0_496MS, 0DH ;初始化496ms 计数器,496 = 8 * 62
LDI CNT0_496MS, 03H ;初始化496ms 计数器
LDI BTN_PRE_STA, 01H ;初始化上一次没有按键
;状态相关
LDI SYSTEM_STATE, 00H ;初始化为"主电"
;门限值
LDI CMP_MIN_PWR0, 07H ;最小上电电压(1.396V -> 0x8E)
LDI CMP_MIN_PWR1, 04H
LDI CMP_SUPPLY0, 09H ;小于此电压,则开启应急功能(1.115V -> 0x72)
LDI CMP_SUPPLY1, 03H
LDI CMP_RESUME0, 07H ;大于此电压,则由应急转入主电(1.396V -> 0x8E)
LDI CMP_RESUME1, 04H
LDI CMP_EXIT_EMER0, 01H ;电池电压小于此电压时,关闭应急功能(0.96V -> 0x62)
LDI CMP_EXIT_EMER1, 03H
LDI CMP_BAT_OPEN0, 0FH ;电池电压大于此电压时,视为电池充电回路开路(1.56V -> 0x9F)
LDI CMP_BAT_OPEN1, 04H
LDI CMP_BAT_FULL0, 09H ;检测到电池电压大于此数值时(1.44V -> 0x93),视为电池已充满
LDI CMP_BAT_FULL1, 04H
LDI CMP_BAT_CHARGE0,05H ;检测到电池电压小于此数值时(1.35V -> 0x8A),视为电池得开始充电了
LDI CMP_BAT_CHARGE1,04H
LDI CMP_LIGHT0, 0AH ;供光源检测使用,AD转换结果小于此数值时(0.2V -> 0x14),表示光源产生故障
LDI CMP_LIGHT1, 00H
LDI CMP_TYPE00, 00H ;灯具类型门限0
LDI CMP_TYPE01, 00H
LDI CMP_TYPE10, 00H ;灯具类型门限1
LDI CMP_TYPE11, 00H
LDI CMP_TYPE20, 00H ;灯具类型门限2
LDI CMP_TYPE21, 00H
LDI CNT0_CHARGE, 0FH ;还应充电多长时间,初始值为20小时,即20 * 60 =1200分钟(0x4B0)
LDI CNT1_CHARGE, 0AH
LDI CNT2_CHARGE, 04H
LDI IRQ, 00H
LDI IE, 1100B ;打开ADC,Timer0 中断
REGISTER_INITIAL_END:
RTNI
;*****************************************************
;检查供电是否正常
;*****************************************************
PRE_START_PWR_CHK:
WAIT_AD_RESULT:
;一个通道采样4个数据,去掉最小与最大值,将余下的2个数据平均后得到最终结果。
;上述过程耗时约408us * 4 = 2ms
;根据以上推断,四个通道各得出一个最终结果需耗时 2ms * 4 = 8ms
;保险起见,此处延时20ms
CALL DELAY_5MS
CALL DELAY_5MS
CALL DELAY_5MS
CALL DELAY_5MS
WAIT_PWR_NML:
ORIM FLAG_OCCUPIED, 0100B ;锁定通道6最终结果
LDA CHN6_FINAL_RET1,01H
SUB CMP_MIN_PWR0
LDA CHN6_FINAL_RET2,01H
SBC CMP_MIN_PWR1
ANDIM FLAG_OCCUPIED, 1011B ;释放对通道6最终结果的锁定
BC WAIT_AD_RESULT ;如果未达到最小上电电压,则一直等待电压升至最小上电电压之上。
PRE_START_PWR_CHK_END:
RTNI
;***********************************************************
; 检查灯具类型
; 输入: CHN7_FINAL_RET1, CHN7_FINAL_RET2
; 输出: LIGHT_TYPE
;***********************************************************
PRE_START_TYPE_CHK:
ORIM FLAG_OCCUPIED, 1000B ;锁定通道7最终结果
LDA CHN7_FINAL_RET1,01H ;和门限0比较
SUB CMP_TYPE00
LDA CHN7_FINAL_RET2,01H
SBC CMP_TYPE01
BNC LI_ON ;