MPLAB X & XC8 – #3: Display LCD – Parte 1

Libreria XC8 per display LCD.

 

 

 

 

INTRODUZIONE
In questo articolo viene presentata una libreria da utilizzare in MPLAB X con compilatore XC8 per pilotare display LCD 16×2, 16×4, 20×2 e 20×4. In XC8 – #3 – Parte 2 viene riportato un codice di esempio che fa uso della libreria e di un PIC18F252 per pilotare un display LCD 20×4.

DISPLAY LCD
Un display LCD (Liquid Crystal Display) è formato da una serie di caratteri disposti su una o più righe. I più comuni sono basati sull’integrato HD44780 che permette di gestire display fino a 80 caratteri disposti su righe e colonne. I più comuni sono i 16×2, 16×4, 20×2 e 20×4, dove il primo numero indica le colonne e il secondo le righe secondo cui sono organizzati i caratteri, ognuno dei quali è formato da una matrice di 5×8 o 5×10 pixel.
I display LCD di questo tipo, indipendentemente dal numero di righe e caratteri, hanno 16 pin:

  • 2 pin di alimentazione, indicati con VSS o GND per la massa e VDD o VCC per la tensione di 5 V
  • 1 pin per il contrasto, indicato con V0 o VEE che va connesso ad un trimmer
  • 1 pin per la selezione dei registri, indicato con RS;
  • 1 pin per la selezione dell’operazione, indicato con RW;
  • 1 pin di abilitazione, indicato con E;
  • 8 pin per i dati, indicati da D0 a D7
  • 2 pin per la retroilluminazione, indicati con A per l’anodo e K per il catodo;

Il display LCD è formato da un pcb sul quale sono presenti, oltre all’LCD stesso, una serie di componenti, tra cui l’integrato HD44780. Questo integrato, che si occupa della gestione dell’LCD, dispone di due registri, uno per i comandi ed uno per i dati. Tramite il pin RS si seleziona uno dei due registri e quindi anche l’operazione da svolgere: con RS = 0 si seleziona lo Instruction Register e si possono inviare comandi al display, con RS = 1 si seleziona il Data Register e si possono inviare i caratteri da visualizzare.   
Il pin RW permette di abilitare la lettura o la scrittura: con RW = 0 si scrive sul display, mentre con RW = 1 si legge dal display. 
Il pin E permette di abilitare la scrittura o la lettura del display. In scrittura permette di catturare lo stato presente sui pin data D0-D7 in corrispondenza del fronte di salita di un impulso su E.    
I pin data D0-D7 permettono di inviare sullo schermo i caratteri in formato ASCII ad 8 bit. Questa modalità, quella cioè che utilizza i pin D0-D7, è più veloce ma necessita di un maggior numero di GPIO del microcontrollore. Un’altra modalità operativa consiste nell’utilizzare solo i pin D4-D7, risparmiando così 4 GPIO del microcontrollore. Usando questa modalità il carattere viene suddiviso in due parti che vengono inviate separatamente sui 4 GPIO.

La modalità più comune per i microcontrollori è quella che utilizza 4 pin (D4-D7 dei display) e in modalità di sola scrittura, pertanto il pin RW è posto a massa, mentre i pin E e RS sono connessi agli GPIO del microcontrollore. Le connessioni risultano essere quelle in figura.

Le connessioni mostrate valgono per tutti gli LCD che fanno uso di un solo integrato HD44780 e che vengono pilotati in modalità 4 pin. I pin A e K relativi alla retroilluminazione non sono riportati perché possono essere presenti insieme agli altri e/o ad un lato.

 

 

LIBRERIA LCD
Viene ora presentata una semplice libreria ideata per microcontrollori PIC e ambiente MPLAB X. La libreria è stata realizzata a partire dai datasheet dell’integrato HD44780, del display e dalle istruzioni assembler del corso di microcontrollori seguito all’università.
La libreria è composta da un file LCD_HD44780.c contente le istruzioni per la gestione del display ed un file LCD_HD44780.h per l’header.

LCD_HD44780.h
Le prime due righe del file LCD_HD44780.h controllano che non sia già stata chiamata la funzione all’interno del progetto.

#ifndef LCD_HD44780_H
#define LCD_HD44780_H
   ...
#endif

Con #ifndef si controlla che non sia presenta la define LCD_HD44780_H, condizione che se rispettata permette di eseguire il resto del codice, e quindi di definire LCD_HD44780_H alla riga successiva. In questo modo verrebbe ignorata una eventuale ulteriore chiamata al file LCD_HD44780.h che risulterebbe già presente nel progetto. Nell’ultima riga viene inserito #endif che chiude il blocco if.

Segue poi una serie di define che permettono di associare ad un nome un valore numerico espresso in notazione esadecimale. Questi valori sono quelli richiesti dall’integreto HD44780 per eseguire diverse operazioni e comandi riportati in tabella:

