; Sekundnik dla czestotliwosci 2.098 MHz
; Wykorzystane rejestry
; R7 - zlicza wystapienia TF0
; R6 - jednosci
; R5 - dziesiatki
; R4 - zlicza wystapienia TF1
;$MOD52 ; predefiniowane symbole - niepotrzebne na emulatorze
; Zmienna cykl sterujaca iloscia obslugiwanych przerwan od timera przed inkrementacja sekundnika
cykl: equ #15 ; sterowanie licznikiem czekania
; 32 dla 2Mhz, 15 dla 1Mhz (dla emulatora)
cykl2: equ #15 ; sterowanie licznikiem czekania
; 1 dla 2Mhz, 15 dla 1Mhz (dla emulatora)
org 0000h ; Poczatek pamieci
sjmp start ; skok do poczatku programu
; Procedura oblsugi przerwania od T0
org 000bh ; Adres obslugi przerwania od T0
sjmp przerwanie_T0 ; skok do obslugi przerwania
org 001bh ; Adres obslugi przerwania od T1
sjmp przerwanie_T1 ; skok do obslugi przerwania
; Program obslugi przerwania licznika T0
przerwanie_T0:
clr TF0 ; Wyzerowanie falgi przerwania od T0
djnz R7, koniec_przerwania_od_T0 ; Jezeli nie minela 1s wyjdz z obslugi przerwania
mov R7, #cykl ; Nowy cykl odliczania
; Sprawdzamy czy licznik jednosci wynosi 10
inc R6 ; Inkrementacja jednosci
cjne R6, #10, koniec_przerwania_od_T0
mov R6, #0 ; Zerujemy jednosci
; Sprawdzamy czy licznik dziesiatek wynosi 6
inc R5 ; Inkrementacja dziesiatek
cjne R5, #6, koniec_przerwania_od_T0
mov R5, #0 ; Zerujemy dziesiatki
koniec_przerwania_od_T0:
reti ; Powrót z programu obslugi przerwania
; Program obslugi przerwania licznika T1
przerwanie_T1:
clr TF1 ; Wyzerowanie falgi przerwania od T1
dec R4 ; Zmniejsz licznik cyklu
reti
; Opoznienie wyswietlania na wyswietlaczach 7-segmentowych - 1ms
opoznienie:
cjne R4, #0, opoznienie ; Skaczemy poki cykl sie nie wyzeruje
mov R4, #cykl2 ; Licznik cyklu 1ms
mov TH1, #0aah ; Ustawienie starszej czesci licznika T1
mov TL1, #0abh ; Ustawienie mlodszej czesci licznika T1
ret
; Wlasciwy program
start:
; Inicjalizacja pracy z T0 i T1
; Zezwolenia na przerwania
setb EA ; Globalne zezwolenie na przerwania
setb ET0 ; Zezwolenie na przerwania od T0
setb ET1 ; Zezwolenie na przerwania od T1
; Ustawienie T0 i T1
mov TMOD, #00010001b ; T0 i T1 - mod 1 (16bit), bez INT0, inkrementowane w każdym cyklu maszynowym
mov TH0, #0 ; Wyzerowanie starszej czesci licznika T0
mov TL0, #0 ; Wyzerowanie mlodszej czesci licznika T0
mov TH1, #0aah ; Ustawienie starszej czesci licznika T1
mov TL1, #0abh ; Ustawienie mlodszej czesci licznika T1
; Ustawienie rejestrow
mov R7, #cykl ; Licznik pierwszego cyklu 1s
mov R4, #cykl2 ; Licznik pierwszego cyklu 1ms
mov R6, #0 ; Wyzerowanie jednosci
mov R5, #0 ; Wyzerowanie dziesiatek
setb TR0 ; Wlaczenie licznika T0
setb TR1 ; Wlaczenie licznika T1
; Petla nieskonczona
praca:
; Jednosci
mov a, R6 ; Czytamy rejestr jednosci
anl a, #00001111b ; Maskujemy wyswietlana liczbe
mov P2, a ; Wysylamy na port P2
lcall opoznienie
; Dziesiatki
mov a, R5 ; Czytamy rejestr dziesiatek
anl a, #00001111b ; Maskujemy wyswietlana liczbe
orl a, #00010000b ; Zmiana wyswietlacza
mov P2, a ; Wysylamy na port P2
lcall opoznienie
sjmp praca
end