Elektronski Fakultet u Nišu
Katedra za elektroniku
Predmet: Embeded sistemi
Ispisivanje tekstualnih poruka na LED displeju
Mentor: prof.Dr. Mile Stojčev Studenti: Igor Stojanović 12777
Miloš Lazić 13166
Ispis tekstualnih poruka na LED displeju
- 1 -
Sadržaj
1.Uvod…………………………………………………………………………………….…. 2.
1.2 Princip rada hardvera………………………………………………………......2.
2. Softver…………………………………………………………………………………..….4.
3.Mikrokontroler 16F887………………………………………………………………….9.
4.Razvojni sistem UNI-DS3.....................................................................................11.
5. Dodatak A………………………………………………………………………………..19.
6. Dodatak B………………………………………………………………………………..40.
7.Literatura…………………………………………………………………………………42.
Ispis tekstualnih poruka na LED displeju
- 2 -
1. Uvod
Zadatak ovog projkta je realizacija hardvera i softvera pomoću kojeg se ispisuju
tekstualne poruke na LED displeju, primenom mikrokontrolera PIC16F887. Treba napomenui da
se ne koristi klasičan LED displej, nego je za ovu svrhu napravljen poseban displej od LED
dioda organizovanih u matricu 8x8. Slanje tekstualnih poruka se vrši preko RS232 porta
računara.
1.2 Princip rada hardvera
Displej na kojem se ispisuju tekstualne poruke formirane je od 64 crvene LED diode.
Ako se pogleda jedna nezavisna dioda videćemo da je sa strane anode, preko otpornika, vezana
na port B , dok je katorda vezana preko invertorskog bafera na port D. Da bi dioda bila aktivna
na portove je potrebno poslati logičku jedinice. Kako je na port D povezan invertor tao znači da
će se slanjem logičke jedinice na katodi diode javiti nivo logičke nule. Kako je potencijal anode
veći od potencijala katode, stvoriće se uslov da dioda provede. U konkretnom slučaju korišćene
se diode čija je stuja I=10mA, tako da su otpornici koji su stavljeni u kolo anode vrednosti od
R=470Ω.
Slika 1.1 Osnovni princip uključivanja jedne diode.
Kako bi se uključio veći broj dioda na displeju, i time formirao karakter poruke,
iskorišćen je princip “šetajuće jedinice”. Ovaj princip zasniva se na tome da se preko jednog
porta šalje logička jedinca i da ona kruži. To bi značilo da se na port D.0 mikrokontrolera
pošanje jedinica i da se ona zatim prenosi redom na portove D.1, D.2, D.3... redom sve do porta
D.7 kada se ponovo vraća na port D.0. Kako su diode povezane na port preko invertor to bi
značilo da će kružiti nula. Na port B se šalju heksadecimalne vrednosti vektora tekuće vrste
dioda. Heksadecimalna vrednost se formira tako što se svakoj vrsti dodeljuje vrednost stepena
dvojke počev s desna na levo, tako da će prva vrsta imati vrednost 20 druga 2
1, treća 2
2 sve do
vrednosti 27. Npr. ako bi smo hteli da ispišemo slovo „I“ potrebno je na port B poslati
heksadecimalnu vrednost 7E. Na slici 1.2 ilustrovan je prikaz slova “I” na LED displeju.
L E D
1 K
12
INVERTORA
PORTC
PORTD
Ispis tekstualnih poruka na LED displeju
- 3 -
Slika 1.2 Ilustracija prikaza slova “I”
Prema opisanom načinu rada, formiran je celokupna šema koja je prikazna na slici 1.3.
Konektori označeni na šemi sa P1 i P2 služe za povezivanjem sa portovima razvonog sistema. Za
potrebe praktične realizacije iskorišćeni su 10-pinski IDC konektori. Fizička komunikacija je
ostvarena 10-o žilnim flet kablom na koji su montirani 10-pinski IDC konktori, muški. Sa porta
P2 signal se dovodi na ulaz kola ULN2803A, koje je invertujući bafer. Preko otpornika povezane
su 64 LED diode koje su razvrstane tako da formiraju matricu 8x8.
Slika 1.3 Šema LED matrice
Ispis tekstualnih poruka na LED displeju
- 4 -
Slika 1.4 Talasni oblici signala na portovima PORTB i PORTD
2. Softver
Softver za mikrokontroler 16F887 napisan je na programskom jeziku C, a za potrebe
kompajliranja korišćena je demo verzija programa mikroC firme Mikroelektronika. U kodu se
koriste dve biblioteke: “funkcija” i “slovo”. U biblioteci funkcija.h nalaze se odgovarajuće
funkcije za ispisivanje određenog slova abecede, a u biblioteci slovo.h je smeštena je funkcija za
prepoznavanje slova i pozivanje odgovarajuće funkcije za njegov ispis.
Logika koda je sedeća: U glavnom kodu se u while petlji, podaci pristigli preko USART-
a, upisuju u vektor “str”. Kada je pristigli podatak ASCII ekvivalent znaka “.” iz while petlje se
izlazi i ulazi u novu while petlju u kojoj se podaci iščitavaju iz prethodno popunjenog vektora,
karakter po karakter pri čemu se posle svakog pročitanog karaktera poziva funkcija “slovo” iz
biblioteke slovo.h. Funkciji se predaje ASCII ekvivalent datog karaktera i pokazivač na
promenljivu wr(pr=*wr). Kada se naiđe na ASCII ekvivalent znaka “.” izlazi se iz petlje, setuje
marker “mar” i vraća na početak programa. Marker “mar” onemogućava izvršavanje sekvence
koda namenjenoj upisu podataka preko USART-a pri ponovnom izvršavanju programa.
Cikličnim izvršavanjem glavnog programa dobija se efekat rotiranja poruke.
Ispis tekstualnih poruka na LED displeju
- 5 -
1
ust=0
mar=0
Str[ust]!=46
str[ust]=USART_READ
ust++
1
0
0
1
mar=1
ind=1
Str[ind]!=46
prenos=str[ind]
Slovo(prenos,pr)
ind++
1
0
2
2
1
Slika 2.1 Algoritam rada glavnog programa
Ispis tekstualnih poruka na LED displeju
- 6 -
Slika 2.2 Algoritam funkcije “Slovo”.
Algoritam funkcije “funkcija” je sledeći: Prilikom njenog pozivanja predaje se pokazivač
na vektor “wr”. U funkciji je definisan vektor C[8]. Veličina svakog elementa je 16 bita. Na
početku koda se vektor popunjava konstantnim vrednostima tipičnim za svako slovo. Prvom for
petljom se svaki elemenat c vektora pomera za jedno mesto ulevo. Osam viših bitova elementa
vektora c se maskira logičkom AND operacijom sa maskom 0x0100 i dodeljuje elementu
pomoćnog vektora pom[8]. Dati element se zatim pomera osam mesta udesno. Element vektora
“wr” se pomera za jedno mesto ulevo a zatim se vrši logička OR operacija sa elementom
vektora pom. Definisana je for petlja za osvežavanje jedne kolone slova. U okviru te for petlje
definisana je još jedna petlja u kojoj se isčitavaju elementi vektora wr i ispisuju na LED displeju.
Celokupni opisani kod je smešten u jednu for petlju kojom se vrši njegovo ponavljanje čime se
postiže efekat pomeranja slova na displeju.
Ispis tekstualnih poruka na LED displeju
- 8 -
U nastavku je dat popis korišćenih funkcija microC kompajlera.
Funkcija Usart_Init(19200) – služi za inicijalizaciju USART komunikacije, preko koje se
uspostavlja veza sa računarom. Na računaru se preko programa Hyper Terminal šalje poruka na
LED displej.
Funkcija Usart_Read() – služi za čitanje karaktera poslatog od strane računara preko USART
komunikacije. Nakon čitanja podatak se smešta u definisani vektor.
Funkcija Usart_Write(s) – slži za slanje podataka s na računar. Ova funkcija je iskorišćenja radi
preleda poslatih podataka, tj. ona vraca svaki poslati karakter natrag računaru.
Korišćeni su sledeći registri PIC 16f887 kontrolera:
TRISB,TRISD – registri čiji sadržaj definiše tip (ulazni/izlazni) porta B i D respektivno. Na
bitski pozicijama gde je upisana 0 odgovarajući pin se ponaša kao izlazni, a gde je upisana 1, kao
ulazni.
PORTB,PORTD – registri čiji se sadržaj prenosi na pinove B i D, respektivno.
Ispis tekstualnih poruka na LED displeju
- 9 -
3. Mikrokontroler PIC16F887
U zadatku je korišćen 8-bitni mikrokontroler 16F887. U daljem tekstu biće ukazano na
osnovne karakteristike ovog mikrokontrolera.
CPU je RISC (Reduced Instruction Set Computing) tipa sa 35 instrukcija. Sve instrukcije
su jednociklusne osim instrukcije grananja.
Brzina rada je od DC do 20MHz
Osmonivovski magacin (stack)
Podržava direktni, indirektni i relativni adresni način rada
Softversko biranje radne frekvencije od 31kHz do 8MHz
Mogućnost detektovanja hazarda kvarc oscilatora
Menjanje taktne frekvencije tokom rada u cilju smanjenja potrošnje
Sleep mod
Široki opseg napona napajanja (2.0V do 5.5V)
Power-on reset (POR)
Power-up Timer (PWRT)
Oscillator Start-up Timer (OST)
Brown-out Reset (BOR)
Watchdog Timer (WDT)
Flash/EEPROM, 100 000 ciklusa upisa (flash), 1 000 000 ciklusa upisa (EEPROM)
Struja u standby režimu je 50nA (pri naponu napajanja 2V)
Struja u radnom režimu je 220µA pri taktnoj frekvenciji od 4MHz i naponu 2V
24/35 ulazno/izlaznih pinova sa sposobnošću velike strujne pobude/sinkovanje
Analogni komparatorski modul sa 2 analogna komparatora, programabilnim referentnim
naponom
AD konvertor: 10bitna rezolucija, 14 kanala
8-bit tajmer/brojč sa 8-bitnim programabilnim deliteljemž
16-bitni tajmer/brojač sa deliteljem
8-bitni tajmer2 sa predeliteljem i postdeliteljem
PWM (Pulse Width Modulatio) modul
USART modul za: podžava RS485, RS232 i LIN2.0
Ispis tekstualnih poruka na LED displeju
- 11 -
4. Osnovne karakteristike i način korišćenja UNI-DS3 razvojnog sistema
UNI-DS3 razvojni sistem predstavlja razvojno okruženje za eksperimentisanje i
programirenje mikrokontrole. Zbog ugradjenog DIMM-168P podnožija na sistem, moguće je
primeniti ga za razvoj aplikacija zasnvanim na različitim mikrokontrolerima. Mikrokontroleri
koje ploča podržava su: PIC, dsPIC, AVR, ARM, 8051, PSoC. Svaki od ovih mkrokontrlera se
nalazi na posebnoj MCU kartici koja se instalira na ploču preko DIMM-168P podnožija. Pored
mogućnsti u vidu proširenja izbora mikrokontrolera koji se mgu koristiti na razvojnom sistemu,
podržan je i velii broj dodatnih modula poput RS232, RS485, CAN, ADC, DAC, LCD displeja,
GLCD displeja, MMC/SD slot za memorijske kartice.
4.1. Povezivanje razvojnog sistema na računar
Razvojni sistem se na računar povezuje pomoću USB kabla. Kraj USB kabla sa
konektorom tipa USB B se povezuje na ploču dok se strana sa konektorom tipa USB A povezuje
na računar. Napajanje sistem moguće je izvesti na dva načina, preko USB port, i preko AC/DC
konektora. Prilikom izbora napajanja i povezivanja ploče neophodno je postaviti džamper J11 na
odgovarajući način prikazan na slici 3.1. Prekidačem POWER SUPPLY sistem se uključuje ili
isključuje.
Da bi se ostvarila uspešna komunikacija sa računarom neophodno je instalirati, na
računaru, drajver koji je potreban za rad programatora. Pored drajvera instalira se i program za
prenos .hex koda u mikrokontroler.
Slika 4.1.USB port i modul za napajenje
4.2 . Postavljanje MCU kartice
Na ploči se nalazi DIMM-168P slot u koji se postavlja MCU kartica sa
mikrokontrolerom. Za bezbedno postavljanje kartice pažljivo otvoriti bravice koje se nalaze na
kraju konktora. Zatim postaviti karticu vodeći pri tome da se zarezi napravljeni na dnu kartice i
zarezi u slodu poklapaju. Lagano gurnuti karticu na dole i istovremeno podići bravice.
Ispis tekstualnih poruka na LED displeju
- 12 -
Slika 4.2. Šematski prikaz DIMM-168P slota
4.3 Napajenje razvojnog sistema
Sistem je moguće na napajati na dva načina: Naponom od +5V iz računara preko USB
kabla za programiranje i pomoću spoljašnjeg izvora koji se priključuje na AC/DC konetor na
razvojnom sistemu.
Sa ugradjenim Grecovim ispravljačem i stabilizatrom napona LM7805, na sistem se može
dovesti od 8V do 16V naizmečnog napona ili od 8V do 16V jednosmernog napona.
Postavljanjem džampera J11 u položaj EXT sistem se konfigurise tako da koristi eksterno
napajanje. Ako je J11 u položaju USB omogućava se napajenje sistem preko USB kabla. Na
slikam 3.3 i 3.4 dat je prikaz načina povezivanja napajanja i šema izvora za napajenja,
respektivno.
Slika 4.3. Modul za napajanje
Slika 4.4. Šematski prikaz izvora za napajanje
Ispis tekstualnih poruka na LED displeju
- 13 -
4.4. USB konektor za MCU karticu
Na razvojnom sistemu se nalazi USB konektor koji je povezan sa programatorim na
MCU kartici. Svaka kartica ima ugradjen programator u zavisnosti od tima mikrokontrolera koji
se koristi. Za MCU karticu sa PIC mikrokontrolerom koristi se PICflash programator sa
mikroICD podrškom . U slučaju da se koristi kartica sa drugim mikrokontrolerom potrebno je
instalirati programator predvidjen za isti.
Slika 4.5.USB konektor za MCU karticu i šematski prikaz
4.5. USB komunikacija
USB konektor omogućava povezivanje MCU kartice, na kojoj se nalazi mikrokontroler sa
ugradjenim modulom za USB komunikaciju, i spoljašnjeg uredjaja. MCU kartice je povezana sa
USB konektorom preko linija MCU-USBDN i MCU-USBDP. Linija MCU-VBUS služi za
detekciju prisustva spoljašnjeg USB uredjaja.
Slika 4.6. Konektor za USB komunikaciju i šematski prikaz
4.6.CAN komunikacija
CAN (Controller Area Network) predstavlja komunikacijski standard namenjen
prvenstveno za upotrebu u automobilskoj industriji. Zahvaljujuci njemu mikrokontroler može da
komunicira sa uredjajima u automobilu bez upotrebe host računara. Za komunikaciju izmedju
ciljnog uredjaja i CAN kontrolera koristi se transiversko kolo MCP2510. Kolo MCP2510
predstavlja samostalni CAN kontroler koji komunicira sa mikrokontrolerom preko serijske SPI
veze. Da bi se ostvarila veza izmedju kola MCP2510 i mikrokontrolera potrebno je prekidače 6,7
i 8 na DIP prekidaču SW2 prebaciti u položaj ON. Takodje je treba prebaciti prekidače 4, 5 i 6
na DIP prekidaču SW4, na ON.
Ispis tekstualnih poruka na LED displeju
- 14 -
Slika 3.7 CAN modul i konektor
4.7.RS232 komunikacija
USART (Universal Synchronous/Asynchronos Receiver/Transmitter) predstavalja jedan
od najčešćih načina prenosa podataka izmedju računara i perifernih uredjaja. RS232 serijska
komunikacija se obavlja preko 9-pinskog SUB-D konektora i USART modula mikrokontrolera.
Za uključivanje RS232 porta koriste se prekidači sa oznakom RS232A, TX232A, RX232B i
TX232B na DIP prekidaču SW3. Oznake linije za ovu komunikaciju su: RX-prijemna linija i TX-
predajna linija. Brzina prenosa podataka je 115kbps.
4.8. Šema povezivanja RS232 modula i mikrokontrolera
Ispis tekstualnih poruka na LED displeju
- 15 -
4.8 LED diode
UNI-DS3 razvojni sistem ima 72 LED diode koje vizuelno prikazuje stanje na svako I/O
pinu mikrokontrolera. Ako je LED dioda aktvina to znači da je na pinu prisutan napon logičke
jedinice. Da bi smo omogućili prikaz logičkih stanja na pinovima, potrebno je pomoću DIP
prekidača SW1 i prekidača 1 na DIP prekidaču SW2 odabrati odgovarajući port (PORTA,
PORTB, PORTC, PORTD, PORTE, PORTF, PORTG, PORTH ili PORTJ). LED diode koje se
koriste na UNI-DS3 razvojnom sistemu su sa pobudnom strujom do I=1mA.
Slika 4.9. LED diode na UNI-DS3 razvoјnom sistemu
Slika 4.10. Šematski prikaz povezivanja LED dioda sa potovima PORTB i PORTC
Ispis tekstualnih poruka na LED displeju
- 16 -
4.9. Tasteri
Logičko stanje svih ulaznih pinova mikrokontrolera može se menjati pomoću tastera.
Džamperom J10 se odredjuje logički nivo koji će se pritiskom na taster dovesti na pin
mikrokontrolera. Neposredno pored tastera nalazi se i izdvojeni taster RESTE kojim se na pin
MCLR mikrokontrolera dovodi signal za resetovanje.
U primeru na slici 4.11. džamper J10 je u položaju VCC. U tom slučaju pritisak tastera
će imati za posledicu pojavu napona logičke jedinice (5V), na pinu mikrokontrolera.
Slika 4.11. Šematski prikaz povezivanja tastera na PORTB
4.10. Ulazn/ izlazni portovi
Na sistemu, uz desnu ivicu, nalazi se devet desetopinskih konektora koji su povezani sa
I/O portovima mikrokontrolera. Pinovi mikrokontrolera koji se koriste za programiranje nisu
direktni povezani na 10-pinski konektor, već je njihova izvedena preko multipleksera.
Multiplekser se nalazi na MCU kartici i povezan je sa programatorom. Pinovi mikrokontrolera
mogu biti povezani na pull-up ili pull-down otpornike preko džampera J1-J9. Sami pull-up / pull-
down otpornici su u obliku otporne mreže, tako da se mogu izvaditi iz podnožija i zameniti
drugim. Ukoliko se pull-up/ pull-down otpornici ne koriste potrebno ih je ukloniti i skinuti
džampere J0-J9. Na slici 4.12 data je šema povezivanja parta PORTB sa pull-down otpornicima.
Ispis tekstualnih poruka na LED displeju
- 17 -
Slika 4.12. Šema porta PORTB
Pull-up/pull-down otpornici omogućavaju da se definiše logičku nivo na ulaznim
pinovima mikrokontrolera kada su u neaktivnom stanju. Ovaj logički nivo zavisi od položaja
pull-up/pull-down dyampera. Za obajšnjenje rada pull-up/pull-down otpornika koristićemo pin
RB1 na mikrokontroleru sa džamperom J2 i taster RB1 sa džamperom J10. Prinicip rada pull-
up/pull-down otpornika je identičan na svi ostalim portovima.
Da bi se omogućilo povezivanje porta
PORTB sa pull-down otpornicima, potrebno je najpre
postaviti džamper J2 u poziciju označenu sa down.
Na taj način se preko džampera J2 i otporne mreže
8x100kΩ, omogućava svim pinovima porta PORTB
da imaju nivo logičke nule u stanju mirovanja
(neaktivno stanje). Nakon toga, uz uslov da je
džamper J10 postavljen u poziciju VCC, svakim
pritiskom na taster RB1, napon VCC (5V) će se
pojaviti na pinu RB1.
Slika 4.13 Položaj džampera
Ispis tekstualnih poruka na LED displeju
- 18 -
Da bi smo omogućili povezivanje
porta PORTB sa pull-up otpornicima i
dovođenje logičke nule na pinove ovog porta,
potrebno je postaviti džamper J2 u položaj
označen sa Up i džamper J10 u položaj
označen simbolom mase. Time se preko
otpornika od 100kΩ obezbeđuje dovođenje
visokog logičkog nivoa (5V) na sve ulaze
porta PORTB u neaktivnom stanju. Nakon
toga svakim pritiskom tastera RB1, napon
logičke nule će se pojaviti na pinu RB1.
Slika 4.14. Položaj džampera
Ako su džamperi J2 i J10 u istom
položaju, slika 3.15, neće doći do promene
logičkog stanja na portovima usled pritiska
tastera.
Slika 4.15.
Ispis tekstualnih poruka na LED displeju
- 19 -
Dodatak A: Listing koda
Glavni program
#include "funkcija.h" // uključvanje biblioteke funkcija
#include "slovo.h"// uključivanje biblioteke slovo
void main()
short int str[9];//definisanje bafera za smeštanje slova
char prenos;
short int *pr;//pokazivač na bafer str
short int ust;//promenljiva koja se koristi kao pokazivač
//trenutne pozicija u baferu str
short int ind,mar;//markeri koji definiši programski tok
unsigned int wr[8]=0,0,0,0,0,0,0,0;// vektor za pamćenje
//podataka koji se prikazuje na displeju
TRISB=0x00;//definisanje porta b kao izlazni
TRISD=0x00;//definsanje porta d kao izlazni
PORTB=0x00;//postavljanje porta b na nulu
PORTD=0x00;//postavljanje porta d na nulu
ANSELH=0;//definisanje porta b kao digitalni
ust= str;
pr=wr;
mar=0;//postavljanje markera na 0 kako bi se omogućila UART
//komunikacija pri prvom prelasku koda
while(1) //beskonačna petlja
ust=0;
if(mar==0)
Usart_Init(19200);//inicijalizacija UART komunikacije na
//brzinu 19200bps
while((str[ust])!=46) // ispitivanje da li je karakter
//poslat preko UART-a „.‟
if(Usart_Data_Ready()) //ispitivanje da li je primljen
//karakter
ust++;//inkrementiranje markera pozicije
str[ust]=Usart_Read();//smeštanje prihvaćenog podatka
//u bafer
Usart_Write(str[ust]);// slanje prihvaćenog podatka natrag
//na HyperTerminal
ind=1;// postavljanje markera ind na 1 jer citanje
//popunjenog bafera treba početi od 1 pozicije
Ispis tekstualnih poruka na LED displeju
- 20 -
mar=1;// postavljanje markera mar na 1 radi onemogućavanja
//ponovnog startovanja UART komunikacije pri ponovnom
//izvršavanju glavnog programa u while petlji
while(str[ind]!=46) //čitanje karaktera iz bafera sve dok
//se ne naidnje na „.‟
prenos=str[ind];//nakon čitanja svakog pojedinačnog
//karaktera poziva se funkcija za prepoznavanje slova
slovo(prenos,pr);//funkcija za prepoznavanje slova
ind++;//inkrementiranje markera pozicije za čitanje iz
//bafera
Kod biblioteke “slovo.h”
void slovo(char prenos,int pr) //funkcija prihvata
//pokazivač na promenljivu za pamćenje prikaza za displej,
//pr,i pročitano slovo iz glavne funkcije
switch(prenos) //ispitivanje pročitanog slova i
//pozivanje odgovarajuće funkcije za ispis slova
case 'a': as(pr);break;
case 'b': bs(pr);break;
case 'c': cs(pr);break;
case 'd': ds(pr);break;
case 'e': es(pr);break;
case 'f': fs(pr);break;
case 'g': gs(pr);break;
case 'h': hs(pr);break;
case 'i': is(pr);break;
case 'j': js(pr);break;
case 'k': ks(pr);break;
case 'l': ls(pr);break;
case 'm': ms(pr);break;
case 'n': ns(pr);break;
case 'o': os(pr);break;
case 'p': ps(pr);break;
case 'r': rs(pr);break;
case 's': ss(pr);break;
case 't': ts(pr);break;
case 'u': us(pr);break;
case 'v': vs(pr);break;
case 'z': zs(pr);break;
Ispis tekstualnih poruka na LED displeju
- 21 -
case ' ': space(pr);break;
Kod biblioteke “funkcija.h”
//slovo a
void as(int *pr)//funkcija koja ispisuje slovo na displeju
unsigned int c[8];//definisanje konstante u kojoj se pamte
//vektori slova
unsigned int pom[8];//pomoćna promenljiva koja se koristi
//za pomeranje karaktera na displeju
short int i,j,k,l;//promenljive brojača
//inicijalne vrednosti vektora slova
c[0]=0x003C;
c[1]=0x0042;
c[2]=0x0042;
c[3]=0x0042;
c[4]=0x007E;
c[5]=0x0042;
c[6]=0x0042;
c[7]=0x0042;
for(i=0;i<=7;i++) //brojač pozicija pomeraja karaktera
//na displeju
for(j=0;j<=7;j++) //pomeranje svakog karaktera za jedno
//mesto ulevo
pom[j]=c[j] & 0x0100;//maskiranje promenljive radi
//izdvajanja prvog bita
pom[j]= pom[j] >> 8;//pomeranje za 8 mesta udesno
*(pr+j)= *(pr+j) << 1;
*(pr+j)= *(pr+j) | pom[j];
c[j]= c[j] << 1;
for(j=0;j<=100;j++) //brojačka petlja za osvežavanje
//displeja
l=0x01;
for(k=0;k<=7;k++)
PORTD=0x00;
PORTB=*(pr+k);
PORTD=l;
Delay_us(300);
l= l << 1;
Ispis tekstualnih poruka na LED displeju
- 22 -
//procedura je indetična za sva slova, kao i za slovo “A”
PORTD=0x00;
return;
//slovo b
void bs(int *pr)
unsigned int c[8];
unsigned int pom[8];
short int i,j,k,l;
c[0]=0x007C;
c[1]=0x0044;
c[2]=0x0044;
c[3]=0x007E;
c[4]=0x0042;
c[5]=0x0042;
c[6]=0x0042;
c[7]=0x007E;
for(i=0;i<=7;i++)
for(j=0;j<=7;j++)
pom[j]=c[j] & 0x0100;
pom[j]= pom[j] >> 8;
*(pr+j)= *(pr+j) << 1;
*(pr+j)= *(pr+j) | pom[j];
c[j]= c[j] << 1;
for(j=0;j<=100;j++)
l=0x01;
for(k=0;k<=7;k++)
PORTD=0x00;
PORTB=*(pr+k);
PORTD=l;
Delay_us(300);
l= l << 1;
PORTD=0x00;
return;
//slovo c
void cs(int *pr)
unsigned int c[8];
unsigned int pom[8];
Ispis tekstualnih poruka na LED displeju
- 23 -
short int i,j,k,l;
c[0]=0x007C;
c[1]=0x0040;
c[2]=0x0040;
c[3]=0x0040;
c[4]=0x0040;
c[5]=0x0040;
c[6]=0x0040;
c[7]=0x007C;
for(i=0;i<=7;i++)
for(j=0;j<=7;j++)
pom[j]=c[j] & 0x0100;
pom[j]= pom[j] >> 8;
*(pr+j)= *(pr+j) << 1;
*(pr+j)= *(pr+j) | pom[j];
c[j]= c[j] << 1;
for(j=0;j<=100;j++)
l=0x01;
for(k=0;k<=7;k++)
PORTD=0x00;
PORTB=*(pr+k);
PORTD=l;
Delay_us(300);
l= l << 1;
PORTD=0x00;
return;
//slovo d
void ds(int *pr)
unsigned int c[8];
unsigned int pom[8];
short int i,j,k,l;
c[0]=0x007C;
c[1]=0x0042;
c[2]=0x0042;
c[3]=0x0042;
c[4]=0x0042;
c[5]=0x0042;
c[6]=0x0042;
Ispis tekstualnih poruka na LED displeju
- 24 -
c[7]=0x007C;
for(i=0;i<=7;i++)
for(j=0;j<=7;j++)
pom[j]=c[j] & 0x0100;
pom[j]= pom[j] >> 8;
*(pr+j)= *(pr+j) << 1;
*(pr+j)= *(pr+j) | pom[j];
c[j]= c[j] << 1;
for(j=0;j<=100;j++)
l=0x01;
for(k=0;k<=7;k++)
PORTD=0x00;
PORTB=*(pr+k);
PORTD=l;
Delay_us(300);
l= l << 1;
PORTD=0x00;
return;
//slovo e
void es(int *pr)
unsigned int c[8];
unsigned int pom[8];
short int i,j,k,l;
c[0]=0x007E;
c[1]=0x0040;
c[2]=0x0040;
c[3]=0x007C;
c[4]=0x0040;
c[5]=0x0040;
c[6]=0x0040;
c[7]=0x007E;
for(i=0;i<=7;i++)
for(j=0;j<=7;j++)
pom[j]=c[j] & 0x0100;
pom[j]= pom[j] >> 8;
*(pr+j)= *(pr+j) << 1;
*(pr+j)= *(pr+j) | pom[j];
c[j]= c[j] << 1;
Ispis tekstualnih poruka na LED displeju
- 25 -
for(j=0;j<=100;j++)
l=0x01;
for(k=0;k<=7;k++)
PORTD=0x00;
PORTB=*(pr+k);
PORTD=l;
Delay_us(300);
l= l << 1;
PORTD=0x00;
return;
//slovo f
void fs(int *pr)
unsigned int c[8];
unsigned int pom[8];
short int i,j,k,l;
c[0]=0x007C;
c[1]=0x0040;
c[2]=0x0040;
c[3]=0x0078;
c[4]=0x0040;
c[5]=0x0040;
c[6]=0x0040;
c[7]=0x0040;
for(i=0;i<=7;i++)
for(j=0;j<=7;j++)
pom[j]=c[j] & 0x0100;
pom[j]= pom[j] >> 8;
*(pr+j)= *(pr+j) << 1;
*(pr+j)= *(pr+j) | pom[j];
c[j]= c[j] << 1;
for(j=0;j<=100;j++)
l=0x01;
for(k=0;k<=7;k++)
PORTD=0x00;
PORTB=*(pr+k);
PORTD=l;
Delay_us(300);
Ispis tekstualnih poruka na LED displeju
- 26 -
l= l << 1;
PORTD=0x00;
return;
//slovo g
void gs(int *pr)
unsigned int c[8];
unsigned int pom[8];
short int i,j,k,l;
c[0]=0x007E;
c[1]=0x0040;
c[2]=0x0040;
c[3]=0x004E;
c[4]=0x0042;
c[5]=0x0042;
c[6]=0x0042;
c[7]=0x007E;
for(i=0;i<=7;i++)
for(j=0;j<=7;j++)
pom[j]=c[j] & 0x0100;
pom[j]= pom[j] >> 8;
*(pr+j)= *(pr+j) << 1;
*(pr+j)= *(pr+j) | pom[j];
c[j]= c[j] << 1;
for(j=0;j<=100;j++)
l=0x01;
for(k=0;k<=7;k++)
PORTD=0x00;
PORTB=*(pr+k);
PORTD=l;
Delay_us(300);
l= l << 1;
PORTD=0x00;
return;
//slovo h
void hs(int *pr)
unsigned int c[8];
Ispis tekstualnih poruka na LED displeju
- 27 -
unsigned int pom[8];
short int i,j,k,l;
c[0]=0x0042;
c[1]=0x0042;
c[2]=0x0042;
c[3]=0x007E;
c[4]=0x0042;
c[5]=0x0042;
c[6]=0x0042;
c[7]=0x0042;
for(i=0;i<=7;i++)
for(j=0;j<=7;j++)
pom[j]=c[j] & 0x0100;
pom[j]= pom[j] >> 8;
*(pr+j)= *(pr+j) << 1;
*(pr+j)= *(pr+j) | pom[j];
c[j]= c[j] << 1;
for(j=0;j<=100;j++)
l=0x01;
for(k=0;k<=7;k++)
PORTD=0x00;
PORTB=*(pr+k);
PORTD=l;
Delay_us(300);
l= l << 1;
PORTD=0x00;
return;
//slovo i
void is(int *pr)
unsigned int c[8];
unsigned int pom[8];
short int i,j,k,l;
c[0]=0x007E;
c[1]=0x0018;
c[2]=0x0018;
c[3]=0x0018;
c[4]=0x0018;
c[5]=0x0018;
Ispis tekstualnih poruka na LED displeju
- 28 -
c[6]=0x0018;
c[7]=0x007E;
for(i=0;i<=7;i++)
for(j=0;j<=7;j++)
pom[j]=c[j] & 0x0100;
pom[j]= pom[j] >> 8;
*(pr+j)= *(pr+j) << 1;
*(pr+j)= *(pr+j) | pom[j];
c[j]= c[j] << 1;
for(j=0;j<=100;j++)
l=0x01;
for(k=0;k<=7;k++)
PORTD=0x00;
PORTB=*(pr+k);
PORTD=l;
Delay_us(300);
l= l << 1;
PORTD=0x00;
return;
//slovo j
void js(int *pr)
unsigned int c[8];
unsigned int pom[8];
short int i,j,k,l;
c[0]=0x001E;
c[1]=0x0002;
c[2]=0x0002;
c[3]=0x0002;
c[4]=0x0002;
c[5]=0x0002;
c[6]=0x0022;
c[7]=0x003E;
for(i=0;i<=7;i++)
for(j=0;j<=7;j++)
pom[j]=c[j] & 0x0100;
pom[j]= pom[j] >> 8;
*(pr+j)= *(pr+j) << 1;
*(pr+j)= *(pr+j) | pom[j];
Ispis tekstualnih poruka na LED displeju
- 29 -
c[j]= c[j] << 1;
for(j=0;j<=100;j++)
l=0x01;
for(k=0;k<=7;k++)
PORTD=0x00;
PORTB=*(pr+k);
PORTD=l;
Delay_us(300);
l= l << 1;
PORTD=0x00;
return;
//slovo k
void ks(int *pr)
unsigned int c[8];
unsigned int pom[8];
short int i,j,k,l;
c[0]=0x0042;
c[1]=0x0044;
c[2]=0x0048;
c[3]=0x0070;
c[4]=0x0050;
c[5]=0x0048;
c[6]=0x0044;
c[7]=0x0042;
for(i=0;i<=7;i++)
for(j=0;j<=7;j++)
pom[j]=c[j] & 0x0100;
pom[j]= pom[j] >> 8;
*(pr+j)= *(pr+j) << 1;
*(pr+j)= *(pr+j) | pom[j];
c[j]= c[j] << 1;
for(j=0;j<=100;j++)
l=0x01;
for(k=0;k<=7;k++)
PORTD=0x00;
PORTB=*(pr+k);
PORTD=l;
Ispis tekstualnih poruka na LED displeju
- 30 -
Delay_us(300);
l= l << 1;
PORTD=0x00;
return;
// slovo l
void ls(int *pr)
unsigned int c[8];
unsigned int pom[8];
short int i,j,k,l;
c[0]=0x0040;
c[1]=0x0040;
c[2]=0x0040;
c[3]=0x0040;
c[4]=0x0040;
c[5]=0x0040;
c[6]=0x0040;
c[7]=0x007E;
for(i=0;i<=7;i++)
for(j=0;j<=7;j++)
pom[j]=c[j] & 0x0100;
pom[j]= pom[j] >> 8;
*(pr+j)= *(pr+j) << 1;
*(pr+j)= *(pr+j) | pom[j];
c[j]= c[j] << 1;
for(j=0;j<=100;j++)
l=0x01;
for(k=0;k<=7;k++)
PORTD=0x00;
PORTB=*(pr+k);
PORTD=l;
Delay_us(300);
l= l << 1;
PORTD=0x00;
return;
//slovo m
void ms(int *pr)
Ispis tekstualnih poruka na LED displeju
- 31 -
unsigned int c[8];
unsigned int pom[8];
short int i,j,k,l;
c[0]=0x0066;
c[1]=0x0066;
c[2]=0x005A;
c[3]=0x005A;
c[4]=0x0042;
c[5]=0x0042;
c[6]=0x0042;
c[7]=0x0042;
for(i=0;i<=7;i++)
for(j=0;j<=7;j++)
pom[j]=c[j] & 0x0100;
pom[j]= pom[j] >> 8;
*(pr+j)= *(pr+j) << 1;
*(pr+j)= *(pr+j) | pom[j];
c[j]= c[j] << 1;
for(j=0;j<=100;j++)
l=0x01;
for(k=0;k<=7;k++)
PORTD=0x00;
PORTB=*(pr+k);
PORTD=l;
Delay_us(300);
l= l << 1;
PORTD=0x00;
return;
// slovo n
void ns(int *pr)
unsigned int c[8];
unsigned int pom[8];
short int i,j,k,l;
c[0]=0x0062;
c[1]=0x0062;
c[2]=0x0062;
c[3]=0x0062;
c[4]=0x0052;
Ispis tekstualnih poruka na LED displeju
- 32 -
c[5]=0x004A;
c[6]=0x0046;
c[7]=0x0042;
for(i=0;i<=7;i++)
for(j=0;j<=7;j++)
pom[j]=c[j] & 0x0100;
pom[j]= pom[j] >> 8;
*(pr+j)= *(pr+j) << 1;
*(pr+j)= *(pr+j) | pom[j];
c[j]= c[j] << 1;
for(j=0;j<=100;j++)
l=0x01;
for(k=0;k<=7;k++)
PORTD=0x00;
PORTB=*(pr+k);
PORTD=l;
Delay_us(300);
l= l << 1;
PORTD=0x00;
return;
//slovo o
void os(int *pr)
unsigned int c[8];
unsigned int pom[8];
short int i,j,k,l;
c[0]=0x007E;
c[1]=0x0042;
c[2]=0x0042;
c[3]=0x0042;
c[4]=0x0042;
c[5]=0x0042;
c[6]=0x0042;
c[7]=0x007E;
for(i=0;i<=7;i++)
for(j=0;j<=7;j++)
pom[j]=c[j] & 0x0100;
pom[j]= pom[j] >> 8;
*(pr+j)= *(pr+j) << 1;
Ispis tekstualnih poruka na LED displeju
- 33 -
*(pr+j)= *(pr+j) | pom[j];
c[j]= c[j] << 1;
for(j=0;j<=100;j++)
l=0x01;
for(k=0;k<=7;k++)
PORTD=0x00;
PORTB=*(pr+k);
PORTD=l;
Delay_us(300);
l= l << 1;
PORTD=0x00;
return;
// slovo p
void ps(int *pr)
unsigned int c[8];
unsigned int pom[8];
short int i,j,k,l;
c[0]=0x007C;
c[1]=0x0044;
c[2]=0x0044;
c[3]=0x0044;
c[4]=0x007C;
c[5]=0x0040;
c[6]=0x0040;
c[7]=0x0040;
for(i=0;i<=7;i++)
for(j=0;j<=7;j++)
pom[j]=c[j] & 0x0100;
pom[j]= pom[j] >> 8;
*(pr+j)= *(pr+j) << 1;
*(pr+j)= *(pr+j) | pom[j];
c[j]= c[j] << 1;
for(j=0;j<=100;j++)
l=0x01;
for(k=0;k<=7;k++)
PORTD=0x00;
PORTB=*(pr+k);
Ispis tekstualnih poruka na LED displeju
- 34 -
PORTD=l;
Delay_us(300);
l= l << 1;
PORTD=0x00;
return;
//slovo r
void rs(int *pr)
unsigned int c[8];
unsigned int pom[8];
short int i,j,k,l;
c[0]=0x007C;
c[1]=0x0044;
c[2]=0x0044;
c[3]=0x0044;
c[4]=0x007C;
c[5]=0x0050;
c[6]=0x0048;
c[7]=0x0044;
for(i=0;i<=7;i++)
for(j=0;j<=7;j++)
pom[j]=c[j] & 0x0100;
pom[j]= pom[j] >> 8;
*(pr+j)= *(pr+j) << 1;
*(pr+j)= *(pr+j) | pom[j];
c[j]= c[j] << 1;
for(j=0;j<=100;j++)
l=0x01;
for(k=0;k<=7;k++)
PORTD=0x00;
PORTB=*(pr+k);
PORTD=l;
Delay_us(300);
l= l << 1;
PORTD=0x00;
return;
// slovo s
Ispis tekstualnih poruka na LED displeju
- 35 -
void ss(int *pr)
unsigned int c[8];
unsigned int pom[8];
short int i,j,k,l;
c[0]=0x0078;
c[1]=0x0040;
c[2]=0x0040;
c[3]=0x0078;
c[4]=0x0008;
c[5]=0x0008;
c[6]=0x0008;
c[7]=0x0078;
for(i=0;i<=7;i++)
for(j=0;j<=7;j++)
pom[j]=c[j] & 0x0100;
pom[j]= pom[j] >> 8;
*(pr+j)= *(pr+j) << 1;
*(pr+j)= *(pr+j) | pom[j];
c[j]= c[j] << 1;
for(j=0;j<=100;j++)
l=0x01;
for(k=0;k<=7;k++)
PORTD=0x00;
PORTB=*(pr+k);
PORTD=l;
Delay_us(300);
l= l << 1;
PORTD=0x00;
return;
//slovo t
void ts(int *pr)
unsigned int c[8];
unsigned int pom[8];
short int i,j,k,l;
c[0]=0x007E;
c[1]=0x0018;
c[2]=0x0018;
c[3]=0x0018;
Ispis tekstualnih poruka na LED displeju
- 36 -
c[4]=0x0018;
c[5]=0x0018;
c[6]=0x0018;
c[7]=0x0018;
for(i=0;i<=7;i++)
for(j=0;j<=7;j++)
pom[j]=c[j] & 0x0100;
pom[j]= pom[j] >> 8;
*(pr+j)= *(pr+j) << 1;
*(pr+j)= *(pr+j) | pom[j];
c[j]= c[j] << 1;
for(j=0;j<=100;j++)
l=0x01;
for(k=0;k<=7;k++)
PORTD=0x00;
PORTB=*(pr+k);
PORTD=l;
Delay_us(300);
l= l << 1;
PORTD=0x00;
return;
// slovo u
void us(int *pr)
unsigned int c[8];
unsigned int pom[8];
short int i,j,k,l;
c[0]=0x0042;
c[1]=0x0042;
c[2]=0x0042;
c[3]=0x0042;
c[4]=0x0042;
c[5]=0x0042;
c[6]=0x0042;
c[7]=0x007E;
for(i=0;i<=7;i++)
for(j=0;j<=7;j++)
pom[j]=c[j] & 0x0100;
pom[j]= pom[j] >> 8;
Ispis tekstualnih poruka na LED displeju
- 37 -
*(pr+j)= *(pr+j) << 1;
*(pr+j)= *(pr+j) | pom[j];
c[j]= c[j] << 1;
for(j=0;j<=100;j++)
l=0x01;
for(k=0;k<=7;k++)
PORTD=0x00;
PORTB=*(pr+k);
PORTD=l;
Delay_us(300);
l= l << 1;
PORTD=0x00;
return;
// slovo v
void vs(int *pr)
unsigned int c[8];
unsigned int pom[8];
short int i,j,k,l;
c[0]=0x0042;
c[1]=0x0042;
c[2]=0x0042;
c[3]=0x0042;
c[4]=0x0024;
c[5]=0x0024;
c[6]=0x0024;
c[7]=0x0018;
for(i=0;i<=7;i++)
for(j=0;j<=7;j++)
pom[j]=c[j] & 0x0100;
pom[j]= pom[j] >> 8;
*(pr+j)= *(pr+j) << 1;
*(pr+j)= *(pr+j) | pom[j];
c[j]= c[j] << 1;
for(j=0;j<=100;j++)
l=0x01;
for(k=0;k<=7;k++)
PORTD=0x00;
Ispis tekstualnih poruka na LED displeju
- 38 -
PORTB=*(pr+k);
PORTD=l;
Delay_us(300);
l= l << 1;
PORTD=0x00;
return;
// slovo z
void zs(int *pr)
unsigned int c[8];
unsigned int pom[8];
short int i,j,k,l;
c[0]=0x007E;
c[1]=0x0002;
c[2]=0x0004;
c[3]=0x0008;
c[4]=0x0010;
c[5]=0x0020;
c[6]=0x0040;
c[7]=0x007E;
for(i=0;i<=7;i++)
for(j=0;j<=7;j++)
pom[j]=c[j] & 0x0100;
pom[j]= pom[j] >> 8;
*(pr+j)= *(pr+j) << 1;
*(pr+j)= *(pr+j) | pom[j];
c[j]= c[j] << 1;
for(j=0;j<=100;j++)
l=0x01;
for(k=0;k<=7;k++)
PORTD=0x00;
PORTB=*(pr+k);
PORTD=l;
Delay_us(300);
l= l << 1;
PORTD=0x00;
return;
Ispis tekstualnih poruka na LED displeju
- 39 -
void space(int *pr)
unsigned int c[8];
unsigned int pom[8];
short int i,j,k,l;
c[0]=0x0000;
c[1]=0x0000;
c[2]=0x0000;
c[3]=0x0000;
c[4]=0x0000;
c[5]=0x0000;
c[6]=0x0000;
c[7]=0x0000;
for(i=0;i<=5;i++)
for(j=0;j<=7;j++)
pom[j]=c[j] & 0x0100;
pom[j]= pom[j] >> 8;
*(pr+j)= *(pr+j) << 1;
*(pr+j)= *(pr+j) | pom[j];
c[j]= c[j] << 1;
for(j=0;j<=100;j++)
l=0x01;
for(k=0;k<=7;k++)
PORTD=0x00;
PORTB=*(pr+k);
PORTD=l;
Delay_us(300);
l= l << 1;
PORTD=0x00;
return;
Ispis tekstualnih poruka na LED displeju
- 40 -
Dodatak B:
Primer realizacije aplikacja “trougao” i “dijagonala”.
- Aplikacija “trougao”.
Listing koda:
void main()
short int i,k;
TRISB=0x00;// definisanje porta B kao izlazni
TRISD=0x00;// definisanje porta D kao izlazni
PORTB=0x00;//postavljanje inicijalnih vrednosti na port B
PORTD=0x00;//postavljanje inicijalnih vrednosti na port D
while(1) // beskonačna petlja
k=0x01; //promenljiva za izbor vrste
PORTB=0x01;
Delay_us(300);
for(i=0;i<=7;i++)//petlja za osvežavanje vrsta
PORTD=k;
Delay_us(300); );// funkcija za kašnjenj radi izbegavanje
//flicker efekta
PORTD=0x00;
PORTB=PORTB << 1;//pomeranje vrednsti porta B za jedno
//mesto
PORTB=PORTB | 0x01;//maskiranje bitova
k=k << 1;
Ispis tekstualnih poruka na LED displeju
- 41 -
- Aplikacija “dijagonala”.
Listing koda:
void main()
short int i,k;
TRISB=0x00; //definisanje porta B kao izlazni
TRISD=0x00; // definisanje porta D kao izlazni
PORTB=0x00;//postavljanje inicijalnih vrednosti na port B
PORTD=0x00;//postavljanje inicijalnih vrednosti na port D
while(1) //beskonačna petlja
PORTB=0x01;//dodela početne vrednosti za port B
k=0x01; //promenljiva za izbor vrste
for(i=0;i<=7;i++)//petlja za osvežavanje vrsta
PORTD=k; // dodela promenljive portu
Delay_us(300);// funkcija za kašnjenj radi izbegavanje
//flicker efekta
PORTD=0x00;
PORTB= PORTB << 1;// pomeranje vrednsti porta B za jedno
//mesto
k=k << 1;// pomeranje vrednosti k za jedno mesto
Ispis tekstualnih poruka na LED displeju
- 42 -
Literatura
Dogan Ibrahim-Microcontroller Projects in C for the 8051
Muhammad Ali Mazidi, Rolan D. Mckinlay, Danny Causey-PIC microcontroller and Embedded
Systems
Barnet Cox & O.Cull- Embedded C Programming and the Microchip PIC
Mikroelektronika-UNI-DS3 razvojni sisitem,Korisničko uputstvo
Milan Verle-PIC kontroleri
PIC16F887, Datasheet- Dostupno na www.microchip.com
ULN2308,Datasheet-Dostupno na www.alldatasheet.com