Näide 3
Tabeli lõpetamine.
Kui z registri sisu pidevalt suurendada, siis võetakse mälust järjest sümboleid ka peale tabeli lõppu.
Selleks, et kuvatud saaksid ainult soovitud sümbolid, peab z registri suurendamise lõpetama tabeli lõpuga. Selleks on mitu võimalust. Üks võimalustest on kasutada tsükli loendurit, kus ühes registris peetakse meeles mitu sümbolit on mälust võetud. See ei ole väga hea meetod, kuna tabeli sisu ja pikkus võivad olla muutuvad ning siis peaks iga kord tsükliloenduri väärtust muutma.
Teiseks võimaluseks on kirjutada tabeli lõppu mõni sümbol mida tabelis kindlasti ei esine ja kontrollida näiteks võrdluskäsuga cpi, kas tabeli lõpp on saabunud.
Näide 3
;eeldame, et pordid on konfigureeritud õigesti ja vajalikud registrid
defineeritud ning viide on eelnevalt ;valmis kirjutatud
;----------Tabel---------------------------------------------------------------------------------
rjmp Algus ;hüpatakse
programmis kohta nimega Algus, tabel jäetakse programmi täitmisel
vahele
Tabel: ;märgend
programmis, mille järgi on võimalik pöörduda siia kohta programmis
ja siin ;paikneb ühtlasi tabeli esimese sümboli aadress
.db 0xC0,0xF9,0xA4,0 ;tabeli
sisu
;-----------sümbolite võtmine
tabelist------------------------------------------------------
Algus: ;märgend
programmis, mille järgi on võimalik pöörduda siia kohta programmis
ldi r31, high(Tabel<<1) ;registrisse
r31 pannakse tabeli alguse aadressi kaheksa vanemat bitti
ldi r30, low(Tabel<<1) ;registrisse
r30 pannakse tabeli alguse aadressi kaheksa nooremat bitti
;nüüd
on registris Z tabeli alguse aadress
Tsykkel: ;märgend
programmis, mille järgi on võimalik pöörduda siia kohta programmis
lpm r16, z+ ;registris
z olevalt aadressilt võetakse andmed ja pannakse registrisse r16
cpi r16,0 ;võrreldakse
registri r16 sisu numbriga 0, kui r16 sisu on võrdne nulliga, siis ;pannakse
staatusregistris nulli lipp üheks, kui r16 pole võrdne nulliga on ;staatusregistris
nulli lipu väärtus null
breq Loop ;kui
eelmise tehte tulemus oli null, siis hüpatakse kohta nimega Loop, kui ;eelmise
tehte tulemus polnud null, siis minnakse järgmist käsku täitma
out portd, r16 ;registri
r16 sisu saadetakse port D väljundisse
rcall EnableNr1 ;kutsutakse
välja alamprogramm nimega EnableNr1, E signaali andmiseks
rcall v1s ;kutsutakse välja alamprogramm
nimega v1s, viide 1 sekund
rjmp Tsykkel ;hüpatakse
programmis kohta nimega Tsykkel
;---------Lõputu tsükkel
-----------------------------------------------------------------------
Loop: ;tegu
on lõputu tsükliga
rjmp Loop ;see
on tehtud selleks, et programmi täitmine jääks siia pidama
;---registritele E signaalide
andmine--------------------------------------------------------------
;seda tegevust on vaja selle
jaoks, et formeerida registritele DD2 ja DD3
info vastuvõtmist lubavasse ;sisendisse
impulss, kui E sisendisse ei tule lubavat impulssi, siis registri
sisendis olevat infot
register ;vastu ei võta, peale lubava impulsi saabumist sisendisse
E salvestab register sisendis oleva info
EnableNr1: ;märgend
programmis, mille järgi on võimalik pöörduda siia kohta programmis
sbi portb, 1 ;pordi B
esimene bitt pannakse üheks
cbi portb, 1 ;pordi B
esimene bitt pannakse nulliks
ret
|