GUIDA ARDUINO 8: DISPLAY LCD

Nell’Ottava Parte della Guida verrà Illustrato come Interfacciare Display LCD con Arduino e come visualizzare Stringhe e Numeri…

 

 

 
 



 

INTRO

L’acronimo LCD significa “Liquid Crystal Display” e sono dei supporti grafici usati come output in molti schemi elettrici. Gli LCD sono migliori dei 7-segmenti in quanto economici, facili da programmare e inoltre permettono di visualizzare ogni numero, lettera o simbolo. La dicitura LCD 16×2 informa che il display è formato da 2 righe da 16 caratteri. Ogni carattere viene visualizzato grazie ad una matrice da 5×7 pixel. Esistono vari tipi di LCD, anche con più di due righe, molto comuni sono i display LCD 16x$ che dispongono di 4 righe.

Il display LCD ha due registri al suo interno, uno per memorizzare i comandi da eseguire (cancellare il display, settare il cursore, inizializzare il display….)  e l’altro serve a memorizzare i caratteri che verranno visualizzati sul display LCD.

La piedinatura del display è:

Il primo pin, chiamato “GND” è il terminale di massa del display, “VCC” è l’alimentazione, tra VCC e massa deve esserci una potenziale di 5V. Il pin “VEE” serve a regolare il contrasto del display, si va a collegare quindi una resistenza variabile come in figura:

Il pin “RS” serve a selezionare il tipo di registro da usare, o il registro data o il registro comando. Il pin “R/W” seleziona se scrivere i registri o leggere i dati immagazzinati in essi.
Il pin “E” è il pin Enable, quando si invia un fronte di salita su questo pin viene abilitata la lettura dei pin data: questi pin sono “D0,D1,D2,D3,D4,D5,D6,D7” e sono i pin su cui vengono inviati i dati da memorizzare sui registri.

Gli ultimi due pin, “A” e “K” sono i pin del led di retroilluminazione, uno è l’anodo e l’altro è il catodo. L’anodo è collegato tramite una resistenza da 330Ω all’alimentazione, questa resistenza regola la corrente nel LED di retroilluminazione e di conseguenza la luminosità. Si consiglia di non scendere sotto il valore indicato per non bruciare la retroilluminazione.

L’LCD può essere usato in due modalità di invio dati, la prima ad 8bit è più veloce ma richiede 11 linee di comunicazione e quindi 11 pin del PIC, la seconda modalità richiede solo 7 linee di comunicazione anche se è più lenta. Nel secondo caso il carattere o il comando da inviare al display, composto da un char quindi a 8 bit, viene diviso in 4 LSB e 4MSB e inviati uno per volta, per questo richiede più tempo e meno linee.

Il Pin chiamato VEE nell’immagine (ma che viene anche chiamato Vo) è il pin che riceve una tensione tra 0 e VCC, generata con un resistore variabile e serve per regolare il contrasto del display. Supponiamo una alimentazione a 5V, se questo potenziometro è più verso il pin collegato alla massa genererà una tensione inferiore a 2.5V e man mano che ci si avvicina agli 0V i pixel saranno illuminati. Se è molto vicino agli 0V le scritte possono anche non essere visualizzate perché tutti i pixel sono illuminati al massimo.

 





 
LA LIBRERIA

La libreria usata per il controllo del display LCD è già installata su l’IDE di Arduino e si chiama “LiquidCrystal”, attualmente alla versione 1.0.6. Nel caso non sia installata leggete la guida su come installare o aggiornare le librerie presente su questo sito.

Iniziamo a vedere le varie funzioni disponibili in questa libreria. La prima serve per indicare come è connesso un display LCd con Arduino, la seconda serve ad indicare le righe e le colonne e la terza ripulisce il display LCD. Si avrà:

LiquidCrystal(rs, enable, d4, d5, d6, d7);                       //Connessione 4 bit senza pin rw
LiquidCrystal(rs, rw, enable, d4, d5, d6, d7);                   //Connessione 4 bit con pin rw
LiquidCrystal(rs, enable, d0, d1, d2, d3, d4, d5, d6, d7);       //Connessione 8 bit senza pin rw
LiquidCrystal(rs, rw, enable, d0, d1, d2, d3, d4, d5, d6, d7);   //Connessione 8 bit con pin rw
lcd.begin(colonne, righe)                                        //Indicare il numero di colonne e righe
//supponiamo connessione a 4bit senza pin di rw e display 16x2 la modalità più comune
LiquidCrystal(0, 1, 2, 3, 4, 5);                                 //rs->0, enable->1, d4->2, d5->3, d6->4, d7->5