Comando LCDCodice HEX Funzione
LCD_CLEAR 0x01“Pulizia” display
LCD_RETURN_HOME 0x02Cursore in posizione iniziale
LCD_ENTRY_MODE_1 0x04Entry mode DX >> SX
LCD_ENTRY_MODE_20x05Entry mode DX >> SX + Display >> DX
LCD_ENTRY_MODE_30x06Entry mode SX >> DX
LCD_ENTRY_MODE_40x07Entry mode SX >> DX + Display >> SX
LCD_D0_C0_B00x08Opzioni LCD & cursore
LCD_D0_C0_B10x09
LCD_D0_C1_B00x0A
LCD_D0_C1_B10x0B
LCD_D1_C0_B00x0C
LCD_D1_C0_B10x0D
LCD_D1_C1_B00x0E
LCD_D1_C1_B10x0F
LCD_CURSOR_LEFT0x10Shift cursore a sinistra
LCD_CURSOR_RIGHT0x14Shift cursore a destra
LCD_DISPLAY_LEFT0x18Shift display a sinistra
LCD_DISPLAY_RIGHT0x1CShift display a destra
LCD_4B_1L_5x80x20Trasmissione dati e matrice pixel
LCD_4B_1L_5x100x24
LCD_4B_2L_5x80x28
LCD_4B_2L_5x100x2C
LCD_8B_1L_5x80x30
LCD_8B_1L_5x100x34
LCD_8B_2L_5x80x38
LCD_8B_2L_5x100x3C
  • LCD_CLEAR
    Cancella tutti i caratteri stampati sullo schermo.
  • LCD_RETURN_HOME
    Riporta il cursore alla posizione iniziale, cioè quella con riga 1 e colonna 1.
  • LCD_MODE_x
    Definisce la modalità di inserimento dei nuovi caratteri. Sono permesse 4 modalità di inserimento:
    1. LCD_MODE_1
      Rappresenta la modalità di inserimento da destra verso sinistra, “opposta” a quella normalmente usata nella maggior parte delle lingue ma “normale” per altre come per esempio l’ebraico e l’arabo.
    2. LCD_MODE_2
      Rappresenta una combinazione della LCD_ENTRY_MODE_1 a cui si sovrappone uno shift verso destra dell’intero display e per questo motivo la posizione da cui far partire la scrittura deve essere tale da permettere la scrittura dell’intero testo o parola.

    3. LCD_MODE_3
      Rappresenta la modalità di inserimento da sinistra verso destra, quella “normale” per l’italiano e molte altre lingue. Il contatore posizionale del cursore viene incrementato in maniera da avere il nuovo carattere a destra del precedente.
    4. LCD_MODE_4
      Rappresenta una combinazione della LCD_ENTRY_MODE_3 a cui si sovrappone uno shift verso sinistra dell’intero display e per questo motivo la posizione da cui far partire la scrittura deve essere tale da permettere la scrittura dell’intero testo o parola.
  • LCD_Dx_Cx_Bx
    Definisce lo stato del display, del cursore e del lampeggio del cursore, che risultano abilitati se si pone x ad ‘1’ e disabilitati se ‘0’. A seconda del comando passato si possono avere 8 diverse combinazioni, anche se quelle relative al display spento non vengono visualizzate.
  • LCD_CURSOR_x
    Shifta il cursore di una posizione a destra o sinistra.
  • LCD_DISPLAY_x
    Shifta l’intero display di una posizione a destra o sinistra.
  • LCD_xB_xL
    Stabilisce la modalità di trasmissione dei dati, che può essere settata a 4 o 8 bit, il numero di linee in cui sono scomposti gli indirizzi dei caratteri che può essere 1 o 2, e la dimensione della matrice di pixel che rappresenta il singolo carattere, che può essere 5×8 o 5×10.

A queste define si aggiungono quelle relative agli indirizzi delle righe del display. Le righe 1 e 2 hanno sempre valori fissi rispettivamente pari a 0x80 e 0xC0. Per le righe 3 e 4 dipende dal display utilizzato e possono essere indirizzate con 0x90 e 0xD0 nel caso di display a 16 colonne e con 0x94 e 0xD4 nei display a 20 colonne.

Seguono infine le dichiarazioni delle funzioni:

  • void Lcd_Init(uint8_t LCD_type)
    Permette di inizializzare il display LCD e specificarne il modello.
  • void Lcd_Command(uint8_t cmd)
    Permette di inviare i comandi al display LCD.             
  • void Lcd_CharCP(uint8_t chr)
    Permette di visualizzare sul display un singolo carattere alla posizione corrente.       
  • void Lcd_Char(uint8_t r, uint8_t c, uint8_t chr)
    Permette di visualizzare sul display un singolo carattere alla posizione nella riga r e nella colonna c
  • void Lcd_TextCP(uint8_t *word)
    Permette di visualizzare sul display un testo alla posizione corrente.
  • void Lcd_Text(uint8_t r, uint8_t c, uint8_t *word)
    Permette di visualizzare sul display un testo alla posizione nella riga r e nella colonna c.
  • void Lcd_CustomChar(uint8_t n, uint8_t *c_chr)
    Permette di memorizzare fino ad 8 caratteri personalizzati nel registro CGRAM.

