-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmain.asm
1291 lines (1237 loc) · 20.2 KB
/
main.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
PROCESSOR 16F876
#INCLUDE <P16F876A.inc>
; --- STATUS BITS -----
IR EQU 7
RP1 EQU 6
RP0 EQU 5
NOT_TO EQU 4
NOT_PD EQU 3
ZF EQU 2
DC EQU 1
CF EQU 0
; -- OPTION BITS -----
W EQU B'0'
F EQU .1
; -- GPR --
GP_STATUS EQU 20H ; for global control
SWT_STATUS EQU 21H ; for control major flags
MOD_STATUS EQU 22H ; for control mode
CLK_STATUS EQU 23H ; for control clock flags
SP_STATUS EQU 24H ; for check 0.25sec
STACK_NUM EQU 25H ; for save the number of stack
; backup buffer for interrupt
W_TEMP EQU 26H
S_TEMP EQU 27H
PC_TEMP EQU 28H
; for check time
INT_CNT EQU 29H
B_DELAY EQU 2AH
BT_DELAY EQU 2BH
; for use Analog data control
RET_VOL EQU 2CH
ANL_CNT EQU 2DH
TBF_CNT EQU 2EH
TBF_BF EQU 2FH
THBF_HALF EQU 30H
THBF_1 EQU 31H
THBF_2 EQU 32H
THBF_3 EQU 33H
THBF_4 EQU 34H
T_1 EQU 35H
T_10 EQU 36H
T_100 EQU 37H
CR_TH EQU 38H ; CuRrent THermometer value
CR_TH_LAP EQU 39H
CR_TH_BUFF EQU 3AH
;DISP BUFFER
DISPBF_1 EQU 3BH
DISPBF_2 EQU 3CH
DISPBF_3 EQU 3DH
DISPBF_4 EQU 3EH
BEEP_STATUS EQU 3FH
; define pointer's start - 40 ~ 5F
S_BUF EQU 40H
;CLOCK
D_1SEC EQU 60H
D_10SEC EQU 61H
D_1MIN EQU 62H
D_10MIN EQU 63H
D_1HR EQU 64H
D_10HR EQU 65H
D_THR EQU 66H
D_1SEC_B EQU 67H
D_10SEC_B EQU 68H
D_1MIN_B EQU 69H
D_10MIN_B EQU 6AH
D_1HR_B EQU 6BH
D_10HR_B EQU 6CH
MAIN_BF EQU 6DH
STACK_BF EQU 6EH
B_BEEP EQU 6FH
B_BEEP_CNT EQU 70H
B_BEEP_EB EQU 71H
LAP_NUM EQU 72H
; -- GPR BIT
;0-3 : FND COMMON set
INT_SWT1 EQU 0
INT_SWT2 EQU 1
INT_SWT3 EQU 2
INT_SWT4 EQU 3
;4-7 : FND dot set
DOT_SWT1 EQU 4
DOT_SWT2 EQU 5
DOT_SWT3 EQU 6
DOT_SWT4 EQU 7
; -- SPR BIT
;0 : H/M or M/S
HM_CONV EQU 0
;1 : Button Enable Flag
BT_ENABLE EQU 1
;2 : ANALOG Input Enable Flag
ANL_ENABLE EQU 2
;3 : LAP existance
LAP_EXT EQU 3
;4 : LAP overflow
LAP_OV EQU 4
;5~7 : LED dot set
LED_SWT3 EQU 5
LED_SWT2 EQU 6
LED_SWT1 EQU 7
; -- MDR BIT
;0 : Thermometer
MODE1 EQU 0
;1 : Clock
MODE2 EQU 1
;2 : Clock : Mody
MODE3 EQU 2
;3 : Ther : Lap_Check
MODE4 EQU 3
;5 : Analog check complete
AD_DONE EQU 5
;6 : ANL_MEAN_MODULATOR
HALF_CHECK EQU 6
; -- CLK BIT
;0 : HOUR
HOUR EQU 0
;1 : MIN
MIN EQU 1
;2 : SEC
SEC EQU 2
; -- SP-STATUS
;0~4 : Timer Counter
DOT_CHECK1 EQU 0
DOT_CHECK2 EQU 1
DOT_SEC EQU 2
DOT_HALF EQU 3 ; NOT USED
DOT_QUADRA EQU 4 ; NOT USED
;-- BEEP_STATUS
; check sudroutine
B_ENABLE EQU 0
B_BEEPALLOW EQU 1
B_BEEPTEMPO EQU 2
B_PRES EQU 3
; -- start
ORG 0
GOTO START_UP
; Interupt routine
ORG 4
MOVWF W_TEMP
SWAPF STATUS,W
MOVWF S_TEMP
BTFSC PIR1,6
CALL A_INTR
BTFSC INTCON,2 ;
CALL DISP
SWAPF S_TEMP,W
MOVWF STATUS
SWAPF W_TEMP,F
SWAPF W_TEMP,W
RETFIE
;######################
; D_CONV
; BIT :
; 7 6 5 4 3 2 1 0
; A B C G . F D E
;######################
D_CONV
ANDLW 0FH
ADDWF PCL,F
RETLW B'11100111' ;0
RETLW B'01100000' ;1
RETLW B'11010011' ;2
RETLW B'11110010' ;3
RETLW B'01110100' ;4
RETLW B'10110110' ;5
RETLW B'10110111' ;6
RETLW B'11100000' ;7
RETLW B'11110111' ;8
RETLW B'11110110' ;9
RETLW B'00010000' ;-
RETLW B'11111111' ;Test
RETLW B'11100101' ;C
RETLW B'00001000' ;.
RETLW B'00110111' ;E
RETLW B'00010111' ;F
;######################
; DISP
; DISP 1~4 -> LED control
;######################
DISP
CALL BTD_MOD
CALL ANL_MOD
BSF PORTA, 3
BSF PORTA, 2
BSF PORTB, 2
BSF PORTB, 1
BCF PORTB, 7
BTFSC GP_STATUS, INT_SWT1
GOTO DISP1
BTFSC GP_STATUS, INT_SWT2
GOTO DISP2
BTFSC GP_STATUS, INT_SWT3
GOTO DISP3
BTFSC GP_STATUS, INT_SWT4
GOTO DISP4
GOTO DISP_LED
DISP1
MOVF DISPBF_1,W
CALL D_CONV
MOVWF PORTC
BTFSC GP_STATUS,DOT_SWT1
BSF PORTC,3
CALL P_CONV
BCF PORTA,3
BCF GP_STATUS,INT_SWT1
BSF GP_STATUS,INT_SWT2
BCF INTCON,2
RETURN
DISP2
MOVF DISPBF_2,W
CALL D_CONV
MOVWF PORTC
BTFSC GP_STATUS,DOT_SWT2
BSF PORTC,3
CALL P_CONV
BCF PORTA,2
BCF GP_STATUS,INT_SWT2
BSF GP_STATUS,INT_SWT3
BCF INTCON,2
RETURN
DISP3
MOVF DISPBF_3,W
CALL D_CONV
MOVWF PORTC
BTFSC GP_STATUS,DOT_SWT3
BSF PORTC,3
CALL P_CONV
BCF PORTB,2
BCF GP_STATUS,INT_SWT3
BSF GP_STATUS,INT_SWT4
BCF INTCON,2
RETURN
DISP4
MOVF DISPBF_4,W
CALL D_CONV
MOVWF PORTC
BTFSC GP_STATUS,DOT_SWT4
BSF PORTC,3
CALL P_CONV
BCF PORTB,1
BCF GP_STATUS,INT_SWT4
BCF INTCON,2
RETURN
DISP_LED
CLRF PORTC
BTFSS SWT_STATUS,LED_SWT1
BSF PORTC,7
BTFSS SWT_STATUS,LED_SWT2
BSF PORTC,6
BTFSS SWT_STATUS,LED_SWT3
BSF PORTC,5
BSF PORTB,7
BSF GP_STATUS,INT_SWT1
INCF INT_CNT,F
BCF INTCON,2
RETURN
;######################
; P_CONV
; PORTC[4] -> PORTA[1]
; PORTC[3] -> PORTB[0]
;######################
P_CONV
BSF PORTA, 1
BTFSS PORTC, 4
BCF PORTA, 1
BSF PORTB, 0
BTFSS PORTC, 3
BCF PORTB, 0
RETURN
;######################
; ANL_MOD
; get some cool-down for ADC
;######################
ANL_MOD
BTFSC SWT_STATUS,ANL_ENABLE
RETURN
MOVF ANL_CNT,W
BTFSC STATUS,ZF
GOTO ANL_GO
DECF ANL_CNT,F
RETURN
ANL_GO
BSF SWT_STATUS,ANL_ENABLE
BSF ADCON0,2
RETURN
;######################
; A_INTR
;######################
A_INTR
MOVF ADRESH,W
MOVWF RET_VOL
BCF PIR1,6
BSF MOD_STATUS,AD_DONE
MOVLW .32
MOVWF ANL_CNT
BCF SWT_STATUS,ANL_ENABLE
RETURN
;######################
; BTD_MOD & BEEP_MOD
; check time to use button and buzzer
;######################
BTD_MOD
MOVF BT_DELAY,W
BTFSC STATUS,ZF
GOTO BEEP_MOD
DECF BT_DELAY,F
BEEP_MOD
MOVF B_BEEP,W
BTFSC STATUS,ZF
RETURN
DECF B_BEEP,F
RETURN
;--main
START_UP
BSF STATUS,RP0 ; BANK 1
;######################
; PORTA
; 0 = Thermometer
; 1:3 = FND (G, COM2, COM1)
; 4 = buzzer
;######################
MOVLW B'00000001'
MOVWF TRISA
;######################
; PORTB
; 0:2 = FND (DP, COM4, COM3)
; 3:5 = button
; 6:7 = MOLEX5 (5, 4)
; 7 also used on diode common
;######################
MOVLW B'00111000'
MOVWF TRISB
;######################
; PORTC
; 0:2 = FND (E, D, F)
; 5:7 = FND (C, B, A)
;######################
MOVLW B'00000000'
MOVWF TRISC
;######################
; OPTION_REG
; Timer 0 overflow after 1.024ms
; 975 * 1.024 = 998.4 ms
;######################
MOVLW B'00000001'
MOVWF OPTION_REG
;######################
; ADCON1
; Left-Justified
; {D,D,D,D,D,D,D,A}
;######################
MOVLW B'00001110'
MOVWF ADCON1
BCF STATUS,RP0 ; BANK 0
;######################
; ADCON0
; Fosc/32
; use RA0 to AN0
;######################
MOVLW B'10000001'
MOVWF ADCON0
CLRF PIR1
CLRF PIE1
BSF PIE1,6 ; ADC Interrupt Enable bit
BSF INTCON,5 ; Timer 0 Interrupt Enable bit
BSF INTCON,6 ; Peripheral Interrupt Enable bit
BSF INTCON,7 ; Global Interrupt Enable bit
DEFAULT_ST
CLRF GP_STATUS
CLRF SWT_STATUS
MOVLW B'00000001'
MOVWF MOD_STATUS
CLRF MOD_STATUS
CLRF CLK_STATUS
CLRF SP_STATUS
CLRF STACK_NUM
CLRF INT_CNT
CLRF INT_CNT
CLRF B_DELAY
CLRF BT_DELAY
CLRF TBF_CNT
CLRF ANL_CNT
CLRF D_1SEC
CLRF D_10SEC
CLRF D_1MIN
CLRF D_10MIN
CLRF D_1HR
CLRF D_10HR
CLRF D_THR
LOOP_START
CK_LPS
MOVLW .49
SUBWF INT_CNT,W
BTFSS STATUS,ZF
GOTO XLOOP
GOTO DOT_LOOP
DOT_LOOP
CLRF INT_CNT
MOVF SP_STATUS,W
ANDLW B'00000011'
MOVWF MAIN_BF
MOVLW .3
SUBWF MAIN_BF,W
BTFSC STATUS,ZF
GOTO CK_LOOP_S
INCF SP_STATUS,F
GOTO XLOOP
CK_LOOP_S
INCF INT_CNT
BCF SP_STATUS, DOT_CHECK2
BCF SP_STATUS, DOT_CHECK1
BTFSS SP_STATUS, DOT_SEC
GOTO CK_LOOP_S2
BCF SP_STATUS,DOT_SEC
GOTO CK_LOOP
CK_LOOP_S2
BSF SP_STATUS,DOT_SEC
GOTO CK_LOOP
CK_LOOP
INCF D_1SEC
MOVLW .10
SUBWF D_1SEC,W
BTFSS STATUS,ZF
GOTO XLOOP
CLRF D_1SEC
INCF D_10SEC
MOVLW .6
SUBWF D_10SEC,W
BTFSS STATUS,ZF
GOTO XLOOP
CLRF D_10SEC
INCF D_1MIN
MOVLW .10
SUBWF D_1MIN,W
BTFSS STATUS,ZF
GOTO XLOOP
CLRF D_1MIN
INCF D_10MIN
MOVLW .6
SUBWF D_10MIN,W
BTFSS STATUS,ZF
GOTO XLOOP
CLRF D_10MIN
INCF D_1HR
INCF D_THR
MOVLW .10
SUBWF D_1HR,W
BTFSS STATUS,ZF
GOTO CK_LOOP_2
CLRF D_1HR
INCF D_10HR
GOTO XLOOP
CK_LOOP_2
MOVLW .24
SUBWF D_THR,W
BTFSS STATUS,ZF
GOTO XLOOP
CLRF D_THR
CLRF D_1HR
CLRF D_10HR
GOTO XLOOP
XLOOP
GOTO DISPBF_CONTROL
XLOOP_END
THLOOP
BTFSC MOD_STATUS,AD_DONE
CALL TH_CONTROL
BT_LOOP
;######################
; Way to check Button-Input
; 1. Chattering delay is zero? -> if true, ignore input signal.
; 2. Button is floating? -> if false, ignore input signal. (until button is floating)
; 3. goto subroutine
;######################
MOVF BT_DELAY,W
BTFSS STATUS,ZF
GOTO L_LOOP
BTFSC SWT_STATUS,BT_ENABLE
GOTO BT_LOOP1
BT_CHECK
MOVF PORTB,W
ANDLW B'00011100'
XORLW B'00011100'
BTFSS STATUS,ZF
GOTO L_LOOP
BSF SWT_STATUS,BT_ENABLE
BT_LOOP1
BTFSC PORTB,3
GOTO BT_LOOP2
BCF SWT_STATUS,BT_ENABLE
CALL BEEP_2
MOVLW 7FH
MOVWF BT_DELAY
CALL BT_1
GOTO L_LOOP
BT_LOOP2
BTFSC PORTB,4
GOTO BT_LOOP3
BCF SWT_STATUS,BT_ENABLE
CALL BEEP_2
MOVLW 7FH
MOVWF BT_DELAY
CALL BT_2
GOTO L_LOOP
BT_LOOP3
BTFSC PORTB,5
GOTO L_LOOP
BCF SWT_STATUS,BT_ENABLE
CALL BEEP_2
MOVLW 7FH
MOVWF BT_DELAY
CALL BT_3
GOTO L_LOOP
BT_LOOP_END
L_LOOP
CALL BUZZ_BEEP_MOD
CALL BUZZ_CTR
GOTO LOOP_START
;######################
;Buzzer is on when B_BEEL > 0 && B_BEEPALLOW == 0 && B_BEEPTEMPO == 0
;######################
BUZZ_CTR
MOVF B_BEEP,W
BTFSC STATUS,ZF
GOTO BUZZ_OFF
BTFSC BEEP_STATUS,B_BEEPALLOW
GOTO BUZZ_OFF
BTFSC BEEP_STATUS,B_BEEPTEMPO
GOTO BUZZ_OFF
BUZZ_ON
BSF PORTA,4
RETURN
BUZZ_OFF
BCF PORTA,4
RETURN
;######################
; if (B_BEEP == 0)
; B_BEEP_CNT--; B_BEEP = 122;
; B_PRES == 1 : B_BEEP / 2;
; if (B_BEEP_CNT == 0)
; B_BEEP_EB--; B_BEEP_CNT = 8;
; When B_BEEP_EB decrease, B_BEEPTEMPO toggle.
; When B_BEEP_CNT decrease, B_BEEPALLOW toggle.
;######################
BUZZ_BEEP_MOD
MOVF B_BEEP
BTFSS STATUS, ZF
RETURN
MOVF B_BEEP_CNT
BTFSS STATUS,ZF
GOTO BEEP_MAIN
BEEP_SWT2
MOVF B_BEEP_EB
BTFSC STATUS,ZF
RETURN
DECF B_BEEP_EB
MOVLW .8
MOVWF B_BEEP_CNT
BCF BEEP_STATUS,B_BEEPALLOW
BTFSC BEEP_STATUS,B_BEEPTEMPO
GOTO CLEAR_BEEPTEM
BSF BEEP_STATUS,B_BEEPTEMPO
GOTO BEEP_MAIN
CLEAR_BEEPTEM
BCF BEEP_STATUS,B_BEEPTEMPO
GOTO BEEP_MAIN
BEEP_MAIN
DECF B_BEEP_CNT
BTFSC BEEP_STATUS,B_PRES
GOTO BEEP_MAIN1
MOVLW .122
GOTO BEEP_MAIN2
BEEP_MAIN1
MOVLW .61
BEEP_MAIN2
MOVWF B_BEEP
BTFSC BEEP_STATUS,B_BEEPALLOW
GOTO CLEAR_BEEP
BSF BEEP_STATUS,B_BEEPALLOW
RETURN
CLEAR_BEEP
BCF BEEP_STATUS,B_BEEPALLOW
RETURN
BEEP_1 ; beep 0.5sec
CLRF B_BEEP_CNT
CLRF B_BEEP_EB
MOVLW .244
MOVWF B_BEEP
BCF BEEP_STATUS,B_BEEPALLOW
BCF BEEP_STATUS,B_BEEPTEMPO
RETURN
BEEP_2 ; beep very short
CLRF B_BEEP_CNT
CLRF B_BEEP_EB
MOVLW .15
MOVWF B_BEEP
BCF BEEP_STATUS,B_BEEPALLOW
BCF BEEP_STATUS,B_BEEPTEMPO
RETURN
BEEP_3 ; beep-beep-!
CLRF B_BEEP
CLRF B_BEEP_EB
MOVLW .4
MOVWF B_BEEP_CNT
BCF BEEP_STATUS,B_BEEPALLOW
BCF BEEP_STATUS,B_BEEPTEMPO
BCF BEEP_STATUS,B_PRES
RETURN
BEEP_4 ; beep * 4
CLRF B_BEEP
CLRF B_BEEP_CNT
MOVLW .8
MOVWF B_BEEP_EB
BSF BEEP_STATUS,B_BEEPALLOW
BSF BEEP_STATUS,B_BEEPTEMPO
BSF BEEP_STATUS,B_PRES
RETURN
TH_CONTROL
BCF MOD_STATUS,AD_DONE
BTFSC TBF_CNT, 0
GOTO TH_CONT_0
BTFSC TBF_CNT, 1
GOTO TH_CONT_1
BTFSC TBF_CNT, 2
GOTO TH_CONT_2
BTFSC TBF_CNT, 3
GOTO TH_CONT_3
BTFSC TBF_CNT, 4
GOTO TH_CONT_4
BTFSC TBF_CNT, 5
GOTO TH_CONT_5
BTFSC TBF_CNT, 6
GOTO TH_CONT_6
GOTO TH_CONT_7
TH_CONT_0
MOVF RET_VOL,W
MOVWF TBF_BF
CLRF THBF_HALF
BTFSC TBF_BF,0
INCF THBF_HALF,F
RRF TBF_BF,F
MOVF TBF_BF,W
MOVWF THBF_1
BCF TBF_CNT,0
BSF TBF_CNT,1
RETURN
TH_CONT_1
MOVF RET_VOL,W
MOVWF TBF_BF
BTFSC TBF_BF,0
INCF THBF_HALF,F
RRF TBF_BF,F
MOVF TBF_BF,W
ADDWF THBF_1
BTFSC THBF_HALF,1
INCF THBF_1,F
BCF TBF_CNT,1
BSF TBF_CNT,2
RETURN
TH_CONT_2
MOVF RET_VOL,W
MOVWF TBF_BF
CLRF THBF_HALF
BTFSC TBF_BF,0
INCF THBF_HALF,F
RRF TBF_BF,F
MOVF TBF_BF,W
MOVWF THBF_2
BCF TBF_CNT,2
BSF TBF_CNT,3
RETURN
TH_CONT_3
MOVF RET_VOL,W
MOVWF TBF_BF
BTFSC TBF_BF,0
INCF THBF_HALF,F
RRF TBF_BF,F
MOVF TBF_BF,W
ADDWF THBF_2
BTFSC THBF_HALF,1
INCF THBF_1,F
BCF TBF_CNT,3
BSF TBF_CNT,4
RETURN
TH_CONT_4
MOVF RET_VOL,W
MOVWF TBF_BF
CLRF THBF_HALF
BTFSC TBF_BF,0
INCF THBF_HALF,F
RRF TBF_BF,F
MOVF TBF_BF,W
MOVWF THBF_3
BCF TBF_CNT,4
BSF TBF_CNT,5
RETURN
TH_CONT_5
MOVF RET_VOL,W
MOVWF TBF_BF
BTFSC TBF_BF,0
INCF THBF_HALF,F
RRF TBF_BF,F
MOVF TBF_BF,W
ADDWF THBF_3
BTFSC THBF_HALF,1
INCF THBF_1,F
BCF TBF_CNT,5
BSF TBF_CNT,6
RETURN
TH_CONT_6
MOVF RET_VOL,W
MOVWF TBF_BF
CLRF THBF_HALF
BTFSC TBF_BF,0
INCF THBF_HALF,F
RRF TBF_BF,F
MOVF TBF_BF,W
MOVWF THBF_4
BCF TBF_CNT,6
BSF TBF_CNT,7
RETURN
TH_CONT_7
MOVF RET_VOL,W
MOVWF TBF_BF
BTFSC TBF_BF,0
INCF THBF_HALF,F
RRF TBF_BF,F
MOVF TBF_BF,W
ADDWF THBF_4
BTFSC THBF_HALF,1
INCF THBF_1,F
CLRF THBF_HALF
BTFSC THBF_1,0
INCF THBF_HALF,F
BTFSC THBF_2,0
INCF THBF_HALF,F
RRF THBF_1
RRF THBF_2
MOVF THBF_1,W
ADDWF THBF_2
BTFSC THBF_HALF,1
INCF THBF_2,F
CLRF THBF_HALF
BTFSC THBF_3,0
INCF THBF_HALF,F
BTFSC THBF_4,0
INCF THBF_HALF,F
RRF THBF_3
RRF THBF_4
MOVF THBF_3,W
ADDWF THBF_4
BTFSC THBF_HALF,1
INCF THBF_4,F
CLRF THBF_HALF
BTFSC THBF_2,0
INCF THBF_HALF,F
BTFSC THBF_4,0
INCF THBF_HALF,F
RRF THBF_2
RRF THBF_4
MOVF THBF_2,W
ADDWF THBF_4
BTFSC THBF_HALF,1
INCF THBF_4,F
MOVF THBF_4,W
MOVWF TBF_BF
RRF TBF_BF,W
ADDWF THBF_4
MOVF THBF_4,W
MOVWF CR_TH
BCF TBF_CNT,7
BSF TBF_CNT,0
RETURN
TH_CALC
CLRF T_1
CLRF T_10
CLRF T_100
TH_CALC_LOOP
MOVF CR_TH_BUFF,W
BTFSC STATUS,ZF
RETURN
DECF CR_TH_BUFF,F
INCF T_1,F
MOVLW .10
SUBWF T_1,W
BTFSS STATUS,ZF
GOTO TH_CALC_LOOP
CLRF T_1
INCF T_10
MOVLW .10
SUBWF T_10,W
BTFSS STATUS,ZF
GOTO TH_CALC_LOOP
CLRF T_10
INCF T_100
GOTO TH_CALC_LOOP
DOT_1_ON_BLINK
BTFSC SP_STATUS, DOT_CHECK1
GOTO DOT_1_OFF
GOTO DOT_1_ON
DOT_1_OFF
BCF GP_STATUS, DOT_SWT1
RETURN
DOT_1_ON
BSF GP_STATUS, DOT_SWT1
RETURN
DOT_2_ON_BLINK
BTFSC SP_STATUS, DOT_CHECK1
GOTO DOT_2_OFF
GOTO DOT_2_ON
DOT_2_OFF
BCF GP_STATUS, DOT_SWT2
RETURN
DOT_2_ON
BSF GP_STATUS, DOT_SWT2
RETURN
DOT_3_ON_BLINK
BTFSC SP_STATUS, DOT_CHECK1
GOTO DOT_3_OFF
GOTO DOT_3_ON
DOT_3_OFF
BCF GP_STATUS, DOT_SWT3
RETURN
DOT_3_ON
BSF GP_STATUS, DOT_SWT3
RETURN
DOT_4_ON_BLINK
BTFSC SP_STATUS, DOT_CHECK1
GOTO DOT_4_OFF
GOTO DOT_4_ON
DOT_4_OFF
BCF GP_STATUS, DOT_SWT4
RETURN
DOT_4_ON
BSF GP_STATUS, DOT_SWT4
RETURN
;######################
;Stack structure
;######################
;RST_FSR
; reset FSR
;######################
RST_FSR
MOVLW 40H
MOVWF FSR
RETURN
;######################
;PUSH_STACK / POP_STACK
;######################
PUSH_STACK
MOVWF INDF
INCF FSR,F
RETURN
POP_STACK
DECF FSR,F
MOVF INDF,W
CLRF INDF
RETURN
;######################
;LAP_REG
; SEC - MIN - HR - TEMP, push 4 time.
;######################
LAP_REG
SWAPF D_10SEC,W
MOVWF STACK_BF
MOVF D_1SEC,W
ADDWF STACK_BF
MOVF STACK_BF,W
CALL PUSH_STACK
SWAPF D_10MIN,W
MOVWF STACK_BF
MOVF D_1MIN,W
ADDWF STACK_BF
MOVF STACK_BF,W
CALL PUSH_STACK
SWAPF D_10HR,W
MOVWF STACK_BF
MOVF D_1HR,W
ADDWF STACK_BF
MOVF STACK_BF,W
CALL PUSH_STACK
MOVF CR_TH,W
CALL PUSH_STACK
RETURN
;######################
;LAP_POP
; TEMP - HR - MIN - SEC, pop 4 time.
;######################
LAP_POP
CALL POP_STACK
MOVWF CR_TH_LAP
CALL POP_STACK
MOVWF STACK_BF
ANDLW 0FH
MOVWF D_1HR_B
SWAPF STACK_BF,W
ANDLW 0FH
MOVWF D_10HR_B
CALL POP_STACK
MOVWF STACK_BF
ANDLW 0FH
MOVWF D_1MIN_B
SWAPF STACK_BF,W
ANDLW 0FH
MOVWF D_10MIN_B
CALL POP_STACK
MOVWF STACK_BF
ANDLW 0FH
MOVWF D_1SEC_B
SWAPF STACK_BF,W
ANDLW 0FH
MOVWF D_10SEC_B
RETURN
CLOCKMODY_RESET_SEC
CLRF D_1SEC
CLRF D_10SEC
RETURN
CLOCKMODY_INCF_MIN
INCF D_1MIN
MOVLW .10
SUBWF D_1MIN,W
BTFSS STATUS,ZF
RETURN
CLRF D_1MIN
INCF D_10MIN
MOVLW .6
SUBWF D_10MIN,W
BTFSS STATUS,ZF
RETURN
CLRF D_10MIN
RETURN
RETURN
CLOCKMODY_INCF_HOUR
INCF D_1HR
INCF D_THR
MOVLW .10
SUBWF D_1HR,W
BTFSS STATUS,ZF
GOTO C_INCF_HR_2
CLRF D_1HR
INCF D_10HR
C_INCF_HR_2
MOVLW .24
SUBWF D_THR,W
BTFSS STATUS,ZF
RETURN
CLRF D_THR
CLRF D_10HR
CLRF D_1HR
RETURN
CLOCKMODY_DECF_MIN
MOVF D_1MIN,W
BTFSC STATUS,ZF
GOTO D_1MIN_ZF
DECF D_1MIN
RETURN
D_1MIN_ZF
MOVF D_10MIN,W
BTFSC STATUS,ZF
GOTO D_10MIN_ZF