Modulo LCD: interfacciamento e gestione Per visualizzare messaggi o i dati relativi a misure effettuate si puo usare un display LCD. In figura e rappresentato un LCD a 2 righe e 16 colonne. Il display a cristalli liquidi è, in realtà, solo la parte più appariscente di un Modulo LCD. Il Display LCD è assolutamente inutile senza un circuito elettronico in grado di gestirlo Bisogna acquistare un modulo LCD intelligente in cui, montato su un supporto in vetroresina (circuito stampato), da un lato è saldato il display vero e proprio e sul lato opposto sono presenti gli integrati necessari per la sua gestione. Il più importante tra questi integrati è il controller, quasi sempre il controller Hitachi HD44780,.un componente programmabile chiamato ad un duplice compito: gestire fino a 50 (10*5) pixel per ciascuno dei possibili caratteri alfanumerici (16, 20, 24, 32, 40,..) del display, organizzati su una o più righe assicurare l'interfaccia intelligente tra il visualizzatore e il processore o il microcontrollore (single-chip) cui il modulo è collegato. Nel data sheet del controller si possono trovare tutti i dettagli relativi alla piedinatura, alla struttura interna e al funzionamento del controller. Relativamente al modulo LCD ci limitiamo a studiare: la piedinatura del modulo (per il suo collegamento ad un sistema a microprocessore o a microcontrollore) la sua gestione ( le routine della libreria C18 ) Descriviamo i 16 piedini del connettore del Modulo: pin Nome I/O Descrizione 1 Vss Power Massa 2 Vcc Power +5V 3 Vo Analog Contrasto 4 RS Input Selezione 5 R/W Input Read/Write 6 E Input Abilitazione 7 D0 I/O Data LSB 8 D1 I/O Data 9 D2 I/O Data 10 D3 I/O Data 11 D4 I/O Data 12 D5 I/O Data 13 D6 I/O Data 14 D7 I/O Data MSD 15 A Retroilluminazione + 16 K Retroilluminazione i pin 1 e 2 servono per fornire alimentazione (5 volt); di solito l'assorbimento è contenuto, dell'ordine di pochi ma. il pin 3 è un ingresso analogico al quale si deve fornire una tensione compresa tra 0 e 5V al fine di regolare il contrasto del display, cioè la capacità di rendere più o meno scuri i pixel attivi, al fine di rendere migliore la visualizzazione, in funzione della luminosità dell ambiente; di solito la regolazione si ottiene con un potenziometro da 10 o 20 k.
gli 8 pin (da 7 a 14) del Data Bus sono il supporto per l'informazione bidirezionale tra il processore e il dispositivo, in base all operazione che si sta svolgendo. E possibile anche collegare solo 4 pin D0 D3 oppure D4 D7 avvisando via software il controller che l invio del dato avverra a rate sui 4 pin prescelti talvolta sono presenti 2 pin aggiuntivi (pin 15 e 16), mediante i quali è possibile alimentare l'eventuale luce di retro illuminazione. i pin 4 (RS), 5 (R/W) e 6 (E) servono per il controllo del dispositivo; rispettivamente: RS, detto Register Select indica la natura dell informazione presente sul bus dati: se viene forzato a 0 il byte in ingresso sarà interpretato come un comando da eseguire (istruzione), mentre con un 1 sarà ritenuto dato da interpretare. il livello logico di R/W (Read/Write) specifica la direzione dei bytes sul bus: se vale 0 si sta scrivendo nella memoria interna LCD, mentre con un 1 questa memoria è sottoposta a lettura. Il segnale E (Enable signal) è il segnale di sincronismo: quando passa da 0 a 1 costringe il controller a leggere le linee dato e a interpretare il valore su esse presente Collegamento del modulo ad un sistema a microcontrollore Nell esempio in figura il modulo LCD e collegato alla porta H del microcontrollore 18F8722 in dotazione alle board del Laboratorio. Per l invio dei dati e dei comandi sono stati scelti i 4 bit superiori della porta H (RH4 RH7) che sono stati collegati ai pin D4 D7 del display Per i segnali di controllo la disposizione scelta e stata la seguente: RS RH0 R/W RH1 E RH2
Gestione del modulo LCD Per la gestione del modulo LCD abbiamo utilizzato due files: lcd_4x20.h lcd_4x20.c Nel file h sono presenti le costanti necessarie alla gestione ed i prototipi delle funzioni contenute nel file con estensione.c Le funzioni fanno riferimento ad una disposizione hardware standard prescelta per l interfacciamento del modulo LCD, ma possono essere personalizzate in funzione dei collegamenti prescelti. Nel nostro caso non si è usato il collegamento standard e quindi bisogna modificare opportunamente le impostazioni delle costanti nel file h. Si tratta di modificare alcune costanti definite con la direttiva #define per specificare l associazione prescelta nella disposizione hardware Porta dati e tipo di collegamento ( 8 bit o 4 bit ) la porta usata per scambiare i dati con il PIC #define DATA_PORT #define TRIS_DATA_PORT PORTH TRISH PORTH che il collegamento è 4 bit si lascia commentata la riga /* #define BIT8 */ in modo che, non trovando definita la costante BIT8, viene assunto il collegamento a 4 bit che si usano i 4 bit superiori. Non ci deve essere il commento davanti alla definizione #define UPPER Collegamento delle linee di controllo Bisogna specificare la corrispondenza tra le seguenti linee del modulo LCD ed i bit delle porte del PIC usati nel nostro progetto ed i bit corrispondenti nel registro TRIS associato La linea Register Selector RS (pin 4 del modulo) Piedino H0 La linea Read/ Write R/W (pin 5 del modulo) Piedino H1 La linea di abilitazione E ( pin 6 del modulo) Piedino H2 #define RS_PIN #define TRIS_RS #define RW_PIN #define TRIS_RW #define E_PIN #define TRIS_E LATHbits.LATH0 TRISHbits.TRISH0 LATHbits.LATH1 TRISHbits.TRISH1 LATHbits.LATH2 TRISHbits.TRISH2
Inizializzazione LCD: Funzione OpenXLCD Prima del suo utilizzo il display va inizializzato La funzione OpenXLCD configura I pin di I/O del microcontrollore necessari alla gestione del display imposta il funzionamento del display in modalita 8 bit o 4 bit cancellatil display Prototipo: void OpenXLCD(unsigned char); Al momento della chiamata, avendo collegato il display nella modalita 4 bit, avendo il display piu di una linea (2 nel nostro caso) essendo i caratteri del formato 5x7 specificheremo: Le altre opzioni possibili sono: EIGHT_BIT OpenXLCD( FOUR_BIT& LINES_5X7 ); LINE_5X7 LINE_5X10 (Una sola linea con caratteri 5x7 o 5x10)) Comandi per il display Per evitare all utente: la memorizzazione delle costanti numeriche corrispondenti ai comandi del display l errore di non attendere che il controller sia disponibile a ricevere un comando sono gia definite in libreria le seguenti funzioni di gestione del display tutte del tipo void NomeFunzione (void) XLCDDisplayClear( ); XLCDDisplayOnCursorOff( ) ; XLCDCursorOnBlinkOn ( ) ; XLCDCursorOnBlinkOff ( ) ; XLCDDisplayOff ( ) ; XLCDCursorMoveLeft ( ) ; XLCDCursorMoveRight ( ) ; XLCDDisplayMoveLeft ( ) ; XLCDDisplayMoveRight ( ) ; // Cancella il display // Attiva il display Nasconde il cursore // Il cursore si vede e lampeggia // Il cursore si vede e non lampeggia // disattiva il display // Sposta di un carattere il cursore verso sinistra // Sposta di un carattere il cursore verso destra // Sposta il testo presente sul display di un carattere verso sinistra // Sposta il testo presente sul display di un carattere verso destra
Spostamento del cursore. Funzione XLCDGoto_xy Posizione il cursore sul display. Il testo verra poi visualizzato a partire dalla posizione in cui si e messo il cursore. La funzione non necessita di cicli di attesa prima della sua chiamata. La funzione ha due paramentri: Bisogna specificare nell ordine: in quale colonna desideriamo posizionare il cursore ( coordinata orizzontale 1 16 ) in quale riga si vuole posizionare il cursore (coordinata verticale 1-2) Esempio di posizionamento del cursore: XLCDGoto_xy ( 4, 1); Scrittura di una stringa. Funzione putrsxlcd Scrive sul display una costante stringa immagazzinata nella Rom (nel programma) cioe un insieme di caratteri racchiusi tra doppi apici Esempio: putrsxlcd( Ciao ); scrive ciao sul display. Dove? Dove e stato posizionato il cursore. Vogliamo scrivere al centro della riga 1. Ciao sono 4 caratteri. La riga e composta da 16 caratteri. 16-4 fa 12. lasciamo 6 caratteri vuoti davanti e dopo. Dobbiamo posizionare il cursore in colonna 7. XLCDGoto_xy ( 7, 1); putrsxlcd( Ciao ); Scrittura di una stringa in posizione desiderata. Funzione LCDWriteS Scrive sul display una costante stringa immagazzinata nella Rom Vogliamo scrivere Ciao al centro della riga 1, cioe in colonna 7 Si specifica: la costante da scrivere, la riga, lacolonna. LCDWriteS( Ciao,1,7); In alternativa. Si immagazzina in Rom (fuori dal main) la costante da visualizzare rom const char messaggio[ ]="Buona Sera"; Nel programma si specifica il nome della costante LCDWriteS (messaggio,1,4);
Scrittura di valori numerici Sono presenti in libreria le seguenti funzioni: LCDWriteU LCDWriteI LCDWriteF per la visualizzazione del contenuto di una variabile unsigned char per la visualizzazione del contenuto di una variabile int per la visualizzazione del contenuto di una variabile float Le funzioni richiedono 3 parametri: 1. la variabile da visualizzare 2. la riga a cui si desidera la visualizzazione 3. la colonna a cui si desidera la visualizzazione Se definiamo la variabile reale v float v = 34.567; e aggiungiamo la riga di codice LCDWriteF(v, 2, 7); Visualizzeremo sul display 34.56. La funzione che visualizza i numeri con la virgola mostra infatti solo due cifre decimali e non arrotonda. Le routines cancellano 5 caratteri prima di scrivere per evitare sovrapposizioni con precedenti scritte. Se il numero e piu lungo non funzionano bene e vanno opportunamente modificate. Come si imposta un progetto C18 che richiede la gestione di un modulo LCD 1. Copiare nella cartella del progetto i file lcd_4x20.h lcd_4x20.c 2. Aggiungere nella cartella Header Files il file lcd_4x20.h 3. Aggiungere nella cartella Other Files il file lcd_4x20.c Questo passaggio non e necessario in quanto sotto Other files si posizionano file con estensione pdf, bmp Serve solo per avere il file a portata di click in caso di eventuale consultazione. 4. Nel file sorgente aggiungere i seguenti righi di codice: #include "lcd_4x20.h" #include "lcd_4x20.c"