Sunteți pe pagina 1din 14

INI IERE PROGRAMARE LCD

LCD BACKGORUND n general un program folosit de microprocesoarele din familia 51 trebuie s interacioneze cu utilizatorii prin metode i dispozitive de ieire care s fie uor interpretate de oameni. Una dintre cele mai comune dispozitive ataate la un 8051 este display-ul LCD. Cele mai utilizate LCD-uri sunt de 8x2, 16x2 i 20x2 caractere alfanumerice. Aceasta nseamn de 8, 16 i respectiv de 20 caractere pe 2 linii. Din fericire, nc de la nceput firma Hitachi a impus un standard care a devenit foarte popular el ne permite s comunicm cu marea majoritate a LCD-urilor, indiferent de productorul acestora.. Acest standard permite comunicarea intre sursa extern i afiajul LCD prin intermediul unui controller HD44780U. Chiar dac diversitatea LCD-urilor este foarte mare n acest moment majoritatea firmelor produc microcontrolere compatibile cu limbajul standard. HD44780U impune 3 linii de control i 4 sau 8 linii I / O pentru magistrala de date. Utilizatorul poate selecta dac ecranul LCD are un bus de 4 bii sau unul de 8 bii magistrala de date. Se observ simplu ce fel de magistral are LCD-ul pe care l avem n funcie de numrul de pini existeni : 10 sau 12 pini, magistrala este de 4 linii de date, 3 linii de control , 3 pini alimentare (masa, o surs de 2.7-5 V pentru alimentarea logicii de comand i un pin pentru alimentarea ecranului LCD) ; n general, fabricantul mai pune la dispoziie doi pini, pentru alimentarea iluminrii ecranului, care nsa pot fi configurai i direct de pe placa de comand a LCD-ului, aceasta ns, este o problem particular a fiecrui tip de LCD i se gsete n datele de catalog ale fabricantului. 14 sau16 pini, magistrala este de 8 linii de date, 3 linii de control , 3 pini alimentare (masa, o surs de 2.7-5V pentru alimentarea logicii de comand i un pin 5 12 V pentru alimentarea ecranului LCD) cu sau fr 2 pini, pentru iluminrea ecranului. Atene i la BUS-ul de 8 bii se poate folosi de catre proiectant comunicarea pe 4 linii, dac are nevoie de mai multe linii in alte scopuri. Cele trei linii de control sunt: EN de la "Enable". Linie de control este folosit pentru a ateniona LCD-ul c se trimit date. Pentru a trimite date la LCD, linia trebuie ca fie n 0 logic i apoi setai celelalte dou linii de control i configurai datele pe magistral. Cnd operaia este terminat i datele sunt stabile pe magistral EN se pune n 1 logic i se ateapt procesarea lor ; acest dimp variaz n funcie de tipul de LCD : se ncheie prin aducerea liniei in 0 logic din nou.

RS de la "Register Select". Atunci cnd RS este n 0 logic, LCD-ul este ntiinat c pe linia de date se afla o comand sau o instruciune (cum ar fi resetarea ecranului, poziia cursorului). Atunci cnd RS este n 1 logic datele transmise sunt date de tip text i pot fi afiate pe ecran RW de la "Read/Write" . Cnd RW este n 0 logic, informaiile de pe la magistrala de date vor fi scrise pe ecranul LCD. Cnd RW este n 1 logic ,programul cere informaii te la placa LCD, practic trecerea lui RW n 1 logic echivaleaz cu o singur instruciune ("Get LCD status"), singura comanda de citire. CONFIGURAIA HARDWARE Ne referim n continuare la LCD-urile cu magistrala de 8 bii, liniile vor fi n continuare denumite DB0, DB1, DB2, DB3 DB4, DB5, DB6, i DB7. Aa cum am menionat, LCD necesit fie 8 sau 11 linii I / O pentru a comunica cu programul procesorului. Pentru a apropia ct mai aproape teoria de practic vom considera direct o configuraie hard pentru care se va realiza un program in continuare. Aceast configuraie este fcut ct mai simpl dup cum putei vedea

Configuraia este fcut sa poat fi folosit fr modificri pentru: AT89C1051 AT89C2051 AT89C4051 AT89C51 AT89C51

