|
; Kurs asemblera mikrokontrolerów
AVR
;
; Przykład 5 - Wyświetlacz 7-segmentowy
.include "2313def.inc"
.cseg
.org 0x00
ldi r16, 0b11111111 ; załaduj
do r16 liczbę 255 (0xff)
out DDRB, r16 ; wpisanie do DDRB samych jedynek
; powoduje ustawienie pinów jako wyjście
out PORTB, r16
ldi r16, 0b1111100 ;
out DDRD, r16 ; piny D0 i D1 są ustawione jako wejścia
; pozostałe jako wyjścia
ldi r16, 0b1110111
out PORTD, r16
ldi r16, 127 ;
out SPL, r16 ; ustawienie wskaˇnika stosu na 127
start:
ldi ZH, high(znaki << 1) ; załadowanie do rejestru Z adresu
ldi ZL, low(znaki << 1) ; tablicy z kodami znaków
petla:
lpm ; załaduj do r0 bajt z pamięci programu
mov r16, r0 ; przenieś zawartość r0 do r16
cpi r16, 0 ; sprawdˇ, czy równe zero
breq start ; jeśli tak, skocz na początek programu
adiw ZH:ZL, 1 ; zwiększ zawartość rejestru Z o 1
out PORTB, r0 ; załadowany bajt z pamięci wyświetl na wyświetlaczu
ldi r16, 250 ; załaduj wartość opóˇnienia
rcall waitms ; wywołanie procedury waitms
rjmp petla ; pętla nieskończona
; Przybliżone czasy opóˇnień są podane dla
; rezonatora 4MHz
waitms:
mov r22, r16 ; ustaw czas opóˇnienia
; powtórz n razy pętlę L,
; co da opóˇnienie ok. n * 1 ms
L:
; powtórz 10 razy pętlę L0,
; co da opóˇnienie ok 1ms
ldi r21, 10
L0:
; powtórz 100 razy pętlę L1,
; co da opóˇnienie ok. 100 us
ldi r20, 100
L1:
nop ; 1 cykl
dec r20 ; 1 cykl
brne l1 ; 2 cykle
; koniec pętli L1
dec r21
brne l0
; koniec pętli L0
dec r22
brne L
; koniec pętli L
ret
; Tablica z kodami znaków
znaki: .db 192,249,164,176,153,146,130,248,128,144,136,131,198,161,134,142,0
|