43
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 displejues.elfak.ni.ac.rs/Papers/IStojanovic - MLazic - LED displej - embeded.pdfIspis tekstualnih poruka na LED displeju - 3 - Slika 1.2 Ilustracija

  • Upload
    others

  • View
    10

  • Download
    0

Embed Size (px)

Citation preview

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

- 7 -

Slika 2.3 Algoritam funkcije “Funkcija”.

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

- 10 -

Slika 3.1 Prikaz pinova

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