Chiar dac proiectarea plcii nu permite scoaterea la un conector a pinilor microprocesorului n ordinea luat aici modificrile ce vor tredui fcute n program sunt minime . DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7 EN RW RS EQU P1.0 EQU P1.1 EQU P1.2 EQU P1.3 EQU P1.4 EQU P1.5 EQU P1.6 EQU P1.7 EQU P3.7 EQU P3.0 EQU P3.1

DAT EQU P1 Dup ce a stabilit numirea variabilelor, putem s ne referim acum la folosirea limbajului controllerului HD44780 LINIA DE CONTROL EN Aa cum am menionat mai sus, EN este folosit pentru a spune LCD-ului c programul e pregtit s execute o instruciune existent pe magistrala de date i pe liniile de control. Reinei c EN trebuie s fie n 0 logic dup fiecare instruciune trimis anterior ctra LCD, indiferent dac acea instruciune a fost de citire sau scriere, de text sau comand. ntotdeauna comunicarea programului cu afiajul o se va faece prin comenzi n care linia EM va trebui s comute n 0 logic. Dac nu apare acest front pozitiv afiajul nu citete nici o instruciune de pe liniile celelalte de comunicare. Astfel, nainte de a comunica cu LCD-ul se va folosi instruciunea de tergere a bitului EN : CLR EN Odat ce am terminat configurarea celorlalte date, de control i linii de informaie, vom seta bitul de Enable SETB EN Datele i liniile de control trebuie s rmn stabile cel puin ct timpul minim specificat in datele de catalog ale productorului afiajului LCD . n general este vorba de 250 maxim 500 nS la afiajele vechi,de date. n cazul tipic AT89C51 rulnd la 12 MHz, o instruciune necesit o microsecund pentru a executa astfel nct linia EN poate fi adus la 0 logic fr nici o grij chiar de la urmtoarea instruciune. Cu toate acestea, microprocesoarele mai rapide (cum ar fi DS89C420, care execut o instruciune n 90 nanosecunde la un clock de 11.0592 MHz ), va necesita un numr de NOP-uri uri pentru a crea o ntrziere pentru ca EN este S rmn suficient n 1 logic. Instruciunea este

executat de ctre LCD pe frontul descresctor al liniei EN deci n momentul trecerii acestuia din 1 n 0 logic adic pentru program la urmtoarea instruciune CLR EN LCD interpreteaz i execut comanda noastr de la momentul n care linia EN este LOW. i aici afiajul necesit o anumit perioad de timp pentru a executa comanda, de aceea este bine s existe o ntrziere a procesorului pentru a se executa instruciunea dat anterior, acesta depinde de viteza de lucru a procesorului de pe LCD dar i de tipul instruciunii lansat de program. STAREA DE OCUPAT A LCD-ului Dei se poate da o instruciune care sa modifice timpul pentru a permite ecranului LCD s execute instruciunea n curs, aceast metod nu este foarte sigur. De exemplu dac este schimbat cristalul cu unul cu frecven mai mica sau la nlocuirea afiajului cu altul mai puin performant. O metod sigur, este s se in seama n programare de o comand care s determine cert dac LCD-ul este nc ocupat cu executarea ultimei instruciuni. Pentru a transmite starea de indisponibilitate, afiorul , dup ce achiziioneaz datele de pe magistral pune DB7 n starea 1 logic pn cnd va fi pregtit sa primeasc o nou comand. De abia atunci va trece DB7 n 0 logic. Pentru ca sa citeasc bitul DB7 programul nostru trebuie, dup ce a configurat bus-ul de date s elibereze bitul 7 adic s-l configureze ca intrare i s atepte trecerea sa n LOW. n acel moment, suntem liberi s continum i s trimitem urmtoarea comand. Ar fi indicat din moment ce vom folosi des aceast comand, de fiecare dat cnd lucram cu afiajul, s creem o subrutin :

LWAIT: CLR EN CLR RS SETB RW SETB EN comenzilor LCD SETB DB7 JB CLR CLR RET

; Lansare comand pentru LCD ; Comanda ; Comand de citire ; Com. de prel. a datelor i ; Setarea pinului DB7 pt a fi intrare

DB7,LWAIT ; Dac bit 7 n 1, ateapt EN ; Finalizare comand RW ; Oprie RW pentru comenzi viitoare

In original WAIT_LCD: CLR CLR SETB MOV SETB MOV JB CLR CLR RET EN ;Start LCD command RS ;It's a command RW ;It's a read command DAT,#0FFh ;Set all pins to FF initially EN ;Clock out command to LCD A,DAT ;Read the return value ACC.7,WAIT_LCD ;If bit 7 high, LCD still busy EN ;Finish the command RW ;Turn off RW for future commands