LCD_HD44780.c
Il file LCD_HD44780.c contiene le istruzioni necessarie per pilotare il display LCD, contenute nelle diverse funzioni utilizzabili definite nel file LCD_HD44780.

  • void Lcd_Init(uint8_t LCD_type)
    Permette di inizializzare il display LCD e specificarne il modello.
    La funzione provvede ad impostare come output i pin usati per pilotare il display e a selezionare gli indirizzamenti corretti per le righe 1, 2, 3 e 4 a seconda di quale LCD si sta utilizzando. Si provvede quindi a inviare la sequenza per l’inizializzazione del display. Nel datasheet dell’integrato HD44780 dell’HITACHI si ha il diagramma di flusso per l’inizializzazione del display.
    Si nota che deve essere inviato due volte il valore 000011. Il primo bit è RS che viene imposto a 0 nella funzione Lcd_Command, il secondo è RW che è cablato a 0, mentre i restanti bit sono D7:D4 che devono valere 0011, cioè 3. La funzione Lcd_Command riceve un byte che viene poi interpretato come 2 nibble, quindi per questa fase è sufficiente inviare il comando 0x33. In maniera analoga si invia il comando 0x32 che corrisponde alla seguenza 000011 e 000010.
    Segue poi il settaggio del display che viene fatto lavorare in modalità 4bit con matrice da 5×8 pixel e la selezione della entry mode “normale”. In questo modo il display è configurato correttamente ed è utilizzabile.
    Nel datasheet dell’integrato HD44780 dell’HITACHI si ha il diagramma di flusso per l’inizializzazione del display LCD in modalità 4 bit:

  • void Lcd_Command(uint8_t cmd)
    Permette di inviare i comandi al display LCD.             
    La funzione Lcd_Command() riceve un dato ad 8 bit (1 byte) e provvede a scomporlo in due parti da 4 bit (2 nibble). Affinché il display riconosca il comando scomposto è necessario fornire un impulso High-to-Low sul pin EN dopo ogni nibble posto sui pin D4-D7. La funzione provvede ad inserire i delay fra le varie operazioni. La configurazione imposta sui bit rappresenta un comando e quindi si pone RS = 0 per selezionare l’Instruction Register. La funzione provvede anche a inserire il giusto ritardo fra un’operazione e l’altra.
  • void Lcd_CharCP(uint8_t chr)
    Permette di visualizzare sul display un singolo carattere alla posizione corrente.       
    La funzione scompone il dato in due nibble e li invia ai pin D4-D7 seguiti da un impulso High-to-Low sul pin EN. La configurazione imposta sui bit rappresenta un dato e quindi si pone RS = 1 per selezionare il Data Register.
  • void Lcd_Char(uint8_t r, uint8_t c, uint8_t chr)
    Permette di visualizzare sul display un singolo carattere alla posizione nella riga r e nella colonna c
    Invia alla funzione Lcd_Command la posizione fornita dalle variabili “r” e “c” e alla funzione CharCp il dato.
  • void Lcd_TextCP(uint8_t *word)
    Permette di visualizzare sul display un testo alla posizione corrente.
    Scompone il testo in singoli caratteri e li invia alla funzione CharCP.
  • void Lcd_Text(uint8_t r, uint8_t c, uint8_t *word)
    Permette di visualizzare sul display un testo alla posizione nella riga r e nella colonna c.
    Invia alla funzione Lcd_Command la posizione e alla funzione CharCP i singoli caratteri del testo.
  • void Lcd_CustomChar(uint8_t n, uint8_t *c_chr)
    Permette di memorizzare fino ad 8 caratteri personalizzati nel registro CGRAM.
    Invia il comando di scrittura del carattere personalizzato nel registro CGRAM e richiama la funzione Lcd_CharCP() per scomporre il byte in due nibble.


La libreria è stata realizzata senza troppe pretese e “a tempo perso”, con l’intento di avere un codice facilmente riutilizzabile nei progetti che hanno la necessità di visualizzare dei dati a schermo. Non sono esclusi in futuro miglioramenti e aggiunte per poterla integrare con altre librerie e progetti, quindi sono ben accetti consigli e commenti a riguardo.
La libreria proposta è stata testata su PIC18F4520, PIC18F252, PIC16F887, PIC16F72 e PIC16F628A ed è risultata funzionare correttamente e senza problemi. Non appena possibile seguiranno test su altri microcontrollori PICMicro ad 8 bit.

DOWNLOAD
Al seguente link è possibile scaricare i file LCD_HD44780.c e LCD_HD44780.h relativi alla libreria per LCD basati su integrato HD44780: DOWNLOAD.

 

 

[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 *