mikrokontrolery.net

 

   

Przykład 5 - wyświetlacz 7-segmentowy
Efektem działania programu jest wyświetlanie kolejno cyfr kodu szesnastkowego na pierwszym wyświetlaczu.

; 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

Instrukcja LPM (Load Program Memory) - ładuj bajt pamięci progrmu do rejestru

Składnia: Operandy: Licznik rozkazów:
(i) LPM brak, r0 domyślnie PC <- PC + 1
(ii) LPM Rd, Z 0 <= d <= 31 PC <- PC + 1
(iii) LPM Rd, Z+ 0 <= d <= 31 PC <- PC + 1

Kod instrukcji:
(i) 1001 0101 1100 1000
(ii) 1001 000d dddd 0100
(iii) 1001 000d dddd 0101

Komentarz :
Aby "wydobyć" bajt z pamięci programu, należy użyć instrukcji, LPM. W naszym przypadku korzystamy z pierwszego wariantu tej instrukcji, ponieważ w mikrokontrolerze AT90S2313 nie zaimplementowano pozostałych dwóch wariantów.

Instrukcja ADIW (Add Immediate to Word) - dodaj bezpośrednio stałą do słowa.

Składnia: Operandy: Licznik rozkazów:
(i)ADIW Rd+1:Rd,K d E {24,26,28,30}, 0 <= K <= 63 PC <- PC + 1

Kod instrukcji:
1001 0110 KKdd KKKK

Komentarz:
Aby pobrać następny bajt z pamięci, konieczne jest zwiększenie adresu zawartego w 16-bitowym rejestrze Z. Jedyną instrukcją realizującą dodanie do słowa 16-bitowego stałej bezpośredniej jest instrukcja ADIW.




 

 

 

 

 

 

 

 

 

 

 
 
 
 

(c) 2004-2008 Radosław Kwiecień
Polityka prywatności