Se trimite o instruciune la LCD apoi se apeleaz subrutina de verificare a starii afiajului pentru ca procesorul atepte pn cnd instruciunea este complet executat. Acest lucru va asigura faptul c programul nostru da comenzi n momentul n care trebuie. Astfel programul este compatibil cu orice LCD, indiferent de ct de repede sau lent funcioneaz.

VERSIUNEA CU MAGISTRAL DE 8 LINII DE DATE


INI IALIZAREA LCD Prima instruciune, nainte de a putea utiliza ntr-adevr LCD, trebuie fcut configurarea, acesta se realizeaz prin trimiterea unor instruciuni de initializare.Trebuie s stabilim dac se va folosi: o magistral de date cu 8 sau 4 bii, numarul de rnduri, dimensiunile unui caracter. S presopunem ca avem un afiaj cu un BUS de 8 bii , 2 rnduri. Mai nti se anun afiajul c va primi o comand aceasta se face prin trecerea bitului RS n starea 0 .Primele dou opiuni BUS 8 bii i 2 rnduri sunt selectate prin trimiterea pe date a unui cod compus sumativ din alte trei comenzi : . 20H (DB5 1 logic) reprezint codul pentru informarea LCD ca avem de setat comenzi , 10H (DB4 n 1 logic) arat c magistrala de date are 8 bii de date (0 pentru 4 bii de date) 08H (DB3 n 1 logic) indic configurarea ecranului pe dou linii( 0 pentru o linie) Ar exista si opiunea 04H ( DB2 n 1 logic) dac digitul de afiaj ar fi 5X11 puncte .In acest caz el este 5X8 puncte corespunztor lui DB3 n 0 logic Facnd suma 00100000 + 00010000 00001000 00000000= ------------

00111000 deci codul n hexa este 38H Configuram secvena de program. CLR MOV SETB CLR LCALL In original CLR MOV SETB CLR LCALL RS DAT,#38h EN EN LWAIT RS DAT,#38h EN EN WAIT_LCD ;00111000

Configurm octetul al doilea din secvena de iniializare i acesta este o suma de trei comenzi. Tot ca mai sus mai nti se anun afiajul c va primi a doua comand aceasta se face prin trecerea bitului RS n starea 0 . Instructiunile sunt : 08H (DB3 n 1 logic) codul pentru informarea LCD ca avem de transmis setri de pornire 04H ( DB2 n 1 logic) comanda de pornire a afiorului, 02H ( DB1 n 1 logic) determina pornirea cursorului. Facnd suma 00001000+ 00000100 00000010= -----------00001110 deci codul n hexa este 0EH Configuram secvena de program. CLR MOV SETB CLR LCALL In original CLR RS MOV DAT,#0Eh SETB EN CLR EN LCALL WAIT_LCD RS DAT,#0Eh EN EN LWAIT

Ultimul octet de care avem nevoie este utilizat pentru a configura parametrii operaionali suplimentare ai LCD-ului. Est alctuit di suma a doua comenzi: 04h atest c este tot instruciune de setari, 02h pentru a configura LCD, astfel nct de fiecare dat cnd se trimite un caracter, poziia cursorului se deplaseaz automat la dreapta.

Facnd suma 00000100+ 00000010= -----------00000110 deci codul n hexa este 06H Configuram secvena de program. CLR MOV SETB CLR LCALL In original CLR RS MOV DAT,#06h SETB EN CLR EN LCALL WAIT_LCD Adunnd la un loc tot ce am aratat pna acum avem: LCDIN: CLR MOV SETB CLR LCALL CLR MOV SETB CLR LCALL CLR MOV SETB RS DAT,#38h EN EN LWAIT RS DAT,#0Eh EN EN LWAIT RS DAT,#06h EN RS DAT,#06h EN EN LWAIT

CLR LCALL RET

EN LWAIT

In original INIT_LCD: CLR RS MOV DAT,#38h SETB EN CLR EN LCALL WAIT_LCD CLR RS MOV DAT,#0Eh SETB EN CLR EN LCALL WAIT_LCD CLR RS MOV DAT,#06h SETB EN CLR EN LCALL WAIT_LCD RET n acest moment LCD-ul este gata s primeasc date pentru a le afia. When the LCD is first initialized, the screen should automatically be cleared by the 44780 controller. However, it's always a good idea to do things yourself so that you can be completely sure that the display is the way you want it. Thus, it's not a bad idea to clear the screen as the very first opreation after the LCD has been initialiezd. An LCD command exists to accomplish this function. Not suprisingly, it is the command 01h. Since clearing the screen is a function we very likely will wish to call more than once, it's a good idea to make it a subroutine: TERGEREA DISPLAY-ului Cnd LCD-ul este iniializat prima dat, ecranul ar trebui s fie n mod automat ters de propriul controller. Cu toate acestea, se recomand s se fac acest lucru prin propriul program, astfel nct s fii complet sigur c afiajul este aa cum se dorete. Astfel, este bine ca prima operaie s fie cea de golire a ecranului dup ce LCD-ul a fost iniializat. Exist o comand pentru aceast funcie. Aceasta este 01h. ntruct tergerea ecranului va fi necesar i ulterior n diverse aplicaii este bine s o avem prins ntr-o subrutin:

CLEAR : CLR RS MOV DAT,#01h SETB EN CLR EN LCALL LWAIT RET In original CLEAR_LCD: CLR RS MOV DAT,#01h SETB EN CLR EN LCALL WAIT_LCD RET Este indicat s se execute aceast subrutin de fiecare dat cnd curorul se afl n partea stnga sus a ecranului.

SCRIEREA TEXTULUI PE LCD Am ajuns la ceea ce de fapt se dorete: s putem afia textul pe ecranul LCD. Este clar c aceast funcie este cea de baz a afiajului i va fi folosit foarte des de aici necesitatea prinderii ei ntr-o subrutin . WRITEXT: SETB MOV SETB CLR LCALL RET In original WRITE_TEXT: SETB RS MOV DAT,A SETB EN CLR EN RS DAT,A EN EN LWAIT

LCALL WAIT_LCD RET

Rutina WRITEXT va trimite caracterul din acumulatorul procesorului ctre LCD, care la rndul su, o va afia. Astfel, pentru a afia textul pe ecranul LCD avem nevoie s ncrcm acumulatorul cu octetul pe care dorim s-l afim i s apelm la aceast rutin. PROGRAMUL DE SCRIERE Avem toate subrutinele necesare pentru a scrie un text pe ecranul LCD. S alegem un text, de exemplu : Acesta e primul Ar trebui s arate cam aa LCALL LCALL MOV LCALL MOV LCALL MOV LCALL MOV LCALL MOV LCALL MOV LCALL MOV LCALL MOV LCALL MOV LCALL MOV LCALL MOV LCALL MOV LCALL MOV LCALL MOV LCALL LCDIN CLEAR A,#20h WRITEXT A,#20h WRITEXT A,#'A' WRITEXT A,#'c' WRITEXT A,#'e' WRITEXT A,#'s' WRITEXT A,#'t' WRITEXT A,#'a' WRITEXT A,#20H WRITEXT A,#'e' WRITEXT A,#20H WRITEXT A,#'p' WRITEXT A,#'r' WRITEXT A,#'i' WRITEXT

MOV LCALL MOV LCALL MOV LCALL

A,#'m' WRITEXT A,# 'u' WRITEXT A,#'l' WRITEXT

In original LCALL INIT_LCD LCALL CLEAR_LCD MOV A,#'H' LCALL WRITE_TEXT MOV A,#'E' LCALL WRITE_TEXT MOV A,#'L' LCALL WRITE_TEXT MOV A,#'L' LCALL WRITE_TEXT MOV A,#'O' LCALL WRITE_TEXT MOV A,#' ' LCALL WRITE_TEXT MOV A,#'W' LCALL WRITE_TEXT MOV A,#'O' LCALL WRITE_TEXT MOV A,#'R' LCALL WRITE_TEXT MOV A,#'L' LCALL WRITE_TEXT MOV A,#'D' LCALL WRITE_TEXT Programul va realiza mai nti setarea LCD-ului apoi tergerea ecranului i afiarea textului pe prima linie ncepnd cu al treilea caracter. POZITIONARE CURSOR Programul de mai sus este simplist, n sensul c se imprim textul ncepnd cu colul din stnga sus al ecranului. Poziionarea mai la dreapta s-a fcut afind rudimentar caractere 0. Dac ns avem de afiat s zicem cuvntulTEXT pe linia a doua ncepnd cu caracterul 7 ? Acest lucru ar nsemna s scriem o grmad de caractere blanc inutile i ar lua o grmad de timp. Se poate mult mai simplu , dar necesit nelegerea un pic mai profund a design-ului LCD.

Afiajul conine o memorie, care este alocat ecranului. Tot textul scris pe LCD este stocat n aceast memorie, care este folosit n continuare, pentru a afia textul pe ecran chiar dac procesorul face cu totul alte funcii ntre timp. Aceast memorie poate fi reprezentat schematic astfel:

n harta de memorie de mai sus, zona colorat n albastru este vizibil pe ecran. Dup cum putei vedea, ea msoar 16 de caractere pe 2 linii. Numerele din fiecare casu reprezint adresa de memorie care corespunde cu aceast poziie pe ecran. Astfel, primul caracter din colul din stnga sus se afl la adresa 00h. Caracterul din poziia urmtoare (caracterul 2 de pe prima linie) este adresa 01h, etc Acest lucru continu pn cnd vom ajunge la caracterul DAT de 16 a primei linii, care este la adresa 0Fh. Primul caracter din linia 2, dup cum se vede n harta de memorie, este la adresa 40H. Acest lucru nseamn c, dac vom scrie un caracter la ultima pozitie 16 din prima linie si apoi scrie un al doilea caracter, al doilea caracter nu va aprea pe linia a doua ci pe pozitia 17 cu adresa 10H care nu este afiat . dar linia a doua ncepe la adresa 40h. Asta nseamn c ar trebui puse blancuri sau m rog orice fel de caractere, pentru ca tot nu sunt afiate dar ncarc memoria pna la adresa 40H adica n zecimal 3x16 =46 caractere. Este posibil dar cere prea multa munc i ocupa prea mult procesorul. Astfel, avem nevoie de s trimitem o comand LCD-ului pentru a poziiona cursorul pe a doua linie. Instruciunea este 80h. Pentru aceasta trebuie s adugm adresa de locaia unde dorim pentru a poziiona cursorul. n exemplul nostru, am spus ne-am dorit pentru a afia "TEXT", pe linia a doua ncepnd cu poziia caracterului al aptelea. Dac studiem harta memoriei, vom vedea c adresa caracterului al aptelea din linia a doua este 46h. Astfel, nainte de a scrie cuvntul "TEXT" pe LCD, trebuie s trimitem o comand cu setarea poziiei cursorului, instruciunea va fi tot sumativ : 80H codul de instruciuni pentru a poziiona cursorul, 46H adresa de poziionare a cursorului, de la care ncepe scrierea cuvntului TEXT Adresa va fi 80h + 46h = C6H CLR MOV SETB CLR LCALL In original RS DAT,#C6H EN EN LWAIT

Codul de mai sus va pozitiona cursorul pe linia 2, caracterul numarul 7 adresa casuei 47H. Pentru a afia "Acesta este primul", n partea din stnga sus, central, se terge o instructiune de blanc din cele dou iar pentru a afia TEXT n linia a doua cepnd cu caracterul 7 se va introduce mai nti comanda de poziionare a cursorului. Acest lucru duce la urmtoarele: LCALL LCALL LCALL LCALL MOV LCALL MOV LCALL MOV LCALL MOV LCALL MOV LCALL MOV LCALL MOV LCALL MOV LCALL MOV LCALL MOV LCALL MOV LCALL MOV LCALL MOV LCALL MOV LCALL MOV LCALL CLR MOV SETB CLR LCALL MOV INIT_LCD CLEAR_LCD LCDIN LCDCLEAR A,#0h WRITEXT A,#'A' WRITEXT A,#'c' WRITEXT A,#'e' WRITEXT A,#'s' WRITEXT A,#'t' WRITEXT A,#'a' WRITEXT A,#0H WRITEXT A,#'e' WRITEXT A,#'p' WRITEXT A,#'r' WRITEXT A,#'i' WRITEXT A,#'m' WRITEXT A,# 'u' WRITEXT A,#'l' WRITEXT RS DAT,#C6h EN EN LWAIT A,#'T'

LCALL MOV LCALL MOV LCALL MOV LCALL In original Partea I

WRITEXT A,#'E' WRITEXT A,#'X' WRITEXT A,#'T' WRITEXT

Urmeaza partea II VERSIUNEA CU MAGISTRAL DE 4 LINII DE DATE