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