skraceni kurs ucenja picbasica
Moderators: pedja089, stojke369, [eDo], trax
evo dok ne apsolviramo ledice na portovima i if else, mogli bi se polako pripremati za ovo
http://www.elektronika.ba/forum/uploadz ... disp_l.gif
znaci ko nema displej neka ga pribavi. moze i sa zajednickom katodom i anodom. nije bitno koji je bitno da ga imate
a evo da ne bude da se samo kontrolisu ledice sa picem evo par primera izlaza i ulaza
http://www.elektronika.ba/forum/uploadz ... 531_12.gif
http://www.elektronika.ba/forum/uploadz ... 645_14.gif
http://www.elektronika.ba/forum/uploadz ... 671_16.gif
http://www.elektronika.ba/forum/uploadz ... disp_l.gif
znaci ko nema displej neka ga pribavi. moze i sa zajednickom katodom i anodom. nije bitno koji je bitno da ga imate
a evo da ne bude da se samo kontrolisu ledice sa picem evo par primera izlaza i ulaza
http://www.elektronika.ba/forum/uploadz ... 531_12.gif
http://www.elektronika.ba/forum/uploadz ... 645_14.gif
http://www.elektronika.ba/forum/uploadz ... 671_16.gif
Last edited by pedja089 on 06-09-2008, 18:55, edited 2 times in total.
e sada bi mogli uvesti promenljive i uciniti stvari mal okomplikovanijim i zanimljivijim...
promenljive su mesto gde se podaci privremeno cuvaju. podacima u njuma se moze pristupiti bilo kada u toku izvrsavanja programa. i one su uobicajno rezultat necega, neke funkcije, ili cak stanja na portu ili samo na pojedinom bitu ili pinu...
kada kazem privremeno mislim na to da se one gube po nestanku napajanja.
stoga ako neke promenljive treba da imaju neku pocetnu vrednost onda se na pocetku programa uvek posle definisanja promenljivih dodeljuje i njihova vrednost.
preporucljivo je staviti i da je promenljiva jednaka nuli ako ona ne treba da sadrzi nista, jer nekada se desi da pic zapamti nesto na toj lokaciji.
sintaksa za definisanje promenljivih"
ime promenljive VAR velicina
ime promenljive je obavezno jedna rec. i nije dozvoljeno koristiti znakove kao sto su tacka ili zarez. uostalom ako napisete pogresno ime kompajler ce javiti gresku i zacrvenece se red u kojem je greska...
postoje 3 velicine promenljivih a to su BIT, BYTE i WORD
promenljiva BIT je velicine bita sto znaci da se u njoj moze zapamtiti samo 0 ili 1.
promenljiva BYTE je velicine 8biti. tju nju se moze sacuvati broj od 0 do 255
promenljiva WORD je velivine 2 bajta tj 16bita.
i u nju se moze sacuvati broj od 0 do 65535
evo par primara:
Pin VAR BIT ' ovim smo definisali promenljivu pin i ona moze biti samo 1 ili 0
Broj VAR BYTE ' ovim smo definisali promenljivu broj i u nju mozemo smestiti broj do 255
VelikiBroaj VAR WORD ' promenljiva je veliki broj i u nju se moze smestiti broj do 65535
sada da se to primeni na prakticnom primetu.
Zadatak:
treba napraviti program koji ce po pritisku tastera upaliti led zadrzati je upaljenju pola sekunde, zatim je ugasiti i ako je taster i dalje stisnut ledica ne treba ponovo da se pali. znaci ledica treba da se upali tek kada se taster pusti pa ponovo stisne.
a to cemo uraditi na sledeci nacin.
ako ima nekih nejasnoca pitaj te
promenljive su mesto gde se podaci privremeno cuvaju. podacima u njuma se moze pristupiti bilo kada u toku izvrsavanja programa. i one su uobicajno rezultat necega, neke funkcije, ili cak stanja na portu ili samo na pojedinom bitu ili pinu...
kada kazem privremeno mislim na to da se one gube po nestanku napajanja.
stoga ako neke promenljive treba da imaju neku pocetnu vrednost onda se na pocetku programa uvek posle definisanja promenljivih dodeljuje i njihova vrednost.
preporucljivo je staviti i da je promenljiva jednaka nuli ako ona ne treba da sadrzi nista, jer nekada se desi da pic zapamti nesto na toj lokaciji.
sintaksa za definisanje promenljivih"
ime promenljive VAR velicina
ime promenljive je obavezno jedna rec. i nije dozvoljeno koristiti znakove kao sto su tacka ili zarez. uostalom ako napisete pogresno ime kompajler ce javiti gresku i zacrvenece se red u kojem je greska...
postoje 3 velicine promenljivih a to su BIT, BYTE i WORD
promenljiva BIT je velicine bita sto znaci da se u njoj moze zapamtiti samo 0 ili 1.
promenljiva BYTE je velicine 8biti. tju nju se moze sacuvati broj od 0 do 255
promenljiva WORD je velivine 2 bajta tj 16bita.
i u nju se moze sacuvati broj od 0 do 65535
evo par primara:
Pin VAR BIT ' ovim smo definisali promenljivu pin i ona moze biti samo 1 ili 0
Broj VAR BYTE ' ovim smo definisali promenljivu broj i u nju mozemo smestiti broj do 255
VelikiBroaj VAR WORD ' promenljiva je veliki broj i u nju se moze smestiti broj do 65535
sada da se to primeni na prakticnom primetu.
Zadatak:
treba napraviti program koji ce po pritisku tastera upaliti led zadrzati je upaljenju pola sekunde, zatim je ugasiti i ako je taster i dalje stisnut ledica ne treba ponovo da se pali. znaci ledica treba da se upali tek kada se taster pusti pa ponovo stisne.
a to cemo uraditi na sledeci nacin.
Code: Select all
SYMBOL LED=PORTB.7
SYMBOL TASTER=PORTB.0
OUTPUT LED
INPUT TASTER
NovoStanje var bit
StaroStanje var bit
starostanje = taster ' ovde se uzima pocetno stanje, tj stanje kada je taster pusten
Pocetak:
novostanje = taster 'OVDE SE UZIMA TRENUTNO STANJE NA TASTERU
if novostanje<starostanje then ' OVDE SE UPOREDJUJU STANJA. AKO JE TASTER STISNUT TADA JE NOVO STANJE JEDNAKO 0 I SAMIM TIM JE MANJE OD STAROG STANJA
HIGH led 'PALI LED
PAUSE 500 'PAUZA POLA SEKUNDE
LOW LED 'GASI LED
ENDIF
STAROSTANJE=NOVOSTANJE 'OVAJ RED JE POTREBAN IZ RAZLOGA DA PRI PONOVNOM NAILASKU NA IF PROMENLJIVA NNOVO STANJE NE BI BILA MANJA OD STAROG STANJA. U OVOM SLUCAJU SE IZJEDNACAVAJU. I TAK KADA SE PROMENI STANJE SA 1 NA 0 ONDA CE SE LEDICA UPALITI
GOTO POCETAK
END
evo sada je na red dosao i sedmo segmentni displej.
http://www.elektronika.ba/forum/uploadz ... disp_l.gif
u principu on se sastoji od 8dioda. sedam dioda su segmenti i osma dioda je tacka.
znaci ako hocemo da napravio da se na displeju menjaju redom brojevi samo je potrebno da palimo odredjene diode. isti je slucaj kod displeja sa zajednickom anodom i katodom.
naravno samo je potrebnno izmeniti ono sto se salje na port.
za pocrtak napisacemo program da ispise broj 1 na displeju.
posto je ovo displej sa zajednickom anodom segmenti se pale kada se na njih dovede 0.
da bi se pokazao broj 1 na displeju potrebno je ukljuciti segmente b i c.
a tocemo uraditi tako sto cemo poslati broj %1111 1001
evo ptimera.
trisb=0 'port je izlazni
portb=%1111 1001 'ukljucili smo jedan
ili mozemo napisati i portb=249' to je isti broj kao gore samo u decimalnom obliku
ili mozemo napisati broj u heksadecimalnom obliku portb=$F9
kada se pise broj u heksadecimalnom obliku onda se ispred broja stavlja znak $
Broj Segment Hex Dec
0 %1100 0000 $C0 192
1 %1111 1001 $F9 249
2 %1010 0100 $A4 164
3 %1011 0000 $B0 176
4 %1001 1001 $99 153
5 %1001 0010 $92 146
6 %1000 0010 $82 130
7 %1111 1000 $F8 248
8 %1000 0000 $80 128
9 %1001 1000 $98 152
evo ga. a na vama je sada da napisete da broji sekunde od 0 do 9, i na kraju displej treba da se ugasi. znaci da ne svetli ni jedan segment na njemu
http://www.elektronika.ba/forum/uploadz ... disp_l.gif
u principu on se sastoji od 8dioda. sedam dioda su segmenti i osma dioda je tacka.
znaci ako hocemo da napravio da se na displeju menjaju redom brojevi samo je potrebno da palimo odredjene diode. isti je slucaj kod displeja sa zajednickom anodom i katodom.
naravno samo je potrebnno izmeniti ono sto se salje na port.
za pocrtak napisacemo program da ispise broj 1 na displeju.
posto je ovo displej sa zajednickom anodom segmenti se pale kada se na njih dovede 0.
da bi se pokazao broj 1 na displeju potrebno je ukljuciti segmente b i c.
a tocemo uraditi tako sto cemo poslati broj %1111 1001
evo ptimera.
trisb=0 'port je izlazni
portb=%1111 1001 'ukljucili smo jedan
ili mozemo napisati i portb=249' to je isti broj kao gore samo u decimalnom obliku
ili mozemo napisati broj u heksadecimalnom obliku portb=$F9
kada se pise broj u heksadecimalnom obliku onda se ispred broja stavlja znak $
Broj Segment Hex Dec
0 %1100 0000 $C0 192
1 %1111 1001 $F9 249
2 %1010 0100 $A4 164
3 %1011 0000 $B0 176
4 %1001 1001 $99 153
5 %1001 0010 $92 146
6 %1000 0010 $82 130
7 %1111 1000 $F8 248
8 %1000 0000 $80 128
9 %1001 1000 $98 152
evo ga. a na vama je sada da napisete da broji sekunde od 0 do 9, i na kraju displej treba da se ugasi. znaci da ne svetli ni jedan segment na njemu
Last edited by pedja089 on 08-09-2008, 22:54, edited 1 time in total.
e sada da nastavimo...
evo i jedne ciklusne naredbe
FOR Index=Start TO End {STEP {-} Inc}
{naredbe}
NEXT {Index}
indeks je promenljiva tipa byte ili word
Start - je početna vrednost promenljive Index.
End - je krajnja vrednost promenljive Index sa čijim se dostizanjem završava FOR ciklus.
Inc - je vrednost sa kojom se u svakom prolazu povecava ili smanjuje promenljiva Index. Ako nije navedenao {STEP {-} Inc} podrazumeva se da je 1.
npr jedan primer
ovaj programcic ce 10 puta promeniti stanje na ledici.
ovo je zgodno kada nesto treba da se ponovi odredjeni broj puta...
e sada da pogledamo jednu naredbu koja je jako korisna kod 7 segmetnog displeja.
npr kada bi hteli da napravimo program koji bi broio od 0 do 9 koristeci for.
to bi izgledalo
FOR i=0 TO 9
if i=0 then portb= 192
.
.
.
.
if i=9 then portb= 152
NEXT i
mao naporno zar ne...
ajde sad da pogledamo drugi nacin
koristeci select case
prvo nesto da kazemo o toj naredbi
SELECT CASE promenljiva
CASE izraz1,izraz..
naredba
CASE izraz2 ,izraz
naredba
{CASE ELSE naredba}
END SELECT
promenljiva moze biti bilo kog tipa, mada ako je promenljiva bit onda ova naredba bas i nema smisla.
izraz je ono sa cime se uporedjuje promenljiva, i ako je tacna onda se izvrsava naredba ispod.
CASE ELSE naredba - ovaj red je opcioni.
znaci moze da se stavi a i nemora.
a naredba koja stoji iza case else ce se izvrsiti ukoliko promenljiva nije bila jednaka sa bilo kojim izrazom navedenom posle case.
evo jedan primer iz help fajla.
SELECT CASE x
CASE 1
y = 10
CASE 2, 3
y = 20
CASE IS > 5
y = 100
CASE ELSE
y = 0
END SELECT
mislim da ga nema potrebe nesto posebno objasnjavati.
i ovo smo mogli iskoristiti za ispis brojeva na displeju ali nista puno nam ne skracuje posao u odnosu na naredbu if...
sto se mene tice case slobodno zaboravite. najcesce se koristi if i sledeca naredba.
a to je LOOKUP
sintaksa:
LOOKUP Indeks,[Konstanta,Konstanta...],Promenljiva
indeks predstavlja broj od nule, pa se moze menjati do onog broja koliko imamo konstanti u zagradi
promenljiva je mesto gde se smesta konstanta.
Ova naredbe koristi se za čitanje vrednosti iz tabele konstani na osnovu zadatog Indeksa. Kada je 0 to je indeks prvog člana tabele. Vrednost člana sa datim Indeksom se smešta u promenljivu. kada je indeks 1 onda se uzima vrednost druge konstante i smesta se u promenljivu.
U slučaju ako je vrednost Indeksa veća ili jednaka broju članova tabele promenljiva Var zadržava prethodnu vrednost.
ista je stvar i sa lookup2 samo sto kod te naredbe konstante mogu biti velicine word
evo primera:
Lookup i, [192,249, 164,176,153, 146, 130, 248, 128, 152], portb
u ovom slucaju ce poslati odgovarajuci broj na portb.
ako obratite paznu videcete da su to brojevi iz tabele za 7 seg. displej.
pa program za brojenje bi izgledao ovako
ovo je mnogo jednostavnije od bilo cega navedenog, zar ne?
sto se tice 7 seg displeja ostale su jos 2 stvari da objasnim. a to je multipleksiranje displeja, i koriscenje dekodera.
sto se tice multipleksiranja mozda bi bilo najbolje da svi instalirate proteus da nemorate plocice praviti. samo jedna napomena kod proteusa ne rade sve naredbe. npr kada se napise output portb, proteus nece prepozndati da je portb izlazni. nego se mora koristi trisb registar. to sam tek sada primetio.
posle toga dolazi lcd displej, za koji se isto moze koristiti proteus. ali ja bi vam preporucio da nabavite displej da bi mogli videti prenos podataka sa racunara na pic. i time bi se polako priveli kraju...
pa ako imate pitanja u vezi ovoga pitajte
a evo malo domaceg
voleo bi sad da neko napravi program koji ce brojati pritiske tastera, i kada izbroji do 9, pa se ponovo taster stisne treba da se vrati na 0 i da sve ide ispocetka
ne bi trebalo da vam predstavlja problem
EDIT:
Evo jos jednog nacina za koriscenje sedmosegmentnog displeja
Ovo mi do sad nije palo na pamet. Video sam od @TomicIgor. Hvala puno.
evo i jedne ciklusne naredbe
FOR Index=Start TO End {STEP {-} Inc}
{naredbe}
NEXT {Index}
indeks je promenljiva tipa byte ili word
Start - je početna vrednost promenljive Index.
End - je krajnja vrednost promenljive Index sa čijim se dostizanjem završava FOR ciklus.
Inc - je vrednost sa kojom se u svakom prolazu povecava ili smanjuje promenljiva Index. Ako nije navedenao {STEP {-} Inc} podrazumeva se da je 1.
npr jedan primer
Code: Select all
i VAR BYTE
SIMBOL LED=PORTB.1
OUTPUT LED
FOR i=1 TO 10 'broj prolaza 10
TOGGLE LED
NEXT i
ovo je zgodno kada nesto treba da se ponovi odredjeni broj puta...
e sada da pogledamo jednu naredbu koja je jako korisna kod 7 segmetnog displeja.
npr kada bi hteli da napravimo program koji bi broio od 0 do 9 koristeci for.
to bi izgledalo
FOR i=0 TO 9
if i=0 then portb= 192
.
.
.
.
if i=9 then portb= 152
NEXT i
mao naporno zar ne...
ajde sad da pogledamo drugi nacin
koristeci select case
prvo nesto da kazemo o toj naredbi
SELECT CASE promenljiva
CASE izraz1,izraz..
naredba
CASE izraz2 ,izraz
naredba
{CASE ELSE naredba}
END SELECT
promenljiva moze biti bilo kog tipa, mada ako je promenljiva bit onda ova naredba bas i nema smisla.
izraz je ono sa cime se uporedjuje promenljiva, i ako je tacna onda se izvrsava naredba ispod.
CASE ELSE naredba - ovaj red je opcioni.
znaci moze da se stavi a i nemora.
a naredba koja stoji iza case else ce se izvrsiti ukoliko promenljiva nije bila jednaka sa bilo kojim izrazom navedenom posle case.
evo jedan primer iz help fajla.
SELECT CASE x
CASE 1
y = 10
CASE 2, 3
y = 20
CASE IS > 5
y = 100
CASE ELSE
y = 0
END SELECT
mislim da ga nema potrebe nesto posebno objasnjavati.
i ovo smo mogli iskoristiti za ispis brojeva na displeju ali nista puno nam ne skracuje posao u odnosu na naredbu if...
sto se mene tice case slobodno zaboravite. najcesce se koristi if i sledeca naredba.
a to je LOOKUP
sintaksa:
LOOKUP Indeks,[Konstanta,Konstanta...],Promenljiva
indeks predstavlja broj od nule, pa se moze menjati do onog broja koliko imamo konstanti u zagradi
promenljiva je mesto gde se smesta konstanta.
Ova naredbe koristi se za čitanje vrednosti iz tabele konstani na osnovu zadatog Indeksa. Kada je 0 to je indeks prvog člana tabele. Vrednost člana sa datim Indeksom se smešta u promenljivu. kada je indeks 1 onda se uzima vrednost druge konstante i smesta se u promenljivu.
U slučaju ako je vrednost Indeksa veća ili jednaka broju članova tabele promenljiva Var zadržava prethodnu vrednost.
ista je stvar i sa lookup2 samo sto kod te naredbe konstante mogu biti velicine word
evo primera:
Lookup i, [192,249, 164,176,153, 146, 130, 248, 128, 152], portb
u ovom slucaju ce poslati odgovarajuci broj na portb.
ako obratite paznu videcete da su to brojevi iz tabele za 7 seg. displej.
pa program za brojenje bi izgledao ovako
Code: Select all
i VAR BYTE
OUTPUT PORTB
FOR i=0 TO 9
Lookup i, [192,249, 164,176,153, 146, 130, 248, 128, 152], portb
PAUSE 500
NEXT i
sto se tice 7 seg displeja ostale su jos 2 stvari da objasnim. a to je multipleksiranje displeja, i koriscenje dekodera.
sto se tice multipleksiranja mozda bi bilo najbolje da svi instalirate proteus da nemorate plocice praviti. samo jedna napomena kod proteusa ne rade sve naredbe. npr kada se napise output portb, proteus nece prepozndati da je portb izlazni. nego se mora koristi trisb registar. to sam tek sada primetio.
posle toga dolazi lcd displej, za koji se isto moze koristiti proteus. ali ja bi vam preporucio da nabavite displej da bi mogli videti prenos podataka sa racunara na pic. i time bi se polako priveli kraju...
pa ako imate pitanja u vezi ovoga pitajte
a evo malo domaceg
voleo bi sad da neko napravi program koji ce brojati pritiske tastera, i kada izbroji do 9, pa se ponovo taster stisne treba da se vrati na 0 i da sve ide ispocetka
ne bi trebalo da vam predstavlja problem
EDIT:
Evo jos jednog nacina za koriscenje sedmosegmentnog displeja
Code: Select all
Cifra var byte[10]
i var byte
Cifra[0] = %11000000
Cifra[1] = %1111 1001
Cifra[2] = %1010 0100
Cifra[3] = %1011 0000
Cifra[4] = %1001 1001
Cifra[5] = %1001 0010
Cifra[6] = %1000 0010
Cifra[7] = %1111 1000
Cifra[8] = %1000 0000
Cifra[9] = %1001 1000
i=0' U i stavimo cifru koju hocemo na displeju.
portb=cifra[i]
sema:
ovo je sedmo segmentni displej sa dekoderom. kao sto se vidi na semi prednost ovako nacina vezivanja displeja je u tome sto je za 1 displej potrebno manje pinova. tj potrebna su 4 pina...
koriscenje je manje vise jako prosto. dovoljno je poslati broj od 0-16 i na displeju ce se pojaviti broj od 0-9, a za vece brojeve uglavnom se pojavljuju brljotine na displeju.
a neki dekoderi podrzavaju i heksa decimalne brojeve pa za brojeve vece od 10 prikazace se odgovarajuca slova od A-F.
sledeci nacin je da se koriste 2 dekodera
sema:
sada je situacija nesto slozenija. ker imamo 2 broja od 0-16 koja treba sloziti u jedan bajt.
za prikazivanje na displeju ciji je dekoder prikopcan na rb0-rb3, je ista prica kao od malopre. znaci treba poslati broj od 0 do 16.
a da bi smo nesto prikazali na displeju ciji je dekoder prikopcan na rb4-rb7 moramo nekako pomeriti broj za 4 bina na gore.
ovako bi trebao da izgleda broj poslat na portb u binarnom obliku
GGGG DDDD
D-biti donjeg displeja
G-biti gornjega displeja.
a mi imamo 2 broja u sledecem obliku
0000 DDDD
0000 GGGG
---------------
da bismo dobili oblik kao gore najjednostavnije je pomeriti bite GGGG u levo da se dobije
GGGG 0000
kada imamo broj u tom obliku onda ga je dovoljno sabrati sa drugim brojem
0000 DDDD
+GGGG 0000
-----------------
GGGG DDDD
i dobili smo oblik koji smo zeleli.
pomeranje bita GGGG mozemo izvesti na 2 nacina.
jedan je koriscenjem matematickog operatora za siftovanje bita.
mat operator se koristi na sledeci nacin
promenljiva << broj za koliko se bita pomera sadrzaj u levo.
isti je slucaj i kod siftovanja u desno.
evo konkretan primer:
drugi nacin pomeranja u levu stranu je mnozenje sa brojem 16(ako je potrebno 4 mesta)
sada dolaze na red displeji u multipleksu.
sema:
ovde su svi displeji paralelno spojeni. ali postoje tranzistori pomocu kojih ukljucujemo samo odredjeni displej.
ovde se sve svodi na to da se pali prvi drugi pa treci displej...
znaci ako hocemo da upalimo skroz levi displej koji nam pokazuje stotine onda cemo postaviti rb7 na 1.
evo konkretno kako se upravlja displejima.
prvo je potrebno na portb poslati broj koji zelimo da se vidi na odredjenom displeju, zatim, je potrebno ukljuciti taj displej(postaviti odgovarajuci pin na 1) drzatiga ukljucenog neko vreme, zatim ga iskljuciti , pa isto to ponoviti za sledeci displej. i ako ovo dovoljno brzo ponavljamo dobicemo utisak da displeji stalno svetle.
evo jedan kratak program koji bi trebao ispisati trocifreni broj:
isto je ovo moguce i bez dekodera. stim sto se onda brojevi na portb salju kao kada je prikljucen samo 1 displej(najlakse koriscenjem lookup naredbe).
ovo je bilo lako jer imamo rastavljene cifre.
ali npr ako imamo neki rezultat u bajtu, tada ga je potrebno rastaviti na stotine desetice i jedinice...
za to cemo koristiti naredbu DIG. ova naredba izdvaja odredjenu cifru iz nekog broja.
evo primer
BROJ1= 123 DIG 1 ' ovo ce u promenljivu broj1 staviti vrednost cifre koja se nalazi na drugom mestu kada brojima sa desna na levo.
broj posle DIG govori koja se cifra izdvaja iz broja koji je ispred naveden. ako stoji dig 0 onda se izdvaja krajnja desna cifra, tj jedinice, ako stoji dig 4 onda se izdvaja krajnja leva cifra...
evo primera:
e sada ovo bi mogli iskoristiti za izradu nekog konkretnog uredjaja...
npr obrtomera(broj obrtaja u sekundi) ili mozemo ga iskoristiti kao frekfenciometar.
sada nam preostaje jedna nqaredba sa kojom bi prebrojali impulse.
a to je naredba COUNT
sintaksa:
COUNT Pin, Period, BrojImpulsa
Pin je pin na kontroleru na kojem se broje impulsi
Period je vreme za koje se broje impulsi
BrojImpulsa je promenljiva u koju se smesta broj izbrojanih impulsa.
evo primera:
sema:
http://www.elektronika.ba/forum/uploadz ... rtomer.GIF
ako je sve jasno moglo bi se reci da smo zavrsili sa sedmosegmentnim displejima....
sada bi mogli malo preci na lcd displej.
za pocetak mozete koristiti i proteus.
ovo je sedmo segmentni displej sa dekoderom. kao sto se vidi na semi prednost ovako nacina vezivanja displeja je u tome sto je za 1 displej potrebno manje pinova. tj potrebna su 4 pina...
koriscenje je manje vise jako prosto. dovoljno je poslati broj od 0-16 i na displeju ce se pojaviti broj od 0-9, a za vece brojeve uglavnom se pojavljuju brljotine na displeju.
a neki dekoderi podrzavaju i heksa decimalne brojeve pa za brojeve vece od 10 prikazace se odgovarajuca slova od A-F.
sledeci nacin je da se koriste 2 dekodera
sema:
sada je situacija nesto slozenija. ker imamo 2 broja od 0-16 koja treba sloziti u jedan bajt.
za prikazivanje na displeju ciji je dekoder prikopcan na rb0-rb3, je ista prica kao od malopre. znaci treba poslati broj od 0 do 16.
a da bi smo nesto prikazali na displeju ciji je dekoder prikopcan na rb4-rb7 moramo nekako pomeriti broj za 4 bina na gore.
ovako bi trebao da izgleda broj poslat na portb u binarnom obliku
GGGG DDDD
D-biti donjeg displeja
G-biti gornjega displeja.
a mi imamo 2 broja u sledecem obliku
0000 DDDD
0000 GGGG
---------------
da bismo dobili oblik kao gore najjednostavnije je pomeriti bite GGGG u levo da se dobije
GGGG 0000
kada imamo broj u tom obliku onda ga je dovoljno sabrati sa drugim brojem
0000 DDDD
+GGGG 0000
-----------------
GGGG DDDD
i dobili smo oblik koji smo zeleli.
pomeranje bita GGGG mozemo izvesti na 2 nacina.
jedan je koriscenjem matematickog operatora za siftovanje bita.
mat operator se koristi na sledeci nacin
promenljiva << broj za koliko se bita pomera sadrzaj u levo.
isti je slucaj i kod siftovanja u desno.
evo konkretan primer:
Code: Select all
TRISB=0
BROJ1 VAR BYTE
BROJ2 VAR BYTE
BROJ1=5 ' donji displej treba da prikaze 5
BROJ2=2 ' gornji displej treba da prikaze 2
BROJ2=BROJ2<<4 ' ovde pomeramo donja 4 bita, u levo da donju na mesto gornja 4 bita, sada samo treba sabrati brojeve i upisati ih u portb
PORTB=BROJ1+BROJ2
Code: Select all
TRISB=0
BROJ1 VAR BYTE
BROJ2 VAR BYTE
BROJ1=5 ' donji displej treba da prikaze 5
BROJ2=2 ' gornji displej treba da prikaze 2
BROJ2=BROJ2*16 ' ovde pomeramo donja 4 bita, u levo da donju na mesto gornja 4 bita, sada samo treba sabrati brojeve i upisati ih u portb
PORTB=BROJ1+BROJ2
sema:
ovde su svi displeji paralelno spojeni. ali postoje tranzistori pomocu kojih ukljucujemo samo odredjeni displej.
ovde se sve svodi na to da se pali prvi drugi pa treci displej...
znaci ako hocemo da upalimo skroz levi displej koji nam pokazuje stotine onda cemo postaviti rb7 na 1.
evo konkretno kako se upravlja displejima.
prvo je potrebno na portb poslati broj koji zelimo da se vidi na odredjenom displeju, zatim, je potrebno ukljuciti taj displej(postaviti odgovarajuci pin na 1) drzatiga ukljucenog neko vreme, zatim ga iskljuciti , pa isto to ponoviti za sledeci displej. i ako ovo dovoljno brzo ponavljamo dobicemo utisak da displeji stalno svetle.
evo jedan kratak program koji bi trebao ispisati trocifreni broj:
Code: Select all
TRISB=0
BROJ1 VAR BYTE
BROJ2 VAR BYTE
BROJ3 VAR BYTE
BROJ1=5
BROJ2=2
BROJ2=6
POCETAK:
PORTB=BROJ1 'postavljanje prve vrednosti na port b
HIGH PORTB.7 'ukljucivanje displeja
PAUSE 5 ' zadrzavanje prikaza
LOW PORTB.7 'iskljucivanje displeja
PORTB=BROJ2 'postavljanje druge vrednosti....
HIGH PORTB.6
PAUSE 5
LOW PORTB.6
PORTB=BROJ3
HIGH PORTB.5
PAUSE 5
LOW PORTB.5
GOTO POCETAK
ovo je bilo lako jer imamo rastavljene cifre.
ali npr ako imamo neki rezultat u bajtu, tada ga je potrebno rastaviti na stotine desetice i jedinice...
za to cemo koristiti naredbu DIG. ova naredba izdvaja odredjenu cifru iz nekog broja.
evo primer
BROJ1= 123 DIG 1 ' ovo ce u promenljivu broj1 staviti vrednost cifre koja se nalazi na drugom mestu kada brojima sa desna na levo.
broj posle DIG govori koja se cifra izdvaja iz broja koji je ispred naveden. ako stoji dig 0 onda se izdvaja krajnja desna cifra, tj jedinice, ako stoji dig 4 onda se izdvaja krajnja leva cifra...
evo primera:
Code: Select all
TRISB=0
BROJ VAR BYTE
BROJ1 VAR BYTE
BROJ2 VAR BYTE
BROJ3 VAR BYTE
BROJ=123
POCETAK:
BROJ1 = BROJ DIG 2' izdvajamo stotine
BROJ2 = BROJ DIG 1'desetice
BROJ3 = BROJ DIG 0'jedinice
PORTB=BROJ1
HIGH PORTB.7
PAUSE 5
LOW PORTB.7
PORTB=BROJ2
HIGH PORTB.6
PAUSE 5
LOW PORTB.6
PORTB=BROJ3
HIGH PORTB.5
PAUSE 5
LOW PORTB.5
GOTO POCETAK
npr obrtomera(broj obrtaja u sekundi) ili mozemo ga iskoristiti kao frekfenciometar.
sada nam preostaje jedna nqaredba sa kojom bi prebrojali impulse.
a to je naredba COUNT
sintaksa:
COUNT Pin, Period, BrojImpulsa
Pin je pin na kontroleru na kojem se broje impulsi
Period je vreme za koje se broje impulsi
BrojImpulsa je promenljiva u koju se smesta broj izbrojanih impulsa.
evo primera:
Code: Select all
TRISB=0
TRISA=255
BROJ VAR WORD
BROJ1 VAR BYTE
BROJ2 VAR BYTE
BROJ3 VAR BYTE
BROJ4 VAR BYTE
I VAR BYTE
POCETAK:
COUNT PORTA.0,1000,BROJ ' broji impulse na pinu RA0, u periodu od 1S i rezultat smesta u "BROJ"
BROJ1 = BROJ DIG 3 'izdvajamo hiljde
BROJ2 = BROJ DIG 2' izdvajamo stotine
BROJ3 = BROJ DIG 1'desetice
BROJ4 = BROJ DIG 0'jedinice
FOR I = 1 TO 100 ' u ovom slucaju stavili smo da se ispis na displeju ponovi 100 puta, sto znaci da ce vreme prikazivanja broja na displeju biti oko 2 sekunde
PORTB=BROJ1
HIGH PORTB.7
PAUSE 5
LOW PORTB.7
PORTB=BROJ2
HIGH PORTB.6
PAUSE 5
LOW PORTB.6
PORTB=BROJ3
HIGH PORTB.5
PAUSE 5
LOW PORTB.5
PORTB=BROJ4
HIGH PORTB.4
PAUSE 5
LOW PORTB.4
NEXT I
GOTO POCETAK
http://www.elektronika.ba/forum/uploadz ... rtomer.GIF
ako je sve jasno moglo bi se reci da smo zavrsili sa sedmosegmentnim displejima....
sada bi mogli malo preci na lcd displej.
za pocetak mozete koristiti i proteus.
- Dariolo
- Odlično uznapredovao
- Posts: 822
- Joined: 24-08-2006, 23:29
- Location: Žepče (BiH), Zagreb (HR)
Pošto je pedja trenutno loš sa pristupom interneta, pokušat ću ja nešto da napišem za LCD!
Mada sam i ja još u dubokoj fazi učenja pokušat ću napisati da svi početnici (kao i ja) shvate i razumiju!
http://img.alibaba.com/photo/11413948/1 ... odules.jpg
to bi bio primjer jednog paralelnog 16x2 LCD-a, još postoje i serijski al oni su kompliciranij i skuplji pa njih odmah zaboravimo
za PBP koriste se LCD-ei koji u sebi koriste HD44780 kontoler, mada ima i drugih koji se mogu koristit (jedan takav je u mene)
http://home.iae.nl/users/pouweha/lcd/lc ... assignment
tu imamo raspored pinova na jednom takvom LCD-u
Kod spajanja LCD-a sa PIC-om, ako koristimo pbp trebamo koristiti odgovarajuće pinove.
Na slici je prikazano spajanje LCD-a i PIC-a:
No spajanje na ovaj način nije nužno mogu se koristiti i drugi pinovi PIC-a ali se onda se moraju definirati pinovi koji se koriste
to bi bilo malo od hardware-skog dijela sada da pređemo na pisanja programa.
za slanje podtaka na LCD koristi se jednostavna naredba LCDOUT.
Ispod imamo tabelu komandi koje se koriste uz naredbu LCDOUT.
KOMANDA OPERACIJA NA DISPLAY-u
$FE,1 obriši displej
$FE,2 vrati se na početak prve linije
$FE,$0C isključi kursor
$FE,$0E uključi underline kursor
$FE,$0F uključi blinkajući kursor
$FE,$10 pomeri kursor u levo za 1 mesto
$FE,$14 pomeri kursor u desno za 1 mesto
$FE,$80 vrati kursor na početak prve linije
$FE,$C0 vrati kursor na početak druge linije
$FE,$94 vrati kursor na početak treće linije (za one displaye koji imaju 3 linije)
$FE,$D4 vrati kursor na početak četvrte linije (za one displaye koji imaju 4 linije)
ove komande pišu se iz LCDOUT!
Kod pisanja programa na početku potrebno je napraviti pausu od 0.5sek da se LCD inicializira.
ako uzmemo
onda se podatci upisuju u 2. red.
neki od načina slanja podataka na LCD:
http://www.elektronika.ba/forum/uploadz ... ika.ba.JPG
ako npr. želimo da podatak bude zapisan od pete pozicije u prvom redu koristit ćemo sljedeće:
http://www.elektronika.ba/forum/uploadz ... lektro.JPG
da bi vrijednosti neke konstante ili promjenjive na LCD-u predstavili u binearnom obliku koristi se naredba LCDOUT $FE, BIN i
odnosdno da bi bila u heksadekadnom ili dekadnom obliku umjesto BIN koristit će se HEX ili DEC.
ako oćemo npravi ti niz nekog znaka određeni broj puta koristit ćemo REP,
npr. ako želimo da na LCD-u imamo ispisano ***** , naredba bi izgledala LCDOUT $FE, REP "*"\5
znači gdje je "*" upisuje se znak koji se želi ponavaljati i MORA biti pod novodnicima, a 5 predstavlja broj ponvaljanja.
Ovo su bile neke osnovne naznake kod pisanja naredbih za LCD, prilično su jednostavno tako da nebi trebali imati problema sa njima!
Sada ćemo samo pokazati primjer jednog jednostavnog programa koji mjeri frekvenciju na koju dovedemo na željeni ulaz (RB1)
http://www.elektronika.ba/forum/uploadz ... _count.JPG
evo i ja sam se nešto potrudio da doprinesem u učenju pbp-a, ako netko vidi neku grešku u ovome napisanome neka rekne pošto sam još uvjke početnik ko što sam već reko!
a i pedja je reko nadopuniti pa eto vjerujem da će on ako bude kakvi greški il slično ispraviti i nadopuniti tekst!
stavit ću još koji program za LCD čim uhvatim još malo vremena!
i još jednom da pohvalim pedju na trudu, tek sam sada vidio šta znači pisat sav ovaj tekst!!
Mada sam i ja još u dubokoj fazi učenja pokušat ću napisati da svi početnici (kao i ja) shvate i razumiju!
http://img.alibaba.com/photo/11413948/1 ... odules.jpg
to bi bio primjer jednog paralelnog 16x2 LCD-a, još postoje i serijski al oni su kompliciranij i skuplji pa njih odmah zaboravimo
za PBP koriste se LCD-ei koji u sebi koriste HD44780 kontoler, mada ima i drugih koji se mogu koristit (jedan takav je u mene)
http://home.iae.nl/users/pouweha/lcd/lc ... assignment
tu imamo raspored pinova na jednom takvom LCD-u
Kod spajanja LCD-a sa PIC-om, ako koristimo pbp trebamo koristiti odgovarajuće pinove.
Na slici je prikazano spajanje LCD-a i PIC-a:
No spajanje na ovaj način nije nužno mogu se koristiti i drugi pinovi PIC-a ali se onda se moraju definirati pinovi koji se koriste
to bi bilo malo od hardware-skog dijela sada da pređemo na pisanja programa.
za slanje podtaka na LCD koristi se jednostavna naredba LCDOUT.
Ispod imamo tabelu komandi koje se koriste uz naredbu LCDOUT.
KOMANDA OPERACIJA NA DISPLAY-u
$FE,1 obriši displej
$FE,2 vrati se na početak prve linije
$FE,$0C isključi kursor
$FE,$0E uključi underline kursor
$FE,$0F uključi blinkajući kursor
$FE,$10 pomeri kursor u levo za 1 mesto
$FE,$14 pomeri kursor u desno za 1 mesto
$FE,$80 vrati kursor na početak prve linije
$FE,$C0 vrati kursor na početak druge linije
$FE,$94 vrati kursor na početak treće linije (za one displaye koji imaju 3 linije)
$FE,$D4 vrati kursor na početak četvrte linije (za one displaye koji imaju 4 linije)
ove komande pišu se iz LCDOUT!
Code: Select all
LCDOUT $FE, 1 ;briše sve sa LCD-a
Code: Select all
pause 500
LCDOUT $FE, 1 ;briše sve sa LCD-a i inicijelizira ga
Code: Select all
LCDOUT $FE, $C0 ;početak druge linije
neki od načina slanja podataka na LCD:
Code: Select all
LCDOUT $FE, 1, "elektronika.ba" ; ispisuje u prvu liniju elektronika.ba
LCDOUT $FE, $C0, "elktrophreak ; u drugu liniju ispisuje elektrophreak
LCDOUT $FE, i ; ispisuje neku vrijednost koju smo dodjelili i
ako npr. želimo da podatak bude zapisan od pete pozicije u prvom redu koristit ćemo sljedeće:
Code: Select all
LCDOUT $FE, $80+5, "elektro"
da bi vrijednosti neke konstante ili promjenjive na LCD-u predstavili u binearnom obliku koristi se naredba LCDOUT $FE, BIN i
odnosdno da bi bila u heksadekadnom ili dekadnom obliku umjesto BIN koristit će se HEX ili DEC.
ako oćemo npravi ti niz nekog znaka određeni broj puta koristit ćemo REP,
npr. ako želimo da na LCD-u imamo ispisano ***** , naredba bi izgledala LCDOUT $FE, REP "*"\5
znači gdje je "*" upisuje se znak koji se želi ponavaljati i MORA biti pod novodnicima, a 5 predstavlja broj ponvaljanja.
Ovo su bile neke osnovne naznake kod pisanja naredbih za LCD, prilično su jednostavno tako da nebi trebali imati problema sa njima!
Sada ćemo samo pokazati primjer jednog jednostavnog programa koji mjeri frekvenciju na koju dovedemo na željeni ulaz (RB1)
Code: Select all
TRISB.1=1
TRISA=0
BROJ VAR WORD
pause 500
lcdout $FE, 1
POCETAK:
COUNT PORTB.1,1000,BROJ ' broji impulse na pinu RB1, u periodu od 1S i rezultat smesta u "BROJ"
lcdout $FE, $80, "COUNT=", dec broj ; ispisuje na LCD-u COUNT= i broj prikazuje kao decimalnu veličinu
pause 10
GOTO POCETAK
evo i ja sam se nešto potrudio da doprinesem u učenju pbp-a, ako netko vidi neku grešku u ovome napisanome neka rekne pošto sam još uvjke početnik ko što sam već reko!
a i pedja je reko nadopuniti pa eto vjerujem da će on ako bude kakvi greški il slično ispraviti i nadopuniti tekst!
stavit ću još koji program za LCD čim uhvatim još malo vremena!
i još jednom da pohvalim pedju na trudu, tek sam sada vidio šta znači pisat sav ovaj tekst!!
- Attachments
-
- PIC-LCD.gif
- (10.03 KiB) Downloaded 1 time
Last edited by Dariolo on 21-10-2008, 17:21, edited 1 time in total.
kod koriscenja define upotreba naredbi lcdout se ne menja. define samo definise kako je spojen lcd sa picem. i dodaje se na sam pocetak programa.
DEFINE LCD_BITS 4 'bira se da li lcd radi u 4 bitnom ili 8 bitnom modu
DEFINE LCD_DREG PORTB 'bira se port na koji su zakaceni data biti(d4-d7)
DEFINE LCD_DBIT 0 'pocetni bit data porta. 0 ili 4. ako je postavljen na 0 onda se d4 spaja na rb0,d5-rb1, d6-rb2, d7-rb3,
a ako je postavljen na 4 d4 se spaja na rb4 itd..
DEFINE LCD_RSREG PORTB 'port na koji je zakacena linija RS
DEFINE LCD_RSBIT 4 'bit porta na kome je zakacena linija RS. u ovom slucaju je zakacena na RB4
DEFINE LCD_EREG PORTB 'port na kome je zakacena E linija displeja
DEFINE LCD_EBIT 3 'bit porta na kome je zakacena E linija.
DEFINE LCD_RWREG PORTE 'podesavanje sa RW liniju. mada ovo se ne ubacuje jer se RW vezuje na masu. i time je odabran upis podataka u displej.
DEFINE LCD_RWBIT 2 'RW bit
DEFINE LCD_LINES 2 'broj linija displeja. 1,2,4
DEFINE LCD_COMMANDUS 2000 'kasnjenje komande u ms. po meni je ne potrebno posebno definisati, jer je vec definisano u pbp
DEFINE LCD_DATAUS 50 'kasnjenje podataka u ms.
jos par napomena. umesto potenciometra moze se ubaciti otpornik(2k2) izmedju mase i pina 3. a ako se koristi ra4 sa lcd-om pull up otpornik uglavnom nije potreban jer lcd ima pull up na svim ulasnim pinovima.
kada se radi simulacija u proteusu, tada pull up mora ici...
evo jedan primer spajanja lcd-a na portb.
sema:
DEFINE LCD_BITS 4 'bira se da li lcd radi u 4 bitnom ili 8 bitnom modu
DEFINE LCD_DREG PORTB 'bira se port na koji su zakaceni data biti(d4-d7)
DEFINE LCD_DBIT 0 'pocetni bit data porta. 0 ili 4. ako je postavljen na 0 onda se d4 spaja na rb0,d5-rb1, d6-rb2, d7-rb3,
a ako je postavljen na 4 d4 se spaja na rb4 itd..
DEFINE LCD_RSREG PORTB 'port na koji je zakacena linija RS
DEFINE LCD_RSBIT 4 'bit porta na kome je zakacena linija RS. u ovom slucaju je zakacena na RB4
DEFINE LCD_EREG PORTB 'port na kome je zakacena E linija displeja
DEFINE LCD_EBIT 3 'bit porta na kome je zakacena E linija.
DEFINE LCD_RWREG PORTE 'podesavanje sa RW liniju. mada ovo se ne ubacuje jer se RW vezuje na masu. i time je odabran upis podataka u displej.
DEFINE LCD_RWBIT 2 'RW bit
DEFINE LCD_LINES 2 'broj linija displeja. 1,2,4
DEFINE LCD_COMMANDUS 2000 'kasnjenje komande u ms. po meni je ne potrebno posebno definisati, jer je vec definisano u pbp
DEFINE LCD_DATAUS 50 'kasnjenje podataka u ms.
jos par napomena. umesto potenciometra moze se ubaciti otpornik(2k2) izmedju mase i pina 3. a ako se koristi ra4 sa lcd-om pull up otpornik uglavnom nije potreban jer lcd ima pull up na svim ulasnim pinovima.
kada se radi simulacija u proteusu, tada pull up mora ici...
evo jedan primer spajanja lcd-a na portb.
Code: Select all
DEFINE LCD_BITS 4
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 0
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 4
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 5
DEFINE LCD_LINES 2
pause 100 'cekanje inicijalizacije displeja
lcdout $fe,1, "pozdrav svima"
end
- Attachments
-
- untitled.GIF
- Sema
- (36.4 KiB) Downloaded 1 time
Imama problem sa lcd.. uzeo sam od mikroelektronike njihov sa plavim osvetlenjem i sve sam uradio po pedjinoj semi jos sam doceo na pin1 gnd, spojio sa pic16f84 u ubacio ovaj pedjin probram i nedaje znake zivota samo svetli osvetlenje i na ekranu nista nepise.... nez do cega moze bit problem jel neko imao takav problem
- Elektronicar
- Pravo uznapredovao :)
- Posts: 467
- Joined: 19-01-2008, 17:05
- Location: Balkan
spoj kao na semi. onda izbacis define, i samo pises
http://www.elektronika.ba/forum/uploadz ... 14_sch.GIF
Code: Select all
trisa=0
trisb=0
pause 100
lcdout $fe,1,"pozdrav"
end
Last edited by pedja089 on 20-10-2008, 20:50, edited 2 times in total.