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:

1 comentarii:

Lucian R spunea...

ori e RD ori e RW...

Trimiteți un comentariu

Twitter Delicious Facebook Digg Stumbleupon Favorites More