void setup(){
lcd.begin(16, 2);                                                //2 righe e 16 colonne
lcd.clear();                                                     //Pulisci display LCD
}

Il display LCD dispone di un cursore che indica quale posizione si va a scrivere, questo cursore può essere visibile oppure no e può essere una linea o un rettangolo nero sulla posizione:

In questo caso è un rettangolo nero, ma potrebbe essere una linea in basso alla posizione. Nella libreria vi sono varie funzioni per controllare il cursore, si avrà:

void setup(){
lcd.home();                       //Posiziona il cursone nella prima riga e prima colonna
lcd.setCursor(colonna, riga);     //posiziona il cursore nella posizione riga-colonna
lcd.setCursor(2, 3);              //posiziona il cursore nella posizione riga 2 colonna 3
lcd.noCursor();                   //Rendi il cursore invisibile
lcd.cursor();                     //rendi visibile il cursore
lcd.noBlink();                    //cursore fisso non lampeggiante
lcd.blink();                      //cursore lampeggiante
}

La prima funzione fa ritornare il cursore nella posizione riga 1 colonna 1, la seconda funzione invece sposta il cursore nella posizione indicata dai due numeri, la terza funzione serve a rendere visibile il cursore oppure no mentre l’ultima stringa dell’esempio serve per selezionare se il cursore deve lampeggiare o no.

Queste funzioni possono essere usate sia nel ciclo di setup sia nel ciclo di loop.

Per scrivere sul display LCD invece si usano le seguenti funzioni:

void loop(){
data = 'a';                   //inizializza data con un char 'a' in particolare
lcd.write(data);              //mostra il char 'a'
lcd.write('d');               //mostra il char 'd'
data = 'a';                   //data inizializzato con il char a
data = "Ciao";                //data inizializzato alla stringa Ciao
lcd.print(data);              //Visualizza la variabile data
lcd.print("Ciao");            //Visualizza Ciao
numero = 190; 
numero = B01010101;
numero = 349008;
lcd.print(numero, BASE);      //Visualizza il numero nella base BIN per binario (base 2), 
//DEC per decimale (base 10) ed HEX per esadecimale (base 16).
lcd.print(numero, DEC)        //Mostra numero in base 10
lcd.print(0xD2, HEX)          //Mostra 0xD2 in esadecimale
float x = 3.14;               //Inizializza x a 3.14
lcd.print(x, 10);             //Mostra il numero floating point
}

Si può usare “lcd.write(data)” per scrivere un singolo carattere sul display LCD mentre “lcd.print(data)” serve per visualizzare stringhe o numeri che occupano più di uno spazio sul display LCD. nella seconda funzione può essere indicata la base di come mostrare il numero.

Poi ci sono due stringhe per spegnere il display LCD eliminando tutte le cose scritte con la possibilità di riaccenderlo nelle stesse condizioni di quando è stato spento e vi è una funzione per creare caratteri personalizzati accendendo un singolo pixel. Si avrà:

byte smile[8] = {               //Crea uno smile
  B00000,
  B10001,
  B00000,
  B00000,
  B10001,
  B01110,
  B00000,};
void setup() {    
  lcd.createChar(0, smile);     //0 indica da quale riga dei pixel scrivere i pixel di smile
  lcd.begin(16, 2);             //sposta il cursore sulla seconda riga e 16esima colonna  
  lcd.write(byte(0));           //scrivi lo smile
}
void loop(){
lcd.noDisplay();                //Spegni il display LCD
lcd.display();                  //Riaccendi il display
}

Quindi per creare un carattere speciale bisogna avere una variabile con 8 stringhe da 5 bit che rappresentano i pixel del carattere, poi si va a creare il char, si sposta il cursore, e poi si va a visualizzare io carattere. La funzione “lcd.noDisplay” invece viene usata per spegnere il display che poi si riaccende con la stringa successiva.

Le ultime funzioni servono per spostare le scritte sul display, ovvero per farle scorrere a destra o sinistra. Le funzioni sono:

void loop(){
  lcd.scrollDisplayLeft();    //Muovi tutte le scritte sul display di una posizione a sinistra
  lcd.scrollDisplayRight();   //Muovi tutte le scritte sul display di una posizione a destra
  lcd.leftToRight();          //Se si scrive 1 carattere per volta verrà scritto da sinistra a destra
  lcd.rightToLeft();          //Se si scrive 1 carattere per volta verrà scritto da destra a sinistra
  lcd.autoscroll();           //Attiva lo scorrimento automatico in direzione indicata sopra
  lcd.noAutoscroll();         //Disattiva lo scorrimento automatico
}

