-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathOpoznienia.a51
127 lines (110 loc) · 4.85 KB
/
Opoznienia.a51
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
;-----------------------------------------------------------------
; Kilka sposobow na realizacje opoznien w 8051
; by Gorka Mateusz
;-----------------------------------------------------------------
LEDS EQU P1 ; diody LED na P1 (0=ON)
;-----------------------------------------------------------------
TIME_MS EQU 50 ; czas w [ms]
CYCLES EQU (1000 * TIME_MS) ; czas w cyklach (f = 12 MHz)
LOAD EQU (65536 - CYCLES) ; wartosc ladowana do TH0|TL0
;-----------------------------------------------------------------
CNT_50 EQU 30h ; licznik w ramach sekundy
SEC EQU 33h ; sekundy
MIN EQU 32h ; minuty
HOUR EQU 31h ; godziny
;-----------------------------------------------------------------
; Zapala co 50ms kolejna diode.
;-----------------------------------------------------------------
ORG 0
lcall init_clock
mov LEDS, #0feh ; zapalenie 1 diody
leds_loop:
mov a, LEDS ; przesuniecie diody
rl a ; ...
mov LEDS, a ; ...
lcall delay_timer_50ms ; Opoznienie o 50ms
lcall update_time ; Aktualizacja czasu
sjmp leds_loop
;---------------------------------------------------------------------
; Inicjalizuje timer0
; TMOD:
; GATE - 0
; C/T - 0 - timer
; M1 - 0 }
; M0 - 1 } - tryb 16-bitowy
;---------------------------------------------------------------------
init_clock:
anl TMOD, #0f0h ; Konfiguracja Timer0: #0001b (czyscimy)
orl TMOD, #001h ; ... (nadpisujemy)
mov CNT_50, #20 ; Licznik dla procedury update_time
mov SEC, #55 ; Wartosci poczatkowe dla liczenia
mov MIN, #58
mov HOUR, #23
ret
;---------------------------------------------------------------------
; Opoznienie 50 ms (zegar 12 MHz)
; 50ms = 50 000 us = 500us * 100
;---------------------------------------------------------------------
delay_50ms:
mov R1, #100 ; 1
_50ms_loop:
nop ; 1 x 100 = 100
mov R2, #248 ; 1 x 100 = 100
djnz R2, $ ; 2 x 100 x 248 = 49 600
djnz R1, _50ms_loop ; 2 x 100 = 200
ret ; + ______2______
; 50 003 cykli
;---------------------------------------------------------------------
; Opoznienie n * 50 ms (zegar 12 MHz)
; R7 - n, czas x 50 ms
;---------------------------------------------------------------------
delay_nx50ms:
mov R6, #100 ; 1 x N = 1N
n_50ms_loop:
mov R5, #248 ; 1 x N x 100 = 100N
nop ; 1 x N x 100 = 100N
djnz R5, $ ; 2 x N x 100x248=49 600N
djnz R6, n_50ms_loop ; 2 x N x 100 = 200N
djnz R7, delay_nx50ms ; 2 x N = 2N
ret ; 2 + _______2_____
; 50 003N + 2
;---------------------------------------------------------------------
; Opoznienie 50 ms z uzyciem Timera 0 (zegar 12 MHz)
delay_timer_50ms:
mov TL0, #low(load)
mov TH0, #high(load)
setb TR0
jnb TF0, $
clr TR0
clr TF0
ret
;---------------------------------------------------------------------
; Aktualizacja czasu w postaci (HOUR : MIN : SEC) | CNT_50
; Przy wywolywaniu procedury co 50 ms
; wykonywana jest aktualizacja czasu rzeczywistego
;
; Co ile wywolan?| Ile cykli?
; 1 | 4 cykle
; 20 | 9 cykli
; 120 | 14 cykli
; 72000 | 19 cykli
; 1728000 | 20 cykli
;---------------------------------------------------------------------
update_time:
djnz CNT_50, no_change ; licznik (co 20)
mov CNT_50, #20
inc SEC ; Aktualizacja sekund
mov A, SEC
cjne A, #60, no_change
mov SEC, #0 ; Aktualizacja minut
inc MIN
mov A, MIN
cjne A, #60, no_change
mov MIN, #0 ; Aktualizacja godzin
inc HOUR
mov A, HOUR
cjne A, #24, no_change
mov HOUR, #0 ; Koniec doby
no_change:
ret
END