Untitled
Guest 17 20th Nov, 2024
; POD ZADNYM POZOREM NIE WPISYWAC ORG 100 LUB ORG 200
; piny przerwan to 3.2 i 3.3
; reset to org0
org 0 ; Ustawienie początkowego adresu na 0, to jest początek programu (adres po restarcie)
sjmp st ; Skok bezwarunkowy do etykiety 'st', rozpoczęcie głównej części programu
org 0x3 ; Ustawienie adresu obsługi przerwania INT0 (przerwanie zewnętrzne 0)
acall timer ; Wywołanie funkcji 'timer' (obsługuje licznik)
acall timer ; Wywołanie funkcji 'timer' (powtórzenie wywołania)
acall timer ; Wywołanie funkcji 'timer' (powtórzenie wywołania)
acall timer ; Wywołanie funkcji 'timer' (powtórzenie wywołania)
acall timer ; Wywołanie funkcji 'timer' (powtórzenie wywołania)
reti ; Powrót z przerwania INT0 (zakończenie obsługi przerwania)
org 0x13 ; Ustawienie adresu obsługi przerwania INT1 (przerwanie zewnętrzne 1)
reti ; Powrót z przerwania INT1 (zakończenie obsługi przerwania)
st: ; Etykieta st (początek głównej części programu)
clr ea ; Wyczyszczenie flagi przerwań globalnych (ea = 0, przerwania są wyłączone)
setb tcon.2 ; Ustawienie flagi TCON.2 (uruchomienie przerwania od Timera 1)
setb tcon.0 ; Ustawienie flagi TCON.0 (uruchomienie przerwania od Timera 0)
setb et1 ; Włączenie przerwania od Timera 1 (ET1 = 1)
setb et0 ; Włączenie przerwania od Timera 0 (ET0 = 1)
setb ea ; Ustawienie flagi przerwań globalnych (ea = 1, włączenie przerwań)
mov a, #03h ; Załadowanie do rejestru A wartości 03h
mov p1, a ; Przypisanie wartości z rejestru A do portu P1
mov p1, #02h ; Ponowne ustawienie portu P1 na wartość 02h
mov p0, #0C0h ; Ustawienie portu P0 na wartość 0C0h (dla wyświetlacza, np. segmentowego)
init: ; Etykieta 'init' - początek pętli inicjalizacyjnej
mov R3, #00Ah ; Załadowanie wartości 0Ah do rejestru R3 (licznik pętli)
main: ; Etykieta 'main' - początek głównej pętli programu
mov DPTR, #TAB ; Załadowanie wskaźnika danych DPTR adresem tabeli 'TAB'
back: ; Etykieta 'back' - początek pętli odczytu danych z tablicy
clr a ; Wyczyść rejestr A
movc a, @a+DPTR ; Odczyt danych z pamięci (z tabeli 'TAB', wskazywanej przez DPTR)
mov p1, #01h ; Ustawienie portu P1 na wartość 01h
mov p0, a ; Przypisanie wartości z rejestru A do portu P0
acall timer ; Wywołanie funkcji 'timer' (obsługuje licznik)
acall timer ; Wywołanie funkcji 'timer' (powtórzenie wywołania)
inc DPTR ; Zwiększenie wskaźnika DPTR (przejście do kolejnego elementu w tabeli)
djnz R3, back ; Dekrementacja rejestru R3 i skok do etykiety 'back', jeśli R3 != 0 (pętla wykonuje się 10 razy)
sjmp init ; Skok bezwarunkowy do etykiety 'init', po zakończeniu pętli wróci do 'init'
timer: ; Etykieta 'timer' - definicja funkcji timera
mov tmod, #01h ; Ustawienie trybu pracy timera 0 na tryb 1 (16-bitowy timer)
mov th0, #0h ; Załadowanie rejestru TH0 (górny bajt) wartością 0
mov tl0, #0h ; Załadowanie rejestru TL0 (dolny bajt) wartością 0
setb tr0 ; Ustawienie bitu TR0 (uruchomienie Timera 0)
jnb tf0, $ ; Czekanie na ustawienie flagi przerwania tf0 (po zakończeniu odliczania)
clr tf0 ; Czyszczenie flagi tf0 (po zakończeniu odliczania)
ret ; Powrót z funkcji 'timer'
; POD ZADNYM POZOREM NIE WPISYWAC ORG 100 LUB ORG 200
TAB: DB 0C0h, 0F9h, 0A4h, 0B0h, 99h, 92h, 82h, 0F8h, 80h, 90h
; Definicja tabeli 'TAB', która zawiera wartości do wyświetlenia (np. kodów segmentowych dla wyświetlacza)
counter equ 0x40 ; Zdefiniowanie etykiety 'counter' jako adresu 0x40 w pamięci
END ; Koniec programu
To share this paste please copy this url and send to your friends
RAW Paste Data