skraceni kurs ucenja picbasica

Rasprava o PIC mikrokontrolerima, PIC projekti i drugo vezano za PIC-eve...

Moderators: pedja089, stojke369, [eDo], trax

Post Reply
User avatar
RIDIK
Napredujem
Napredujem
Posts: 125
Joined: 07-05-2008, 18:11

Post by RIDIK »

razlikata dali portb.6 e gore kako vo mojot slucaj ili dole kako ti sto si pisal e vo toa sto koga ke go upalis picot neznaci deka portb.6 e off...
User avatar
pedja089
Administrator sajta
Administrator sajta
Posts: 7874
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Post by pedja089 »

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 :wink:
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.
User avatar
pedja089
Administrator sajta
Administrator sajta
Posts: 7874
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Post by pedja089 »

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 :D 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
ako ima nekih nejasnoca pitaj te
User avatar
pedja089
Administrator sajta
Administrator sajta
Posts: 7874
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Post by pedja089 »

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
Last edited by pedja089 on 08-09-2008, 22:54, edited 1 time in total.
User avatar
pedja089
Administrator sajta
Administrator sajta
Posts: 7874
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Post by pedja089 »

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

Code: Select all

i VAR BYTE
SIMBOL LED=PORTB.1
OUTPUT LED
FOR i=1 TO 10             'broj prolaza 10
TOGGLE LED                 
NEXT i 
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

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 
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 :D
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 :wink:
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]
Ovo mi do sad nije palo na pamet. Video sam od @TomicIgor. Hvala puno.
User avatar
pedja089
Administrator sajta
Administrator sajta
Posts: 7874
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Post by pedja089 »

jel imate lcd il da samo objasnim jos ove dve stvari pa da kazem da je kraj :?:
koska182
Posts: 11
Joined: 09-06-2007, 01:00

Post by koska182 »

Iako je ovo moj prvi post, aktivno pratim kurs.
Nisam nabavio lcd, ali bi htio nauciti kako se s njim upravlja. koristit cu proteus za simuliranje dok ne nabavim pravi lcd.
Kurs je odlican i htio bi da se što vise naredbi i funkcija obradi.
Svaka cast na trudu!
User avatar
alexa_pg
Pravo sam se raspisao :)
Pravo sam se raspisao :)
Posts: 1248
Joined: 11-03-2005, 22:21
Location: Podgorica

Post by alexa_pg »

Sta je sa casovima? Idemo dalje...
User avatar
Dariolo
Odlično uznapredovao
Odlično uznapredovao
Posts: 822
Joined: 24-08-2006, 23:29
Location: Žepče (BiH), Zagreb (HR)

Post by Dariolo »

kurs je u izredi ponovo dobrom pedjinom voljom, tako malo strpljena :wink: :wink:
User avatar
pedja089
Administrator sajta
Administrator sajta
Posts: 7874
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Post by pedja089 »

sema:
Image
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:
Image

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
drugi nacin pomeranja u levu stranu je mnozenje sa brojem 16(ako je potrebno 4 mesta)

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
sada dolaze na red displeji u multipleksu.
sema:
Image
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
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:

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
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:

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
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.
User avatar
Dariolo
Odlično uznapredovao
Odlično uznapredovao
Posts: 822
Joined: 24-08-2006, 23:29
Location: Žepče (BiH), Zagreb (HR)

Post by Dariolo »

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 :D

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:

Image

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 
Kod pisanja programa na početku potrebno je napraviti pausu od 0.5sek da se LCD inicializira.

Code: Select all

pause 500 
LCDOUT $FE, 1 ;briše sve sa LCD-a i inicijelizira ga 
ako uzmemo

Code: Select all

 LCDOUT $FE, $C0  ;početak druge linije
onda se podatci upisuju u 2. red.

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
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:

Code: Select all

 LCDOUT $FE, $80+5, "elektro" 
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)

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
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!!
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.
User avatar
pedja089
Administrator sajta
Administrator sajta
Posts: 7874
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Post by pedja089 »

super odradjeno. ja cu samo jos dodati kako se koristi define za lcd, tako da se moze spojiti na bilo koji port, cim malo uhvatim vremena....
User avatar
pedja089
Administrator sajta
Administrator sajta
Posts: 7874
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Post by pedja089 »

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.

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
sema:
Attachments
untitled.GIF
Sema
(36.4 KiB) Downloaded 1 time
User avatar
DaTi
Odlično uznapredovao
Odlično uznapredovao
Posts: 730
Joined: 10-06-2007, 13:24
Location: Novi Sad - Srbija
Contact:

Post by DaTi »

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 :?:
User avatar
Elektronicar
Pravo uznapredovao :)
Pravo uznapredovao :)
Posts: 467
Joined: 19-01-2008, 17:05
Location: Balkan

Post by Elektronicar »

Nisi pravilno inicijalizovao display ili imas gresku u programu. Takodje proveri kontrast.
koska182
Posts: 11
Joined: 09-06-2007, 01:00

Post by koska182 »

jesi na lcd-u spojio r/w pin (pin 5) na masu?
User avatar
pedja089
Administrator sajta
Administrator sajta
Posts: 7874
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Post by pedja089 »

spoj kao na semi. onda izbacis define, i samo pises

Code: Select all

trisa=0
trisb=0
pause 100
lcdout $fe,1,"pozdrav"
end
http://www.elektronika.ba/forum/uploadz ... 14_sch.GIF
Last edited by pedja089 on 20-10-2008, 20:50, edited 2 times in total.
User avatar
DaTi
Odlično uznapredovao
Odlično uznapredovao
Posts: 730
Joined: 10-06-2007, 13:24
Location: Novi Sad - Srbija
Contact:

Post by DaTi »

PRoradio mi je bilo... i onda smao odjednom opet je zakazalo i sad u prvom redu imam jednu takicu i nista vise.... do cega je to :?: :evil:
User avatar
pedja089
Administrator sajta
Administrator sajta
Posts: 7874
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Post by pedja089 »

do protoborda. i meni se to desavalo. napravi neku malu test plocicu sa lcd-om i ostale pinove samo izvuci do kraja plocice....
User avatar
pedja089
Administrator sajta
Administrator sajta
Posts: 7874
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Post by pedja089 »

evo ja sam sad probaop program sa define i radi bez problema...
Post Reply