Quindi nel primo caso muovo il display a sinistra, con la seconda funzione lo muovo a destra mentre con le funzioni successive si va a scrivere con scorrimento sul display. Questo vuol dire che se si scrive un carattere per volta il carattere precedente viene spostato a destra o sinistra, in base a quale funzione viene eseguita prima “lcd.leftToRight();” oppure “lcd.rightToLeft();”.  Se l’auto scroll è disattivato quando si scrive un nuovo carattere bisogna cambiare posizione.
 

ESEMPIO

Scriviamo uno Sketch di esempio in cui eseguiamo le funzioni viste in precedenza. Prima di iniziare bisogna dire che è necessario richiamare la libreria con la seguente stringa “#include <LiquidCrystal.h> “ mentre la funzione per configurare la connessione  va inserita all’inizio, fuori dal setup e dal loop oppure va richiamata ogni volta e in ogni caso da errori. Il codice è il seguente:

#include <LiquidCrystal.h>              //Carica la libreria per il display LCD
LiquidCrystal lcd(0, 1, 2, 3, 4, 5);    //Configura connessione per tutte le funzioni
byte smile[8] = {                       //Crea uno smile
  B00000,
  B10001,
  B00000,
  B00000,
  B10001,
  B01110,
  B00000};

void setup() {
  lcd.begin(16, 2);                     //LCD 16x2
  lcd.createChar(0, smile);             //Crea lo smile
}

void loop() { 
  lcd.clear();                          //Pulisci il display
  lcd.write(byte(0));                   //Mostra lo smile               
  delay(1000);                          //Attendi 1 secondo
  lcd.clear();                          //Pulisci il display
  
  lcd.noCursor();                       //Spegni il cursore
  lcd.leftToRight();                    //Scrivi da sinistra a destra
  lcd.autoscroll();                     //Attiva l'autoscrol
  lcd.setCursor(9, 0);                  //Sposta il cursore sulla prima riga 5° colonna
  lcd.write('C');                       //Scrivi Ciao
  delay(300);                           //Aspetta 0.3 secondi
  lcd.write('I');
  delay(300);                          
  lcd.write('A');
  delay(300);  
  lcd.write('O');
  lcd.noAutoscroll();                    //Disattiva l'autoscrol
  
  delay(1000);                           //Aspetta 1 secondo
  lcd.setCursor(9, 1);                   //Sposta sulla seconda riga
  lcd.print("NE555.IT");                 //Mostra la stringa "NE555.IT"
  delay(1000);                           //Aspetta 1 secondo 

  for(int i = 0; i<3; i++){              //Esegui tre volte
    lcd.scrollDisplayRight();            //Sposta a destra tutte le scritte
    delay(500);}                         //Aspetta 0.5 secondi

  for(int i = 0; i<3; i++){              //Esegui tre volte
    lcd.scrollDisplayLeft();             //Sposta a sinistra
    delay(500);}                         //Aspetta 0.5 secondi
}


Si va quindi a inizializzare uno smile, poi nel setup si indica che display si usa e si creare lo smile. Nel “loop” si pulisce il display, si scrive lo smile e poi si va a visualizzare sulla prima riga “CIAO” un carattere alla volta con scrittura da sinistra a destra. Sulla seconda riga si scrive per intero “NE555.IT” e poi si va a muovere queste due stringe prima a destra e poi a sinistra di 3 posizioni per ogni direzione grazie ad un for.

Queste funzioni vengono ripetute visto che si trovano nel loop.

Lo schema è il seguente:

L’alimentazione a 5V giunge dal pin di Arduino e alimenta il display LCD. Inoltre giunge ad un capo del resistore variabile in modo tale da creare una tensione che regoli il contrasto dell’LCD. Il display è connesso come descritto nel codice ad Arduino, mentre tutti i pin non connessi sono collegati a massa.

La retroilluminazione è sempre alimentata a 5V con il GND al catodo mentre l’anodo è connesso ad un terminale di un resistore di 470 Ohm mentre l’altro capo è connesso alla tensione di 5V. Variando il resistore variabile si varia il contrasto.

 

DOWNLOAD

Potete scaricare la simulazione del circuito con PROTEUS e gli Sketch al seguente LINK!!!



 

[Voti Totali: 0 Media Voti: 0]
Segui la Nostra Pagina Facebook: Facebook

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *