Articole similare

Cum controlezi un LCD alfanumeric - Tutorial

lcdverticalscrollAfisajele LCD sunt de doua tipuri: LCD alfanumeric si LCD grafic. 
Acest tutorial te invata cum sa controlezi un LCD alfanumeric, modelul cel mai ieftin si mai des folosit, bazat de controlerul Hitachi HD44780.

Tipuri de LCD alfanumeric

Afisajele LCD sunt de mai multe dimensiuni, cel mai des denumite dupa numarul de randuri si coloane (lungimea in caratere a unui rand). De exemplu un LCD 16x1 are un rand cu 16 caractere si un LCD 20x4 are 4 randuri a cate 20 caractere fiecare.
LCD-urile pot avea iluminare din spate (backlight) sau pot fi de tipul reflectiv (fara iluminare). Modul de comanda este identic. LCD-urile cu backlight au 2 pini in plus pentru alimentarea grupului de LED-uri de backlight.


lcd16x1 lcd16x1glass lcd8x2lcd40x4lcd16x2



 

Schema de conectare la microcontroler

Majoritatea LCD-urilor alfanumerice au controler HD44780 sau compatibil, cu 14 pini sau 16 pini (cele cu backlight):

Pin Descriere
1 GND
2 +5V alimentare
3 VEE (contrast, se coneteaza la +5V si GND printr-un potentiometru de 10K pentru regarea contrastului)
4 RS (0=comenzi, 1=caractere)
5 RW (0=scriere, 1=citire)
6 E (impuls 1>0 pentru a valida caratere sau comenzi)
7-10 D0-D3 (bus de date bidirectional, pentru transferul de date intre LCD si microcontroler; nu se folosesc in modul pe 4 biti)
11-14 D4-D7 (bus de date bidirectional, pentru transferul de date intre LCD si microcontroler; se folosesc in modul de pe 4 biti)
15 LED+ (alimentare LED backlight, A)
16 LED- (masa LED backlight, K)
lcdpinout

Interfata LCD pe 8 biti sau pe 4 biti (Nibble mode)

Cum ii trimiti caractere pentru afisare sau comenzi ? E simplu. Afisajele LCD alfanumerice suporta doua moduri de tranfer de date:

  • interfata pe 8 biti: intai pui data (caracterul de afisat) pe bus-ul de 8 biti, apoi setezi modul date (RS=1), apoi un impuls pe semnalul Enable
  • interfata pe 4 biti (modul Nibble): intai pui bitii MSB (4-7) pe bus-ul de 4 biti (D4-D7), apoi setezi modul date (RS=1), apoi un impuls pe semnalul Enable; urmeaza bitii LSB (0-3) pe bus-ul de 4 biti (D4-D7), apoi un impuls pe semnalul Enable
lcdconnection

Memoria controlerului LCD

Controlerul LCD contine 3 blocuri de memorie:
  • DDRAM Display Data RAM
  • CGRAM Character Generator ROM
  • CGROM Character Generator RAM

Memoria DDRAM

Memoria DDRAM se foloseste pentru stocarea caracterelor afisate pe ecran si poate memora 80 caractere, din care o parte sunt cele afisate direct ecran.
Functionarea este foarte simpla: este suficient sa configurezi ecranul sa incrementeze adresa automat (shift right) si sa configurezi adresa de start pentru mesajul care se afiseaza (ex. 0x00 hexa). Apoi, toate caracterele trimise pe liniile D0-D7 vor fi afisate de la stanga la dreapta. In acest caz, afisarea incepe de la primul caracter din rand deoarece adresa initiala este 0x00. Daca se trimit mai mult de 16 caractere, toate vor fi memorate, dar numai primele 16 vor fi vizibile. Pentru a afisa si restul, se va folosi comanda SHIFT, care muta fereastra vizibila spre celelalte zone din memorie, caracter cu caracter.
Memoria DDRAM poate si scrisa, dar si citita. Continutul memoriei se pierde la deconectarea de la alimentare.

lcdddrammemory

Memoria CGROM

Memoria CGROM contine un set standard de caractere, toate variantele care le poate afisa controlerul respectiv. Fiecare caracter are alocata o zona de memorie CGROM:

lcdcharsmap

Memoria CGRAM

Pe langa caracterele standard, controlerul LCD poate afisa simboluri definite de utilizator. Poate fi price simbol grafic de 5x8 pixeli. Pentru fiecare caracter sunt necesari 64 bytes. Din fiecare byte, doar primii 5 biti sunt utilizati:

lcdcgrammemory

Comenzi pentru control si comenzi pentru afisare


lcdcommands

Comenzile trimise catre LCD pot fi de mai multe tipuri:
  • Configurare functie (comanda)
  • Configurare adresa
  • Transfer data cu RAM-ul intern
  • Altele

