Se afișează postările cu eticheta LCD. Afișați toate postările
Se afișează postările cu eticheta LCD. Afișați toate postările

duminică, 28 august 2011

USART

Prezentare generală
USART(Universal synchronous/asynchronous receiver/transmitter) este un standard de comunicare serială între diverse dispozitive cum ar fi comunicarea între calculator(prin portul serial COM) şi alte dispozitive.Acesta se poate folosi pentru comunicare în conjuncţe cu standardele RS-232,RS-422 sau RS-485 însă în aplicaţiile noastre vom folosi doar standardul RS-232 pentru comunicarea cu PC-ul.Comunicarea serială presupune folosirea unei singure legături dacă ea este unidirecţională, adică există un trasmiţător şi un receptor sau invers.Dacă este bidirecţională avem nevoie de două legături , pe o legătură realizându-se transmisia iar pe alta recepţia.Dacă se foloseşte modul sincron pe lâng[ legăturile de transmisie a datelor se mai foloseşte o legătură prin care se stabileşte acelaş semnal de tact între dispozitive.Schema de principiu este următoarea:
Dispozitivul care transmite date se numeşte master iar cel care primeşte se numeşte slave.De obicei masterul stabileşte formatul cuvântului şi frecvenţa ceasului iar datele furnizate se vor obţine la pinul TX.Slave-ul va trebui configurat astfel încât să primească cuvinte care au acelaş format cu cele generate de master şi să funcţioneze la aceeaşi frecvenţă.Pinul prin care un dispozitiv primeşte date este pinul RX.

Viteza de transmisie a datelor se măsoară in BAUD , unitate care reprezintă numărul de biţi transmişi într-o secundă.Această viteză trebuie să fie egală între dispozitivele care comunică serial.La transmisia asincronă pot apărea diverse erori deoarece frecvenţele de tact pot fi puţin diferite chiar dacă ele sunt setate aparent egal.Acest neajuns este înlăturat la transmisia sincronă deoarece semnalul de tact generat de master este transmis slave-ului prin legătura XCK.

Momentan ne vom concentra pe transmisia asincronă deoarece ea este cea mai folosită la comunicarea între dispozitivele periferice şi PC,având doar două legături.

Transmisia asincronă
După cum am văzut mai sus pentru ca această transmisie să fie bidirecţională trebuie să folosim două conexiuni, una prin care trimitem şi una prin care primim datele. Cuvântul care este trimis este format din două părţi , o parte care reprezintă datele iar altă parte care reprezintă codul de verificare:
Orce cuvânt începe cu un bit de start care trebuie să fie 0.Următorii biţi sunt biţii de date care pot avea o lungime între 5 şi 8 biţi iar la sfârşit avem un bit de stop care întodeauna trebuie să fie 1.
Microcontrolerul ATMega8 poate trimite următorul format de cuvânt:
Primul bit St reprezintă bitul de start.Lungimea cuvântului de date poate fi cuprinsă între 5 şi 9 biţi.Pentru o mai bună securitate în transmisie se poate seta la sfârşitul cuvântului de date un bit de paritate care verifică paritatea biţilor de date.Sfârşitul cuvântului poate fi reprezentat de unul sau doi biţi care trebuie să aibă valoarea 1.Transmiţătorul sau receptorul sunt libere doar atunci când s-au transmis biţii de stop şi sunt în stare Idle, stare care este reprezentată de 1 logic pe linile de conexiune.

La configurarea a două dispozitive care vor comunica serial asicron trebuie să avem grijă ca viteza de transfer să fie egală la transmisie şi recepţie şi să avem aceeaşi lungime a cuvântului de date.De asemenea trebuie totuşi să stabilim dacă folosim verificarea parităţii şi dacă folosim unul sau doi biţi de stop.

Principala sursă de eroare poate apărea atunci când configurarea între dispozitive nu este făcută corect, aceasta fiind o problemă de incompatibilitate în comunicare.Alte erori pot fi generate pe linile de transmisie, ele putând fi detectate prin bitul de paritate sau prin biţii de stop.

La transmiterea sau recepţia a mai multor cuvinte consecutive trebuie verificat dacă USART-ul a realizat operaţia completă de trimitere sau citire, altfel poate apărea o altă eroare de transmisie generată de data asta de partea soft.

Schimbul de date se face prin doi regiştrii, unul în care se înscriu datele şi unul de şiftare prin care se transmite cuvântul.În ATMega8 datele se scriu sau se citesc din registrul UDR.De exemplu pentru transmiterea unui caracter char pe 8 biţi trebuie să scriem caracterul în UDR.USART-ul va trece automat conţinutul lui UDR în registrul serial apoi îl va transmite pe linia de legătură celuilalt dispozitiv care va prelua datele tot în registrul serial al cărui conţinut va fi transmis registrului UDR.Registrul serial,dacă dispozitivul este configurat ca transmiţător, va pune pe lângă date şi bitul de start , bitul de paritate şi bitul/biţii de final.Dacă dispozitivul este configurat ca receptor, registrul serial va verifica dacă transmisia este corectă şi dacă da datele cuvântului vor fi copiate în UDR.

Regiştrii folosiţi în ATMega8 pentru comunicarea serială sunt următorii:
-Registrul UDR care are rolul de a stoca datele necesare pentru transmisie sau recepţie:
Dacă se realizează transmisia, datele sunt stocate în TXB iar dacă se realizează recepţia datele se găsesc în RXB.

-Registrul UCSRA:
Bitul 7 –RXC- indică starea registrului de recepţiei.Dacă încă se mai primesc date valoarea lui este 1 iar dacă recepţia a fost efectuată complet valoarea lui este 0.

Bitul 6 –TXC- indică starea registrului de transmisiei.Dacă încă se mai transmit date valoarea lui este 1 iar dacă transmisia a fost efectuată complet valoarea lui este 0.

Bitul 5 – UDRE – indică dacă UDR poate fi citit sau scris.Dacă este 1 UDR poate fi scris, dacă este 0 nu se pot efectua operaţii cu acest registru.
Aceşti 3 biţi pot genera întreruperi care pot fi tratate în rutine speciale .

Bitul 4 – FE – Detectează dacă există erori la transmiterea cuvântului verificând bitul/biţii de final.Dacă acest/aceşti biţi au o valoare diferită de 1 atunci bitul FF ia valoarea 1.Dacă totul este în regulă atunci valoarea lui FE va fi 0.

Bitul 3 –DOR - Detectează dacă există erori de suprascrierea USAR-tului.De exemplu la recepţie poate apărea o astfel de eroare dacă UDR şi registrul serial este plin şi alt caracter este pe cale de a fi primit.FE este 1 dacă s-a semnalat o astfel de eroare şi 0 dacă nu avem o eroare de acest fel.

Bitul 2 – PE – are rolul de a detecta eroarea de paritate.Dacă s-a detectat o astfel de eroare ia valoarea 1 iar dacă nu valoarea lui va fi 0.

Bitul 1 – U2X – Acest bit este 1 dacă dorim să dublăm viteza de transmisie în modul asicron şi 0 dacă se foloseşte viteza normală.Acest bit trebuie să aibă întotdeauna valoarea 0 dacă este folosit modul sincron.

Bitul 0 – U2X- Se setează 1 dacă se foloseşte comunicarea multiprocesor şi 0 dacă se foloseşte comunicarea uniprocesor.In exemplele ce vor urma îl vom seta ca 0.

-Registrul UCSRB:
-Bitul 7-RXCIE – 1 setează generarea unei întreruperi la terminarea recepţiei,0 întreruperea nu este flosită.

-Bitul 6-RXCIE – 1 setează generarea unei întreruperi la terminarea transmisiei,0 întreruperea nu este flosită.

-Bitul 5-RXCIE – 1 setează generarea unei întreruperi atunci când registrul UDRIE poate fi folosit,0 întreruperea nu este folosită.

-Bitul 4- RXEN – 1 setează USART-ul ca receptor.

-Bitul 3- TXEN – 1 setează USART-ul ca Transmiţător.

-Bitul 2- UCSZ2 – se foloseşte împreună cu o parte din biţii registrului UCSRC după cum vom vedea mai jos.

-Bitul 1 – RXB8 – este al 9-lea bit din schimbul de date pe 9 biţi şi se foloseşte la recepţie.

-Bitul 0 – TXB8 – este al 9-lea bit din schimbul de date pe 9 biţi şi se foloseşte la transmisie.

-Registrul UCSRC:
-Bitul 7 –URSEL- se foloseşte pentru selecţia regiştrilor astfel:1 dacă se lucrează cu registrul UCSRC şi 0 dacă se lucrează cu registrul UBBRH.

-Bitul 6 –UMSEL-Prin acest bit se setează modul de funcţionare al USART-ului:1 dacă funcţionează în modul sincron şi 0 dacă funcţionează în modul sincron.

-Bitul 5 şi 4 –UPM1 şi UPM0 – Se folosesc pentru selecţia parităţii:
UPM1 UPM0
00 - Nu se foloseşte bitul de paritate.
01 - Combinaţie rezervată.
10 - Se foloseşte bitul de paritete ca bit par.
11 - Se foloseşte bitul de paritete ca bit impar.

-Bitul 3 –USBS- se foloseşte pentru a seta numărul biţilor care reprezintă sfârşitul cuvântului: 1- se setează doi biţi de stop,0-se setează un singur bit de stop.

-Biţii 2 şi 1– UCSZ1 şi UCSZ0- se folosesc împreună cu UCSZ2 din UCSRB pentru a seta lungimea cunvântului de date:
UCSZ2 UCSZ1 UCSZ0 Lungimea Cuvântului
000 – 5 biţi;
001 – 6 biţi;
010 – 7 biţi;
011 – 8 biţi;
100 – Combinaţie rezervată;
101 – Combinaţie rezervată;
110 – Combinaţie rezervată;
111 – 9 biţi;

-Bitul 0 – UCPOL-Se foloseşte pentru modul sincron şi setează ce front al semnalului de pe linia XCK va fi folosit în transmisie.În modul asincron acesta se setează 0.Valorile pe care le poate lua sunt următoarele:0 – se foloseşte frontul crescător, 1 se foloseşte frontul descrescător.

-Registrul UBRR – Acest registru se foloseşte pentru a seta viteza de transmisie a datelor.

-Bitul 15 – URSEL – trebuie să fie 0 atunci când se efectuează operaţii cu acest registru.
-Biţii 12,13,12 sunt nişte biţi rezervaţi nefolosiţi în acest microcontroler.
-Biţii 11:0 sunt folosiţi pentru a seta viteza de transmisie a datelor.Totuşi setarea se face doar cu biţii cei mai semnificativi, 11:8.Viteza de transmisie a datelor se calculează după formula:
Unde BAUD reprezintă viteza de transmisie măsurată în Baud,f_int reprezită frecvenţa internă a procesorului iar UBBR este valoarea setată în registru.
Eroarea la transmisie se calculează după formula:
În tabelul de mai jos putem urmări ce influenţă are frecvenţa asupra erorii la transmisie:
Următorul exemplu are ca scop schimbul de date între microcontrolerul ATMega8 şi PC.Citirea şi trimiterea de date de la PC la microcontroler o puteţi face cu un program ca HiperTerminal.Datele pe care le va primi microcontrolerul le vom afişa pe un LCD.Transmisia de date se va face asincron ,lungimea cuvântului de date va fi de 8 biţi , vom folosi un singur bit de stop iar viteza de transmisie va fi de 4800 baud.
Programul îl puteţi downloada de la secţiunea Download -USART -Aplicaţie 1.

Înainte de a începe transmisia toate aceste setări vor fi făcute în regiştrii USART-ului după cum urmează:

UCSRA=0x00;
UCSRB=0x98;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x0C;

Schema electrică a aplicaţiei este următoarea:
Pentru a simula PC-ul am folosit o unealtă oferită de Proteus numită Virtual Terminal.Aceasta împreună cu oşciloscopul se găsesc în partea dreaptă a ferestrei la butonul Virtual Instruments Mode.
La secţiunea de generare a codului trebuie să setaţi LCD-ul pe portul D, pinul 0 al portului D ca pin de intrare, pinul 1 al portului D ca ieşire şi USART-ul după cum urmează:
Pentru recepţie am folosit întreruperea deoarece dorim să afişăm caracterul pe LCD imediat ce el a fost primit.
În partea de ciclare infinită a programului vom trimite date PC-ului:

while(1)
{
//trimitem toate caracterele ASCII catre computer
caracter ++;
printf("%c",13);
printf("%c",caracter);
delay_ms(150);
};

Observăm că trimiterea de date se face foarte simplu cu ajutorul funcţiei printf().Afişarea caracterelor pe LCD se face în rutina de tratare a întreruperii generate de recepţia datelor după cum urmează:

nr_caractere++;
lcd_putchar(data);
if(nr_caractere > 15)
{
lcd_clear();
nr_caractere = 0;
}

Afişarea se face pe o singură linie.Dacă s-a ajuns să se scrie 16 caractere pe LCD , adică să se completeze prima linie, LCD-ul este curăţat.Dacă simularea funcţionează cum trebuie ar trebui să vă afişeze cam aşa:
Pentru a trimite date microcontrolerului trebuie să daţi click pe Virtual Terminal şi să tastaţi caractere.
Fizic , pentru a se putea realiza conexiunea este nevoie de un integrat MAX232 care face legătura între microcontroler şi cablu serial astfel:
Momentan cam atât despre USART.

Sistemul de întreruperi

Întreruperile într-un microcontroler sunt văzute ca nişte evenimente speciale generate de elementele periferice.Aceste evenimente pot fi reprezentate de apăsarea unui buton, atingerea unei valor a numărătorului,terminarea de citit a unei valori a convertorului analog digital,etc..Toate acestea sunt gestionate de un sistem intern numit sistem de întreruperi , sistem care are rolul de a oferi procesorului informaţii referitoare la natura întreruperii şi de a opri funcţionarea ciclică tratând întreruperea într-o rutină specială. Această rutină are o adresă specială de început.În cazul chip-ului ATMega8 adresele rutinelor de tratare corespunzătoare întreruperilor sunt următoarele:
Prioritatea de tratare a unei întreruperi în cazul în care avem mai multe cereri de întrerupere este marcată de prima coloana, astfel cea mai mare prioritate o are întreruperea generată de semnalul RESET,apoi întreruperea externă INT0 , întreruperea externă INT1 şi tot aşa.Trebuie să precizez că aceste adrese sunt mascate în CodeVisionAVR dar totuşi e bine să ştiţi cum funcţionează modul intern de tratare al întreruperilor.
Momentan voi trata doar întreruperile externe,INT0 şi INT1, deoarece sunt cele mai simple de configurat.
Pentru a putea folosi orce întrerupere trebuie mai întâi să informăm microcontrolerul că întreruperile sunt activate.Acest lucru se face prin comana sei, comandă care în C se poate scrie astfel:
#asm("sei")
Această comandă nu face altceva decât să seteze valoarea 1 în cel mai semnificativ bit,bitul I, din regist SREG,bit care permite folosirea sistemului de întreruperi.
Pentru dezactivarea întreruperilor se foloseşte comanda cli,în C fiind #asm("cli").
Activarea întreruperilor externe se face prin registrul GICR(General Interrupt Control Register) care are următoarea formă:
Pentru a activa întreruperea externă INT0 trebuie să setăm valoarea 1 în locaţia 6 din registru iar pentru activarea întreruperii externe INT1 trebuie setată valoarea 1 în bitul 7.Primii doi biţi ai registrului, IVCE şi IVSEL se folosesc atunci când în memoria microcontrolerului avem o secţiune boot însă în acest tutorial nu o să folosim aşa ceva.Restul biţilor 2-5 nu sunt folosiţi,ei fiind rezervaţi.
După ce am setat ce întreruperi externe sunt folosite, va trebui să setăm în ce moment să se activeze întreruperea.Acest lucru se poate seta prin registrul MCUCR:
Din acest registru doar primii 4 biţi(0-3) sunt atribuiţi întreruperilor externe,primii doi biţi(ISC00 şi ISC01) fiind atribuiţi întruperii INT0 iar biţii 3 şi 4(ISC10 şi ISC11) sunt atribuiţi întruperii INT1.Următoarea configuraţie este valabilă pentru ambele întreruperi încât biţii ISC11/ISC01 şi ISC00/ISC10 pot lua următoarele valori:
ISC11/ISC01 ISC00/ISC10
00- Nivelul de jos al semnalului va genera o cerere de întrerupere.
01- Orce schimbare a formei semnalului va genera o cerere de
întrerupere.
10- Frontul descrescător al semnalului va genera o cerere de
întrerupere.
11- Frontul crescător al semnalului va genera o cerere de întrerupere.

Dacă întreruperea a fost generată ea va fi semnalată în registrul GIFR:
Dacă pe parcursul rulării programului bitul 6 ia valoarea 0 atunci înseamnă că avem o cerere de întrerupere generată de întreruperea externă 0 iar dacă bitul 7 ia valoarea 0 înseamnă că avem o cerere de întrerupere generată de întreruperea externă 1,aceşti biţi având valoarea 1 atâta timp cât nici o cerere nu a fost lansată.Acest registru se verifică pentru a vedrea sursa întreruperii.Ddupă execuţia rutinei de tratare, bitul corespunzător întreruperii îi va fi automat atribuită valoarea 1,lucru necesar pentru a se evita ciclarea la infinit a rutinei.

În exemplul următor voi incrementa 2 variabile prin apăsarea a 2 butoane legate la pinii corespunzători cererii de întrerupere INT0 şi INT1.Valorile variabilelor care contorizează de câte ori au fost apăsate butoanele vor fi afişate pe un LCD.La unul dintre pinii microrontrolerului va fi legat un LED care îşi va schimba starea din aprins în stins şi invers la intervalul de o secundă.Codul programului îl puteţi descărca de la secţiunea Download-Întreruperi-Aplicaţie 1.

Schema electrică a aplicaţiei este următoarea:
Dacă ne uităm la schema chip-ului observăm că pinii portului D,PD2 şi PD3 sunt folosiţi şi ca pini pentru întreruperi acest lucru înpingându-ne să legăm LCD-ul la portul B.LED-ul îl vom lega la pinul 0 al portului D.Înainte de generarea programului în CodeVision AVR, vom seta LCD-ul pe portul B ,pinul PD0 ca pin de ieşire iar pentru setarea întreruperilor externe vom merge la External IRQ.Vom selecta ambele întreruperi iar în dreptul lor vom alege Rising Edge,adică se va lansa o cerere de întrerupere la trecerea semnalului de intrare de la valoarea 0 la valoarea 1:
Pentru această configurare programul va seta regiştrii de mai sus cu următoarele valori:
GICR =0b11000000 – se activează ambele întreruperi INT0 şi INT1;
MCUCR = 0b00001111 - se vor semnala cereri de întrerupere la trecerea semnalului din starea 0 în starea 1;

După ce aţi generat programul veţi observa că două noi funcţii au fost generate:
interrupt [EXT_INT0] void ext_int0_isr(void) şi interrupt [EXT_INT1] void ext_int1_isr(void) funcţii prin care vom trata apariţia întreruperilor.Codul din interiorul funcţiilor care tratează apăsarea unui buton este următorul:

interrupt
[EXT_INT0] void ext_int0_isr(void)
{
int0++; //la apasare se incrementeaza variabila int0
itoa(int0,convert); //convertim valoarea lui int0 in sir de caractere
strcpy(linie1,end); //atribuim sirului linie1 valoarea '\0'
strcat(linie1,in1); //adaugam la sirul linie1 textul"INT0="
strcat(linie1,convert);//adaugam la sirul linie1 valoarea variabilei int0
lcd_gotoxy(0,0); //mutarea cursorului in LCD la linia 0 coloana 0
lcd_puts(linie1); //afisarea datelor pe LCD
}
interrupt [EXT_INT1] void ext_int1_isr(void)
{
int1++; //la apasare se incrementeaza variabila int1
itoa(int1,convert); //convertim valoarea lui int1 in sir de caractere
strcpy(linie2,end); //atribuim sirului linie1 valoarea '\0'
strcat(linie2,in2); //adaugam la sirul linie1 textul"INT1="
strcat(linie2,convert);//adaugam la sirul linie1 valoarea variabilei int1
lcd_gotoxy(0,1); //mutarea cursorului in LCD la linia 1 coloana 0
lcd_puts(linie2); //afisarea datelor pe LCD
}

In aceste funcţii pe lângă incrementare am convertit variabilele corespunzătoare întreruperilor, din short în sir de caractere, am concatenat şirurile de caractere care conţin sursele întreruperilor şi valorile variabilelor transformate în şir de caractere şi apoi le-am afişat pe LCD.Variabilele cu care am lucrat în aceste funcţii sunt declarate în partea de declarare a variabilelor globale:

unsigned short int0=0,int1=0;
char in1[6] = "INT0=";
char in2[6] = "INT1=";
char convert[4],end[1]="";
char linie1[16],linie2[16];

Este necesară declararea lungimii şirurilor deoarece microcontrolerul nu poate aloca dinamic spaţii de memorie în memoria program de tip flash.
În bucla infinită while avem doar codul care va aprinde şi va stinge LED-ul după o secundă:

while (1)
{
PORTD = 0x00;
delay_ms(1000);
PORTD = 0x01;
delay_ms(1000);
};

Pentru a folosi funcţiile de concatenare şi copiere (strcat şi strcpy) a fost necesară includerea bibliotecii string.h.Pentru conversia din short în şir de caractere,funcţia itoa, am inclus biblioteca stdlib.h.

Poate că vă întrebaţi care e scopul folosirii întreruperilor pentru această aplicaţie când puteam să folosim doar citirea normală la nivel de port.Totuşi dacă veţi încerca să dezvoltaţi aplicaţia fără întreruperi veţi observa că sunt situaţii în care apăsaţi butoanele şi variabilele nu se incrementează.Acest lucru se întâmplă deoarece există situaţia în care programul aşteaptă să treacă o secundă iar dacă se apasă butonul şi se eliberează în acest timp,apăsarea nu este contorizată.Folosind întreruperile se elimină acest neajuns.
Funcţionarea fizică a aplicaţiei o puteţi vedea mai jos:

sâmbătă, 27 august 2011

Afişajul LCD

Până acum ieşirile microcontrolerului reprezentau nişte LED-uri care puteau lua două valori, 1 sau 0.Acest mod de afişare a informaţiilor de ieşire ale unui microcontroler nu este întotdeauna mulţumitor deoarece există cazuri în care dorim să afişăm un număr sau un text.Acest lucru se poate realiza cu ajutorul unui afişaj LCD.Dimensiunea LCD-ului pe care îl vom folosi în acest tutorial este de 2 linii şi 16 coloane şi se numeşte LM016L.Acesta se alimentează cu 5 volţi şi permite scrierea caracterelor alfanumerice principale.

Transferul de date între microcontroler şi LCD se poate face pe 4 sau 8 biţi printr-un bus de date.Pe lângă linile de date vom avea nevoie şi de 3 linii de control:
-E(Enable) care permite sau nu transmiterea de date şi comenzi.Setând acestă linie 1 poate începe schimbul de date şi comenzi între LCD şi microcontroler.
-R/W (Read/Write) are rolul de a stabili direcţia datetelor,0 fiind pentru scrierea datelor iar 1 fiind pentru citirea datelor din LCD.
-RS(Register Selec) foloseşte la selectarea regiştrilor interni ai LCD-ului.Dacă ia valoarea 0 înseamnă că trimitem LCD-ului o instrucţiune iar dacă scriem valoarea 1 înseamă că trimitem date.
De exemplu pentru scrierea unor date în LCD trebuie ca: E=1,R/W=0,RS=1.
Toate aceste lucruri sunt mascate în CodeVision AVR singurul lucru pe care trebuie să îi facem este să setăm la începutul proiectului portul prin care realizăm conexiunea LCD-ului cu microcontrolerul şi să includem biblioteca lcd.h.Se foloseşte trasferul de date pe 4 biţi deoarece această metodă salvează 4 pini ai microcontrolerului.Legarea pinilor unui port cu pinii LCD-ului se face în felul următor:

RS (pin4)--------bit 0
RD (pin 5)--------bit 1
EN (pin 6)--------bit 2
DB4 (pin 11)-----bit 4
DB5 (pin 12)-----bit 5
DB6 (pin 13)-----bit 6
DB7 (pin 14)-----bit 7

Funcţiile cele mai utilizate pentru controlul şi scrierea LCD-ului sunt următoarele:

unsigned char lcd_init(unsigned char lcd_columns)– realizează iniţializarea LCD-ului, lcd_columns reprezentând numărul de coloane ale LCD-ului, în cazul nostru 16;

void _lcd_ready(void) – aşteaptă până când lcd-ul este gata să primească date.Avem nevoie de această funcţie deoarece LCD-ului îi trebuie un timp de iniţializare după ce a fost pus în funcţiune;

void lcd_clear(void) – şterge tot ce este scris pe LCD şi duce cursorul la linia şi coloana 0;

void lcd_gotoxy(unsigned char x, unsigned char y) – setează cursorul la poziţia x,y.Aţienie, x reprezintă coloana iar y reprezintă linia;

void lcd_putchar(char c) – afişează un caracter la poziţia x,y curentă.Dacă avem mai multe comenzi de acest gen nu însemnă că va scrie caracterul unul peste altul şi va scrie pe coloana sau linia următoare.

void lcd_puts(char *str) - afişează un şir de caractere începând de la poziţia x,y curentă;

Pentru a vă face o idee cam cum se conectează şi scrie pe LCD vom crea un exemplu simplu în care vom avea microcontrolerul ATMega8 şi un LCD LM016.Codul şi schema aplicaţiei o puteţi downloada de la secţiunea Download-LCD-Aplicaţie 1.Schema electrică este următoarea:
În cazul de faţă folosim portul D pentru transmisia de date şi comenzi.La crearea proiectului în CodeVision AVR ,la partea de setare din wizard trebuie să mergem la panoul LCD , să alegem portul D şi să selectăm numărul de coloane al LCD-ului precum în figura de mai jos:
În program nu vom face altceva decâ să afişăm nişte caractere înainte de intrarea în bucla infinită while:

lcd_init(16); //initializam LCD-il
_lcd_ready(); //asteptam ca lcd-ul sa poata primi date
lcd_gotoxy(1,4); //megem la coloana a 2-a pozitia 5
lcd_puts(mesaj1); //afisam primul mesaj
delay_ms(2000); //asteptam 2 secunde
lcd_clear(); //stergem caracterele de pe lcd
lcd_puts(mesaj2); //afisam mesajul 2 pe linia si coloana 1
delay_ms(1000); //asteptam o secunda
lcd_clear(); //stergem caracterele de pe lcd
lcd_puts(mesaj3); //afisam mesajul 3
lcd_putchar('x'); //afisam caracterul x
lcd_putchar('y'); //afisam caracterul y
lcd_putchar(80); //afisam caracterul cu codul 80(P)

Puteţi observa că pentru afişarea unor şiruri de caractere am folosit o variabilă de şir, mesaj, deoarece compilatorul nu ne lasă să scriem direct în funcţie sirul.Declararea şirurilor de caractere se poate face în program ,la începutul funcţiei main sau în exterior ca variabile globale.În programul nostru avem:

unsigned char* mesaj1 = "Test LCD";
unsigned char* mesaj2 = "LCD curatat";
unsigned char* mesaj3 = "Afisarea a 3 caractere:";

Funcţionarea fizică a aplicaţiei o puteţi vedea aici:

Twitter Delicious Facebook Digg Stumbleupon Favorites More