Primer 12:
=======
U ovom primeru koristi se
postavka 1.
Ovaj program pali svih 8 LED sekvencijalno jednu po jednu praveći tzv. trčeći "light show". Upotrebom konstante 'pauza' lako i brzo možemo da menjamo vreme izmedju dve promene, tj. da odredimo brzinu "trčanja" LE dioda.
Code:
pauza con 500 ;definišemo konstantu za pauzu
d1 var portb.0 ;definišemo alias za led D1
d2 var portb.1 ;definišemo alias za led D2
d3 var portb.2 ;definišemo alias za led D3
d4 var portb.3 ;definišemo alias za led D4
d5 var portb.4 ;definišemo alias za led D5
d6 var portb.5 ;definišemo alias za led D6
d7 var portb.6 ;definišemo alias za led D7
d8 var portb.7 ;definišemo alias za led D8
osccon=%01101000 ;interni oscilator na 4MHz
anselb=0 ;ceo port B digitalni
portb=0 ;isključimo sve LED
trisb=0 ;postavi ceo port B kao izlazni
do ;početak petlje
d1=1 ;uključi LED povezanu na pin 0 porta B
pause pauza ;napravi pauzu
d1=0 ;isključi LED povezanu na pin 0 porta B
d2=1 ;uključi LED povezanu na pin 1 porta B
pause pauza ;napravi pauzu
d2=0 ;isključi LED povezanu na pin 1 porta B
d3=1 ;uključi LED povezanu na pin 2 porta B
pause pauza ;napravi pauzu
d3=0 ;isključi LED povezanu na pin 2 porta B
d4=1 ;uključi LED povezanu na pin 3 porta B
pause pauza ;napravi pauzu
d4=0 ;isključi LED povezanu na pin 3 porta B
d5=1 ;uključi LED povezanu na pin 4 porta B
pause pauza ;napravi pauzu
d5=0 ;isključi LED povezanu na pin 4 porta B
d6=1 ;uključi LED povezanu na pin 5 porta B
pause pauza ;napravi pauzu
d6=0 ;isključi LED povezanu na pin 5 porta B
d7=1 ;uključi LED povezanu na pin 6 porta B
pause pauza ;napravi pauzu
d7=0 ;isključi LED povezanu na pin 6 porta B
d8=1 ;uključi LED povezanu na pin 7 porta B
pause pauza ;napravi pauzu
d8=0 ;isključi LED povezanu na pin 7 porta B
loop ;kraj petlje
end
Vidimo da smo prvo isključili sve LED naredbom PORTB=0, a tek zatim postavili ceo B port kao izlazni. Na prvi pogled ovo bi moglo da deluje nelogično, ali obzirom da je po uključenju stanje B porta unapred nepoznato tj. proizvoljno, a sam port postavljen kao ulazni, ako bismo prvo postavili B port kao izlazni desilo bi se da bi neka od LED zasvetlela. Doduše, u našem slučaju to bi trajalo svega nekoliko µs što mi ne bismo primetili i nije toliko ni bitno, ali u slučaju da umesto LE diodama upravljamo nekim uredjajima kod kojih je to kratkotrajno uključenje nepoželjno, došlo bi do problema. Zato je dobra praksa da se pre prebacivanja porta u izlazni režim postavi početno stanje porta.
U tehničkim podacima u tabeli "TABLE 3-8" možete da vidite stanja svih registara nakon reseta; predzadnja kolona pokazuje stanja nakon POR (Power-On Reset, reset nakon uključenja napajanja) i BOR (Brown-Out Reset, reset nakon pada napona ispod dozvoljene granice), a zadnja pokazuje stanja nakon svih ostalih reseta. Na osnovu toga možete da vidite da li po uključenju imate potrebe da postavite odredjeno početno stanje za neki registar.
Vidimo i da smo izbacili GOTO naredbu i ubacili dve nove, DO i LOOP, koje čine celinu, a puna sintaksa glasi:
DO {UNTIL uslov} {WHILE uslov}
naredba...
LOOP {UNTIL uslov} {WHILE uslov}
Ova naredba se koristi za ponavljanje bloka naredbi koje se nalaze izmedju DO i LOOP. Ono što je napisano u vitičastim zagradama je opciono, tj. upotrebljava se po potrebi. Mi smo ovde upotrebili samo osnovnu varijantu bez ikakvih uslova i u tom slučaju se ceo blok naredbi izvršava u tzv. petlji i to beskonačno, sve do isključenja napajanja.
Ako je potrebno da se izvršavanje prekine ako je ispunjen neki uslov, koriste se opcije "UNTIL uslov" i "WHILE uslov" pri čemu se kod UNTIL izvršavanje prekida kada uslov postane tačan, a kod WHILE kada uslov postane netačan.
Ako se ispitivanje koristi u liniji gde se nalazi "DO", ispitivanje se vrši
pre ulaska u petlju i ako uslov za ulazak u petlju nije zadovoljen, program se preusmerava na prvu naredbu posle LOOP.
Ako se ispitivanje koristi u liniji gde se nalazi "LOOP", ispitivanje se vrši
nakon prolaska kroz petlju što znači da će se blok naredbi izvršiti bar jednom, čak i ako uslov nije ispunjen.
Za prevremeni izlaz iz petlje može da se upotrebi naredba
EXIT.
Takodje vidimo i da smo sve naredbe izmedju DO i LOOP pomerili udesno što nije obavezno, ali je dobra programerska praksa kako bi se jasno video blok naredbi tj. jedna petlja. Ta praksa naročito može da bude korisna ako imate ugnježdene petlje, tj. petlju unutar petlje pa lako možete da vidite da li ste sve petlje "zatvorili" jer ako niste, kompajler će da javi grešku, a ako ste sve pisali ravno, imaćete problem da brzo utvrdite gde ste pogrešili.
Primeri upotrebe:
Code:
i = 1
DO
SEROUT 0,N2400,["No:",#i,13,10]
i = i + 1
LOOP UNTIL i > 10
i = 1
DO WHILE i <= 10
SEROUT 0,N2400,["No:",#i,13,10]
i = i + 1
LOOP
i = 1
DO
SEROUT 0,N2400,["No:",#i,13,10]
i = i + 1
IF PORTB.0 = 0 THEN EXIT
LOOP WHILE i <= 10
U ranijim verzijama PBP-a koristile su se dve naredbe za formiranje ovakvih petlji,
REPEAT ... UNTIL i
WHILE ... WEND koje su podržane i u ovoj verziji radi kompatibilnosti, ali je preporuka da se upotrebljava isključivo
DO ... LOOP.
---------------------------------------------------------------------------
Sva pitanja vezana za tutorijal možete da postavite u
ovoj temi:
[Ovu poruku je menjao rsinisa dana 14.03.2013. u 14:49 GMT+1]