INSTRUCTION
Decimal
Hexadecimal
Function set (8-bit interface, 2 lines, 5*7 Pixels)
56
38
Function set (8-bit interface, 1 line, 5*7 Pixels)
48
30
Function set (4-bit interface, 2 lines, 5*7 Pixels)
40
28
Function set (4-bit interface, 1 line, 5*7 Pixels)
32
20
Entry mode set
Scroll display one character right (all lines)
28
1E
Scroll display one character left (all lines)
24
18
Home (move cursor to top/left character position)
2
2
Move cursor one character left
16
10
Move cursor one character right
20
14
Turn on visible underline cursor
14
0E
Turn on visible blinking-block cursor
15
0F
Make cursor invisible
12
0C
Blank the display (without clearing)
8
08
Restore the display (with cursor hidden)
12
0C
Clear Screen
1
01
Set cursor position (DDRAM address)
128 + addr
80+ addr
Set pointer in character-generator RAM (CG RAM address)
64 + addr
40+ addr
Read DDRAM/CGRAM & Check Busy Flag

Entry mode set

This command sets cursor move direction and display shift ON/OFF. There are 4 possible function set commands;04, 05, 06, and 07. This command changes the direction the cursor moves by setting the address counter to increment or decrement. This command is very important. If you do not understand it you may not see anything or what you actually wanted to see on LCD screen. I have created 4 animated gifs to demonstrate what the function set command is all about.

When my friend Hakan Dereli wanted to learn about LC displays I gave him an LC display and the 4*4 keyboard that I used with my Z80 system.The keyboard is based on a 74C922 chip and my circuit to convert the 4 bit data output of the 74C922 to 8 bit data.It also has 3 other buttons on it.This makes it great to experiment with LCDs by entering commands/data manually. Hakan tested all possible commands by sending all the numbers between 00h and FFh to the LCD to see if there is an undocumented feature and see how all commands work. He did not find anything undocumented, but he noted how LCD behaves after each function set command.

Below are the gifs to demonstrate those commands. To demonstrate the effect of each function set command it is assumed that the LCDs below are 2*16 LC Displays with DD RAM address set to 8 and underline cursor ON. Note that when the address counter is set to DECREMENT, strings sent to the LCD will be printed in reverse order. The same thing applies to the CG RAM, as well.

Entry mode set command 04h

Entry mode set command 04h

Display Shift: OFF

Decrement Address Counter

String: Dereli

Entry mode set command 05h

Entry mode set command 05h

Display Shift: ON

Decrement Address Counter

String: Hakan

Entry mode set command 06h

Entry mode set command 06h    

Display Shift: OFF

Increment Address Counter

String: Dereli

 

Entry mode set command 07h

Entry mode set command 07h   

Display Shift: ON

Increment Address Counter

String: Hakan

Verificarea flag-ului Busy

  1. R/W=1 (citeste din LCD)
  2. RS=0 (selecteaza Instruction Register)
  3. E=1 (activeaza LCD-ul)
  4. Bitul 7 (D7) reprezinta flag-ul Busy (1=Busy, 0=pregatit pentru urmatoarea comanda)

Initializare

Afisajele LCD cu controler HD44780 TREBUIE initializate. Se poate in doua moduri:

  • reset intern al circuitului
  • initializare prin comenzi
In descrierea tehnica a controlerului este descrisa urmatoarea metoda:

Initizare prin circuitul de reset intern

Circuitul de reset intern initializeaza automat controlerul HD44780 la alimentare. Iinstructiuni de mai jos se executa in timpul initializarii. BusyFlag este activ in aceasta stare, pana la terminarea initializarii. Stare tine 10ms dupa ce VCC creste peste 4.5V.


Display clearFunction set
DL = 1; 8-bit interface data
N = 0; 1-line display
F = 0; 5 ´ 8 dot character fontDisplay on/off control
D = 0; Display off
C = 0; Cursor off
B = 0; Blinking offEntry mode set
I/D = 1; Increment by 1
S = 0; No shift

Suna bine, nu ? Acum citeste mai jos, tot din descrierea tehnica a producatorului:

Note: If the electrical characteristics conditions listed under the table Power Supply Conditions Using Internal Reset Circuit are not met, the internal reset circuit will not operate  normally and will fail to initialize the HD44780U. For such a case, initialization must be performed by Instruction.

si vezi asta:

lcdpowerreset

Da, este simplu cu resetul intern si chiar functioneaza. Atunci de ce sa folosesti initializarea prin comenzi ?
Initializarea prin reset intern depinde de sursa de alimentare externa. Daca nu vrei ca softul sa fie dependent de alimentare, atunci vei folosi metoda de initializare prin comenzi, descrisa mai jos:

lcdinitsequence

Cum sa creezi caracterele tale

Scrierea in CGRAM este similare cu mutarea cursorului la o anume pozitie si afisarea caracterului la noua locatie. Vezi urmatorii pasi:
  • RS=0 si R/W=1 pentru modul acceptare comenzi de configurare
  • Configureaza adresa CGRAM prin trimterea unui byte intre 64 si 127 (locatiiile 0-63 din CGRAM)
  • RS=1 pentru a trece la modul trasfer date
  • Trimte octetii pentru simbolul tau. Controlerul LCD va incrementa automat adresa CGRAM.
  • RS=1 pentru a trece la modul comenzi ca sa configurezi adresa dorita (ex. 128, primul caracter din prima linie);  comanda clear-screen (1) sau home (2). Acum octetii se scriu iar in partea vizibila a ecranului.

Ca sa vezi caracterul definit de tine, afiseaza codurile ASCII de la 0 la 7.