-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy path(legacy)QuadraSquareStop.asm
1246 lines (1202 loc) · 21.6 KB
/
(legacy)QuadraSquareStop.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
; --- REGISTER FILES 선언 -------
; BANK 0
INDF EQU 00H
TMR0 EQU 01H
PCL EQU 02H
STATUS EQU 03H
FSR EQU 04H
PORTA EQU 05H
PORTB EQU 06H
PORTC EQU 07H
EEDATA EQU 08H
EEADR EQU 09H
PCLATH EQU 0AH
INTCON EQU 0BH
PIR1 EQU 0CH
PIR2 EQU 0DH
RCSTA EQU 18H
TXREG EQU 19H
; BANK 1
OPTIONR EQU 81H
TRISA EQU 85H
TRISB EQU 86H
TRISC EQU 87H
EECON1 EQU 88H
EECON2 EQU 89H
PIE1 EQU 8CH
PIE2 EQU 8DH
TXSTA EQU 98H
SPBRG EQU 99H
ADCON1 EQU 9FH
; --- STATUS BITS 선언 -----
IR EQU 7
RP1 EQU 6
RP0 EQU 5
NOT_TO EQU 4
NOT_PD EQU 3
ZF EQU 2 ; ZERO FLAG BIT
DC EQU 1 ; DIGIT CARRY/BORROW BIT
CF EQU 0 ; CARRY/BORROW FLAG BIT
; -- INTCON BITS 선언 -----
; -- OPTION BITS 선언 -----
W EQU B'0' ; W 변수를 0으로 선언
F EQU .1 ; F 변수를 1로 선언
; -- GPR 선언 --
; 확장 스테이터스 레지스터들
GP_STATUS EQU 24H
SWT_STATUS EQU 25H
SP_STATUS EQU 26H
MOD_STATUS EQU 27H
; 현재 랩 번호 저장
LAP_NUM EQU 28H
;인터럽트 백업
W_TEMP EQU 29H
S_TEMP EQU 2AH
;카운터
INT_CNT EQU 2BH
TMR_CNT EQU 2CH
SW_CNT EQU 2DH
;데이터 버퍼
SWT_BF EQU 2EH
MAIN_BF EQU 2FH
STACK_BF EQU 30H
;CLOCK
D_1SEC EQU 31H
D_10SEC EQU 32H
D_1MIN EQU 33H
D_10MIN EQU 34H
D_1HR EQU 35H
D_10HR EQU 36H
D_THR EQU 37H
BT_DELAY EQU 38H
B_BEEP EQU 39H
B_BEEP_CNT EQU 3AH
B_BEEP_EB EQU 3BH
;TIMER
T_1SEC EQU 61H
T_10SEC EQU 62H
T_1MIN EQU 63H
T_10MIN EQU 64H
T_1HR EQU 65H
T_10HR EQU 66H
;STOPWATCH
S_1SEC EQU 68H
S_10SEC EQU 69H
S_1MIN EQU 6AH
S_10MIN EQU 6BH
;DISP BUFFER
DISPBF_1 EQU 71H
DISPBF_2 EQU 72H
DISPBF_3 EQU 73H
DISPBF_4 EQU 74H
; -- GP-STATUS BIT 선언 --
;0-1 : 현재 전원을 넣을 7세그먼트 번호를 저장함
INT_SWT1 EQU 0
INT_SWT2 EQU 1
INT_SWT3 EQU 2
INT_SWT4 EQU 3
;4-7 : 몇번째 세그먼트의 도트가 켜지는지 저장함
DOT_SWT1 EQU 4
DOT_SWT2 EQU 5
DOT_SWT3 EQU 6
DOT_SWT4 EQU 7
; -- SWT-STATUS BIT 선언
;0 : 현재 보여줄것이 시/분인지 분/초인지
HM_CONV EQU 0
;1
BACK_CLOCK EQU 1
;2
BACK_TIMER EQU 2
;3 : 버튼 입력 가능한지 여부
BT_ENABLE EQU 3
;4 : 타이머 동작여부
TIMER_ON EQU 4
;5 : 스톱워치 동작여부
SW_ON EQU 5
;6 : LAP 존재여부
LAP_EXT EQU 6
;7 : LAP 가득참
LAP_OV EQU 7
; -- MOD-STATUS BIT 선언
;0 : 시계모드
MODE1 EQU 0
;1 : 타이머설정모드
MODE2 EQU 1
;2 : 타이머작동모드
MODE3 EQU 2
;3 : 스톱워치모드
MODE4 EQU 3
;4 : 부저 온오프 관리 (사용안함)
B_ENABLE EQU 4
;5 : 부저 박자 관리
B_BEEPALLOW EQU 5
;6 : 부저 박자 관리 2
B_BEEPTEMPO EQU 6
;7 : 부저 박자 관리 3
B_PRES EQU 7
; SP-STATUS BIT 선언
;0~4 : 타이머 카운터
DOT_CHECK1 EQU 0
DOT_CHECK2 EQU 1
DOT_SEC EQU 2
DOT_HALF EQU 3 ; (사용안함)
DOT_QUADRA EQU 4 ; (사용안함)
; 5 : 현재 랩확인모드인가?
LAP_CHECK EQU 5
; -- start
ORG 0
GOTO START_UP
; Interupt routine
ORG 4
MOVWF W_TEMP ; W,S 백업
SWAPF STATUS,W
MOVWF S_TEMP
CALL DISP ; DISPLAY 부 프로그램
BT_MOD ; 버튼 채터링 지연시간 관리
MOVF BT_DELAY,W
BTFSC STATUS,ZF
GOTO BEEP_MOD
DECF BT_DELAY,F
BEEP_MOD ; 부저 소리 길이 관리
MOVF B_BEEP,W
BTFSC STATUS,ZF
GOTO L_LOOP1
DECF B_BEEP,F
L_LOOP1 ; 백업한걸 되돌림
SWAPF S_TEMP,W
MOVWF STATUS
SWAPF W_TEMP,F
SWAPF W_TEMP,W
BCF INTCON,2
RETFIE
DISP
BTFSC GP_STATUS, INT_SWT1
GOTO DISP1
BTFSC GP_STATUS, INT_SWT2
GOTO DISP2
BTFSC GP_STATUS, INT_SWT3
GOTO DISP3
GOTO DISP4
;각각의 디스플레이를 구현
DISP1
BSF PORTA,3
MOVF DISPBF_1,W
CALL D_CONV
MOVWF PORTC
BTFSC GP_STATUS,DOT_SWT1
BSF PORTC,0
BCF PORTA,0
BCF GP_STATUS,INT_SWT1
BSF GP_STATUS,INT_SWT2
INCF TMR_CNT,F
RETURN
DISP2
BSF PORTA,0
MOVF DISPBF_2,W
CALL D_CONV
MOVWF PORTC
BTFSC GP_STATUS,DOT_SWT2
BSF PORTC,0
BCF PORTA,1
BCF GP_STATUS,INT_SWT2
BSF GP_STATUS,INT_SWT3
INCF SW_CNT,F
RETURN
DISP3
BSF PORTA,1
MOVF DISPBF_3,W
CALL D_CONV
MOVWF PORTC
BTFSC GP_STATUS,DOT_SWT3
BSF PORTC,0
BCF PORTA,2
BCF GP_STATUS,INT_SWT3
BSF GP_STATUS,INT_SWT4
RETURN
DISP4
BSF PORTA,2
MOVF DISPBF_4,W
CALL D_CONV
MOVWF PORTC
BTFSC GP_STATUS,DOT_SWT4
BSF PORTC,0
BCF PORTA,3
BCF GP_STATUS,INT_SWT4
BSF GP_STATUS,INT_SWT1
INCF INT_CNT,F
RETURN
D_CONV
ANDLW 0FH
ADDWF PCL,F
RETLW B'11111100' ; 0
RETLW B'01100000' ; 1
RETLW B'11011010' ; 2
RETLW B'11110010' ; 3
RETLW B'01100110' ; 4
RETLW B'10110110' ; 5
RETLW B'10111110' ; 6
RETLW B'11100100' ; 7
RETLW B'11111110' ; 8
RETLW B'11110110' ; 9
RETLW B'00000010' ; -
RETLW B'00000000' ;
RETLW B'00011010' ; c
RETLW B'00000001' ; .
RETLW B'10011110' ; E
RETLW B'10001110' ; F
;--main
START_UP
CLRF STATUS
BSF STATUS,RP0 ; RAM BANK 1 선택
MOVLW B'00000000' ; PORT I/O 선택
MOVWF TRISA
MOVLW B'00001111' ; PORT I/O 선택
MOVWF TRISB
MOVLW B'00000000' ; PORT I/O 선택
MOVWF TRISC
MOVLW B'00000001' ; 1.024msec (1:4)
MOVWF OPTIONR
BCF STATUS,RP0 ; RAM BANK 0 선택
BSF INTCON,5 ; TIMER INTERRUPT ENABLE
BSF INTCON,7 ; GLOBAL INT. ENABLE
DEFAULT_ST ; 초기설정 초기화
DEFAULT_MOD
MOVLW B'00000001'
MOVWF MOD_STATUS
CLRF SWT_STATUS
BCF SWT_STATUS, HM_CONV
CLRF GP_STATUS
CLRF BT_DELAY
CLRF B_BEEP
CLRF SP_STATUS
MOVLW B'00001111'
MOVWF PORTA ; 커먼 캐소드 방식이므로 초기화 필요
CALL DEFAULT_CLOCK
CALL DEFAULT_TMR
CALL DEFAULT_SW
GOTO M_LOOP
DEFAULT_CLOCK
CLRF D_1SEC
CLRF D_10SEC
CLRF D_1MIN
CLRF D_10MIN
CLRF D_1HR
CLRF D_10HR
CLRF D_THR
CLRF INT_CNT
RETURN
DEFAULT_TMR
CLRF T_1SEC
CLRF T_10SEC
CLRF T_1MIN
CLRF T_10MIN
CLRF T_1HR
CLRF T_10HR
CLRF TMR_CNT
RETURN
DEFAULT_SW
CLRF S_1SEC
CLRF S_10SEC
CLRF S_1MIN
CLRF S_10MIN
CLRF SW_CNT
CLRF LAP_NUM
MOVLW 40H
MOVWF FSR
RETURN
M_LOOP
TM_LPS ;타이머 확인
BTFSC SWT_STATUS, TIMER_ON
GOTO TM_LP ; 타이머 작동모드
GOTO SW_LPS
TM_LP ; 타이머 작동모드
MOVLW .244
SUBWF TMR_CNT,W
BTFSS STATUS,ZF
GOTO SW_LPS
CLRF TMR_CNT
TM_START ; 타이머는 시계와 달리 반대로 동작하므로 DECF와 ZF를 사용해 구현한다.
MOVF T_1SEC,W
BTFSC STATUS,ZF
GOTO TM_1_ZF
DECF T_1SEC
GOTO TM_LPE
TM_1_ZF
MOVF T_10SEC,W
BTFSC STATUS,ZF
GOTO TM_10_ZF
DECF T_10SEC
MOVLW .10
MOVWF T_1SEC
GOTO TM_START ; 반대로 동작하므로 내림을 받고 처음부터 다시 루프를 돌려야한다.
TM_10_ZF
MOVF T_1MIN,W
BTFSC STATUS,ZF
GOTO TM_1M_ZF
DECF T_1MIN
MOVLW .6
MOVWF T_10SEC
GOTO TM_START
TM_1M_ZF
MOVF T_10MIN,W
BTFSC STATUS,ZF
GOTO TM_10M_ZF
DECF T_10MIN
MOVLW .10
MOVWF T_1MIN
GOTO TM_START
TM_10M_ZF
MOVF T_1HR,W
BTFSC STATUS,ZF
GOTO TM_1H_ZF
DECF T_1HR
MOVLW .6
MOVWF T_10MIN
GOTO TM_START
TM_1H_ZF
MOVF T_10HR,W
BTFSC STATUS,ZF
GOTO TM_10H_ZF
DECF T_10HR
MOVLW .10
MOVWF T_1HR
GOTO TM_START
TM_10H_ZF
CALL BEEP_4 ; 모든 자리가 0이 될때 타이머가 끝난다는것을 알려준다.
BCF SWT_STATUS, TIMER_ON
BTFSS MOD_STATUS, MODE3
GOTO TM_LPE
BCF MOD_STATUS, MODE2
GOTO TM_LPE
TM_LPE
SW_LPS ;스톱워치 확인
BTFSC SWT_STATUS, SW_ON
GOTO SW_LP
CLRF SW_CNT
GOTO CK_LPS
SW_LP
MOVLW .244
SUBWF SW_CNT,W
BTFSS STATUS,ZF
GOTO SW_LPE
GOTO SW_LOOP
SW_LOOP
CLRF SW_CNT ; 다음 1초를 기다리기 위한 초기화 SW_CNT=0
INCF S_1SEC
MOVLW .10
SUBWF S_1SEC,W
BTFSS STATUS,ZF
GOTO XLOOP
CLRF S_1SEC
INCF S_10SEC
MOVLW .6
SUBWF D_10SEC,W
BTFSS STATUS,ZF
GOTO XLOOP
CLRF S_10SEC
INCF S_1MIN
MOVLW .10
SUBWF D_1MIN,W
BTFSS STATUS,ZF
GOTO XLOOP
CLRF D_1MIN
INCF D_10MIN
MOVLW .10
SUBWF D_10MIN,W
BTFSS STATUS,ZF
GOTO SW_LPE
CALL BEEP_3
GOTO SW_LPE
SW_LPE
CK_LPS ;시계는 무조건 작동해야한다.
MOVLW .61
SUBWF INT_CNT,W
BTFSS STATUS,ZF
GOTO XLOOP
GOTO DOT_LOOP
DOT_LOOP ; 1초를 4개로 나눠서 0.25초 단위로 동작하도록 한다.
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
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 ; 1초단위의 클록이 필요한 기능이 없으므로 실제로는 필요없는 부분.
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 ; 시계는 24시간이 최대이므로 24시간을 체크하는 변수를 따로 둔다.
SUBWF D_THR,W
BTFSS STATUS,ZF
GOTO XLOOP
CLRF D_THR
CLRF D_1HR
CLRF D_10HR
GOTO XLOOP
XLOOP
; 모드에 따라 FND에 들어가야하는 데이터가 다르므로 그것을 분류해주는 루프
; 타이머는 백그라운드에서도 작동하고, 랩 체크는 한 모드안에서도 켜지고 꺼지는 경우가 다르므로 따로 체크한다.
DOT_1_SP
BTFSS SWT_STATUS, TIMER_ON
GOTO DOT_1_OFF
BSF GP_STATUS, DOT_SWT1
GOTO DOT_2_SP
DOT_1_OFF
BCF GP_STATUS, DOT_SWT1
DOT_2_SP
BTFSC MOD_STATUS, MODE2
GOTO DOT_3_SP
BTFSC SP_STATUS, LAP_CHECK
GOTO DOT_3_SP
BCF GP_STATUS, DOT_SWT2
DOT_3_SP
BTFSC MOD_STATUS, MODE3
GOTO DOT_4_SP
BCF GP_STATUS, DOT_SWT3
DOT_4_SP
XLOOP_START ; 현재 모드별로 분기
BTFSC MOD_STATUS, MODE1
GOTO MODE1_XLOOP
BTFSC MOD_STATUS, MODE2
GOTO MODE2_XLOOP_START
BTFSC MOD_STATUS, MODE3
GOTO MODE2_XLOOP
BTFSC MOD_STATUS, MODE4
GOTO MODE4_XLOOP
GOTO BT_LOOP
MODE1_XLOOP
BCF GP_STATUS, DOT_SWT2
BCF GP_STATUS, DOT_SWT3
BTFSS SWT_STATUS, HM_CONV ; 시/분 , 분/초 별로 분기
GOTO MODE1_1_XLOOP
GOTO MODE1_2_XLOOP
MODE1_1_XLOOP
BSF GP_STATUS, DOT_SWT4
MOVF D_1MIN,W
MOVWF DISPBF_1
MOVF D_10MIN,W
MOVWF DISPBF_2
MOVF D_1HR,W
MOVWF DISPBF_3
MOVF D_10HR,W
MOVWF DISPBF_4
GOTO BT_LOOP
MODE1_2_XLOOP
BCF GP_STATUS, DOT_SWT4
MOVF D_1SEC,W
MOVWF DISPBF_1
MOVF D_10SEC,W
MOVWF DISPBF_2
MOVF D_1MIN,W
MOVWF DISPBF_3
MOVF D_10MIN,W
MOVWF DISPBF_4
GOTO BT_LOOP
MODE2_XLOOP_START
BSF GP_STATUS, DOT_SWT2
GOTO MODE2_XLOOP
MODE2_XLOOP
BTFSS SWT_STATUS, HM_CONV
GOTO MODE2_1_XLOOP
GOTO MODE2_2_XLOOP
MODE2_1_XLOOP
BSF GP_STATUS, DOT_SWT4
MOVF T_1MIN,W
MOVWF DISPBF_1
MOVF T_10MIN,W
MOVWF DISPBF_2
MOVF T_1HR,W
MOVWF DISPBF_3
MOVF T_10HR,W
MOVWF DISPBF_4
GOTO BT_LOOP
MODE2_2_XLOOP
BCF GP_STATUS, DOT_SWT4
MOVF T_1SEC,W
MOVWF DISPBF_1
MOVF T_10SEC,W
MOVWF DISPBF_2
MOVF T_1MIN,W
MOVWF DISPBF_3
MOVF T_10MIN,W
MOVWF DISPBF_4
GOTO BT_LOOP
MODE4_XLOOP
BTFSS SWT_STATUS,SW_ON
GOTO DOT_3_ON_BLINK
GOTO DOT_3_ON
DOT_3_ON_BLINK ; 스톱워치가 정지된 상황이라면 깜빡이도록 한다. 0.25초 간격으로 토글되도록 카운터를 사용한다.
BTFSC SP_STATUS, DOT_CHECK1
GOTO DOT_3_OFF
GOTO DOT_3_ON
DOT_3_OFF
BCF GP_STATUS, DOT_SWT3
GOTO MODE4_XLOOP_2
DOT_3_ON
BSF GP_STATUS, DOT_SWT3
GOTO MODE4_XLOOP_2
MODE4_XLOOP_2
BTFSS SWT_STATUS, LAP_EXT
GOTO DOT_4_OFF
BTFSS SWT_STATUS, LAP_OV
GOTO DOT_4_ON
GOTO DOT_4_ON_BLINK
DOT_4_ON_BLINK ; 랩이 가득찼다면 0.25초 간격으로 토글되도록 카운터를 사용한다.
BTFSC SP_STATUS, DOT_CHECK1
GOTO DOT_4_OFF
GOTO DOT_4_ON
DOT_4_OFF
BCF GP_STATUS, DOT_SWT4
GOTO MODE4_XLOOP_BCD
DOT_4_ON
BSF GP_STATUS, DOT_SWT4
GOTO MODE4_XLOOP_BCD
MODE4_XLOOP_BCD
BTFSC SP_STATUS, LAP_CHECK
BSF GP_STATUS, DOT_SWT2
MOVF S_1SEC,W
MOVWF DISPBF_1
MOVF S_10SEC,W
MOVWF DISPBF_2
MOVF S_1MIN,W
MOVWF DISPBF_3
MOVF S_10MIN,W
MOVWF DISPBF_4
GOTO BT_LOOP
BT_LOOP
; 버튼 입력의 순서는 다음과 같다.
; 1. 채터링 지연시간이 흘렀는가? -> 아직이라면 버튼입력을 무시한다.
; 2. 버튼에서 손을 때었는가? -> 손을 땔 때 까지 추가적인 버튼입력을 무시한다.
; 3. 무슨 버튼을 눌렀는가? -> 버튼에 따라 분기.
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'00001111'
XORLW B'00001111' ; 버튼을 부르면 0이 입력되므로 가공절차가 필요하다.
BTFSS STATUS,ZF
GOTO L_LOOP
BSF SWT_STATUS,BT_ENABLE
BT_LOOP1
BTFSC PORTB,0
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,1
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,2
GOTO BT_LOOP4
BCF SWT_STATUS,BT_ENABLE
CALL BEEP_2
MOVLW 7FH
MOVWF BT_DELAY
CALL BT_3
GOTO L_LOOP
BT_LOOP4
BTFSC PORTB,3
GOTO L_LOOP
BCF SWT_STATUS,BT_ENABLE
CALL BEEP_2
MOVLW 7FH
MOVWF BT_DELAY
CALL BT_4
GOTO L_LOOP
L_LOOP
; 루프의 마지막에는 부저를 관리한다.
CALL BUZZ_BEEP_MOD
CALL BUZZ_CTR
GOTO M_LOOP
;######################
; 버튼 입력 서브루틴
; 각각의 모드와 눌러진 버튼을 확인해
; 버튼 입력후의 업무를 시행한다.
;######################
; BT_4
; 시계 : FND 4~3 자리의 수치를 증가시킨다.
; 타이머 설정 : 시계와 동일
; 타이머 동작 : 설정으로 돌아간다
; 스톱워치 : 랩을 등록한다. 랩 확인중에는 다음 랩을 확인한다.
;######################
BT_4
BTFSC MOD_STATUS, MODE1
GOTO BT_4_1
BTFSC MOD_STATUS, MODE2
GOTO BT_4_2
BTFSC MOD_STATUS, MODE3
GOTO BT_4_3
BTFSC MOD_STATUS, MODE4
GOTO BT_4_4
GOTO L_LOOP
BT_4_1
BTFSS SWT_STATUS, HM_CONV
GOTO C_INCF_HR
GOTO C_INCF_MIN
BT_4_2
BTFSS SWT_STATUS, HM_CONV
GOTO T_INCF_HR
GOTO T_INCF_MIN
BT_4_3
BCF SWT_STATUS,TIMER_ON
BCF MOD_STATUS,MODE3
BSF MOD_STATUS,MODE2
RETURN
BT_4_4
BTFSS SP_STATUS, LAP_CHECK
GOTO LAP_PLUS
GOTO CHECK_NEXTLAP
LAP_PLUS
BTFSC SWT_STATUS, LAP_OV
GOTO LAP_PLUS_OVER
BSF SWT_STATUS,LAP_EXT
INCF LAP_NUM
CALL LAP_REG
BTFSC LAP_NUM,4
BSF SWT_STATUS, LAP_OV
RETURN
LAP_PLUS_OVER
CALL BEEP_2
RETURN
CHECK_NEXTLAP
MOVF LAP_NUM,W
BTFSC STATUS,ZF
GOTO LAP_ENDED
BCF SWT_STATUS, LAP_OV
DECF LAP_NUM
CALL LAP_POP
MOVF LAP_NUM,W
BTFSC STATUS,ZF
GOTO LAP_LAST
RETURN
LAP_LAST
BCF SWT_STATUS,LAP_EXT
RETURN
LAP_ENDED
CLRF S_1SEC
CLRF S_10SEC
CLRF S_1MIN
CLRF S_10MIN
CLRF SW_CNT
BCF SP_STATUS, LAP_CHECK
RETURN
;######################
; BT_3
; 시계 : FND 2~1 자리의 수치를 증가시킨다.
; 타이머 설정 : 시계와 동일
; 타이머 동작 : 타이머를 초기화하고 설정으로 돌아간다.
; 스톱워치 : 랩 확인모드로 들어간다. 이미 확인모드 일 경우 스톱워치를 리셋한다.
;######################
BT_3
BTFSC MOD_STATUS, MODE1
GOTO BT_3_1
BTFSC MOD_STATUS, MODE2
GOTO BT_3_2
BTFSC MOD_STATUS, MODE3
GOTO BT_3_3
BTFSC MOD_STATUS, MODE4
GOTO BT_3_4
GOTO L_LOOP
BT_3_1
BTFSS SWT_STATUS, HM_CONV
GOTO C_INCF_MIN
GOTO C_INCF_SEC
BT_3_2
BTFSS SWT_STATUS, HM_CONV
GOTO T_INCF_MIN
GOTO T_INCF_SEC
BT_3_3
BCF SWT_STATUS,TIMER_ON
CLRF T_1SEC
CLRF T_10SEC
CLRF T_1MIN
CLRF T_10MIN
CLRF T_1HR
CLRF T_10HR
CLRF TMR_CNT
BCF MOD_STATUS,MODE3
BSF MOD_STATUS,MODE2
RETURN
BT_3_4
BTFSS SP_STATUS, LAP_CHECK
GOTO CHECK_ON
GOTO SW_RESET
CHECK_ON
BSF SP_STATUS,LAP_CHECK
BCF SWT_STATUS, SW_ON
RETURN
SW_RESET
CLRF S_1SEC
CLRF S_10SEC
CLRF S_1MIN
CLRF S_10MIN
CLRF SW_CNT
BCF SP_STATUS, LAP_CHECK
MOVLW 40H
MOVWF FSR
CLRF LAP_NUM
BCF SWT_STATUS, LAP_EXT
BCF SWT_STATUS, LAP_OV
RETURN
;######################
; BT_2
; 시계 : 시/분 모드와 분/초 모드를 토글한다.
; 타이머 설정 : 시계와 동일
; 타이머 동작 : 시계와 동일
; 스톱워치 : 시작/일시정지. 랩 확인모드에는 불가능
;######################
BT_2
BTFSC MOD_STATUS, MODE1
GOTO BT_2_1
BTFSC MOD_STATUS, MODE2
GOTO BT_2_1
BTFSC MOD_STATUS, MODE3
GOTO BT_2_1
BTFSC MOD_STATUS, MODE4
GOTO BT_2_4
GOTO L_LOOP
BT_2_1
BTFSS SWT_STATUS, HM_CONV
GOTO HM_CONV_SET
BCF SWT_STATUS,HM_CONV
RETURN
HM_CONV_SET
BSF SWT_STATUS,HM_CONV
RETURN
BT_2_4
BTFSS SP_STATUS, LAP_CHECK
GOTO SW_LATCH
RETURN
SW_LATCH
BTFSS SWT_STATUS, SW_ON
GOTO SW_LATCH_SET
BCF SWT_STATUS,SW_ON
RETURN
SW_LATCH_SET
BSF SWT_STATUS,SW_ON
RETURN
;######################
; BT_1
; 모드를 변경한다.
; 시계 - 타이머설정 - 타이머동작 - 스톱워치 순으로 변경된다.
; 이미 타이머가 동작중이라면 시계에서 바로 타이머동작으로 간다.
; 타이머설정중에 시간을 0초로 해 둘 경우 바로 스톱워치로 간다.
;######################
BT_1
BTFSC MOD_STATUS, MODE1
GOTO MODCONV1
BTFSC MOD_STATUS, MODE2
GOTO MODCONV2
BTFSC MOD_STATUS, MODE3
GOTO MODCONV3
GOTO MODCONV4
RETURN
C_INCF_HR
INCF D_1HR ; 10초 단위 변수 증가
INCF D_THR
MOVLW .10 ; 수정하면 표시숫자 범위 수정가능
SUBWF D_1HR,W
BTFSS STATUS,ZF
GOTO C_INCF_HR_2
CLRF D_1HR
INCF D_10HR ; 10초 단위 변수 증가
C_INCF_HR_2
MOVLW .24 ; 수정하면 표시숫자 범위 수정가능
SUBWF D_THR,W
BTFSS STATUS,ZF
RETURN
CLRF D_THR
CLRF D_10HR
CLRF D_1HR
RETURN
C_INCF_MIN
INCF D_1MIN ; 10초 단위 변수 증가
MOVLW .10 ; 수정하면 표시숫자 범위 수정가능
SUBWF D_1MIN,W
BTFSS STATUS,ZF
RETURN
;10분마다
CLRF D_1MIN
INCF D_10MIN ; 10초 단위 변수 증가
MOVLW .6 ; 수정하면 표시숫자 범위 수정가능
SUBWF D_10MIN,W
BTFSS STATUS,ZF
RETURN
CLRF D_10MIN
RETURN
C_INCF_SEC
CLRF D_1SEC
CLRF D_10SEC
RETURN
T_INCF_HR
INCF T_1HR ; 10초 단위 변수 증가
MOVLW .10 ; 수정하면 표시숫자 범위 수정가능
SUBWF T_1HR,W
BTFSS STATUS,ZF
RETURN
;10분마다
CLRF T_1HR
INCF T_10HR ; 10초 단위 변수 증가
MOVLW .3 ; 수정하면 표시숫자 범위 수정가능
SUBWF T_10HR,W
BTFSS STATUS,ZF
RETURN
CLRF T_10HR
RETURN
T_INCF_MIN
INCF T_1MIN ; 10초 단위 변수 증가
MOVLW .10 ; 수정하면 표시숫자 범위 수정가능
SUBWF T_1MIN,W
BTFSS STATUS,ZF
RETURN
;10분마다
CLRF T_1MIN
INCF T_10MIN ; 10초 단위 변수 증가
MOVLW .6 ; 수정하면 표시숫자 범위 수정가능
SUBWF T_10MIN,W
BTFSS STATUS,ZF
RETURN
CLRF T_10MIN
RETURN
T_INCF_SEC
INCF T_1SEC ; 10초 단위 변수 증가
MOVLW .10 ; 수정하면 표시숫자 범위 수정가능
SUBWF T_1SEC,W
BTFSS STATUS,ZF
RETURN
;10분마다
CLRF T_1SEC
INCF T_10SEC ; 10초 단위 변수 증가
MOVLW .6 ; 수정하면 표시숫자 범위 수정가능
SUBWF T_10SEC,W
BTFSS STATUS,ZF
RETURN
CLRF T_10SEC
RETURN
;######################
;STACK구조
;######################
;RST_FSR
; FSR을 초기화한다.
;######################
RST_FSR
MOVLW 40H
MOVWF FSR
RETURN
;######################
;PUSH_STACK / POP_STACK
; 값을 넣고 FSR을 늘린다.
; FSR을 줄이고 값을 뺀다.
;######################
PUSH_STACK
MOVWF INDF
INCF FSR,F
RETURN
POP_STACK
DECF FSR,F
MOVF INDF,W
CLRF INDF
RETURN
;######################
;LAP_REG
; 2번의 PUSH로 이루어진다.
; 10초 - 1초 / 10분 - 1분 순서로 PUSH한다.
;######################
LAP_REG
SWAPF S_10SEC,W