domenica 12 gennaio 2014

Studio PIC 18F (18F4431) #6 :: "Hello World su LCD HD44780"

Vai al precedente POST della serie

Per poter utilizzare un display LCD dobbiamo prima di tutto conoscere qual è il controller che lo pilota.
Esistono diverse tipologie di controller: testuali, grafici, paralleli, seriali...
Iniziamo con quello che è di fatto uno standard per gli LCD testuali: il controller HD44780 sviluppato da Hitachi.
Il controller HD44780 rende estremamente semplice l'interfacciamento (di tipo parallelo) richiedendo un numero limitato di connessioni (e quindi di pin utilizzati).

Frugando nel cassetto ho trovato questo LCD prodotto dalla Powertip: trattasi del modello PC1602-D che permette di visualizzare 16 caratteri su 2 righe:



Di seguito la descrizione dei pin di interfacciamento:

POWERTIP PC 1602-D
PinSimboloDescrizione
1VssPower supply (GND)
2VddPower supply (+)
3VoContrast Adjust
4RSRegister select signal
5R/WData read / write
6EEnable signal
7DB0Data bus line
8DB1Data bus line
9DB2Data bus line
10DB3Data bus line
11DB4Data bus line
12DB5Data bus line
13DB6Data bus line
14DB7Data bus line / BF (busy flag)
15APower supply for LED B/L (+)
16KPower supply for LED B/L ( )

Generalmente tutti gli LDC HD44780 hanno i pin disposti secondo questo schema ma ovviamente verificate il datasheet del vostro display per adattare le connessioni in modo corretto...
I pin 15 e 16 servono per alimentare i led di retro-illuminazione... ma il mio LCD non ne è provvisto e quindi non verranno utilizzati.

Interfacciamento (BUS dati a 4 bit)

Per ridurre al minimo il numero di connessioni necessarie si utilizza solitamente la modalità con BUS dati a 4 bit  (in alternativa a quella con BUS dati a 8 bit) forzando la linea R/W a 0 cioè in sola scrittura (rinunciando pertanto a leggere lo stato del display).
Per evitare la perdita di comandi si utilizzano specifici tempi di delay in modo da essere sicuri che il controller abbia terminato l'esecuzione di un comando prima di inviare il successivo.

Questa configurazione richiede solo 6 linee di segnale: RS, E, DB4, DB5, DB6, DB7.
I rimanenti pin del controller saranno connessi a VSS secondo il seguente schema:


Inizializzazione del display

Dopo aver dato tensione al display questo di configura automaticamente in modalità BUS a 8 bit e quindi è necessario inviare una speciale sequenza di reset per poter cambiare questa configurazione di default.
Tale sequenza di reset è descritta nel datasheet del controller HD44780 e qui di seguito riassunta:
  1. attesa di almeno 40 msec dall'accensione
  2. BUS dati impostato a 0011
  3. strobe su linea E
  4. attesa di almeno 5 msec
  5. strobe su linea E
  6. attesa di almeno 160 usec
  7. strobe su linea E
  8. attesa di almeno 160 usec
  9. BUS dati impostato a 0010
  10. strobe su linea E
  11. attesa di almeno 160 usec
  12. seguono invii dei normali comandi per le configurazioni

Invio dei comandi al controller

Dato che non possiamo controllare lo stato del bit BF (come visto prima R/W è forzato a 0 per risparmiare una linea di controllo) bisogna attendere il tempo indicato per l'esecuzione di ogni comando prima di inviare il successivo (abbondando un po' per sicurezza rispetto a quanto indicato nel datasheet).
Nella modalità a 4 bit i comandi vanno inviati in due parti: prima i bit 7-4 e poi i bit 3-0 (most significant niblle first).
Quando il BUS dati è impostato con il valore da trasmettere bisogna inviare un impulso alto-basso sulla linea E (strobe) in modo che il controller prenda in carico il dato.
In pratica la sequenza corretta di invio di un comando per la modalità con BUS a 4 bit sarà la seguente:
  1. setto il 4 bit alti (DB7-DB4)
  2. strobe su linea  E
  3. setto i 4 bit bassi (DB3-DB0)
  4. strobe su linea E
  5. delay di attesa esecuzione comando

Elenco comandi controller HD44780
Comando Codifica linee Descrizione Tempo max esecuzione
(con fcp=270 kHz)
RS R/W D7 D6 D5 D4 D3 D2 D1 D0
Clear display 0 0 0 0 0 0 0 0 0 1 Pulisce il display e posiziona il cursore in linea 1 colonna 0 (indirizzo 0 della DDRAM) 1.52 ms
Cursor home 0 0 0 0 0 0 0 0 1 0 Posiziona il cursore in linea 1 colonna 0 (indirizzo 0 della DDRAM). Inoltre riporta il display shift in posizione originale. Il contenuto della DDRAM non viene modificato. 1.52 ms
Entry mode set 0 0 0 0 0 0 0 1 I/D S Imposta il modo di inserimento dei caratteri.
I/D = puntatore DDRAM dopo scrittura di un carattere: 0=decrementa, 1=incrementa
S = scroll dello schermo: 0=off, 1=on
37 μs
Display on/off control 0 0 0 0 0 0 1 D C B Imposta lo stato del display e del cursore.
D = display: 0=off, 1=on
C = cursore: 0=off, 1=on
B = lampeggio cursore: 0=off, 1=on
37 μs
Cursor/display shift 0 0 0 0 0 1 S/C R/L 0 0 Sposta il cursore o lo schermo di una posizione.
S/C = modo: 0=cursore, 1=schermo
R/L = direzione: 0=sinistra, 1=destra
37 μs
Function set 0 0 0 0 1 DL N F 0 0 Imposta i parametri di base del display.
DL = bus dati: 0=4 bit (DB4-DB7), 1=8 bit (DB0-DB7)
N = numero linee: 0=una linea, 1=due linee
F = dimensioni font: 0=5x8 (N=0 o 1), 1=5x10 (N ignorato: sempre una linea)
37 μs
Set CGRAM address 0 0 0 1 CGRAM address Inizio scrittura o lettura CGRAM all'indirizzo specificato. 37 μs
Set DDRAM address 0 0 1 DDRAM address Inizio scrittura o lettura DDRAM all'indirizzo specificato. 37 μs
Read busy flag &
address counter
0 1 BF CGRAM/DDRAM address Lettura stato controller.
BF = stato busy flag: 0=inviare nuovo comando, 1=attendere termine esecuzione comando
CGRAM/DDRAM = indirizzo attuale del puntatore alla ram in uso corrente.
0 μs
Write CGRAM or
DDRAM
1 0 Write Data Scrive il dato nella ram in suo corrente (CGRAM o DDRAM). 37 μs
Read from CG/DDRAM 1 1 Read Data Legge il dato dalla ram in uso corrente (CGRAM o DDRAM). 37 μs

La CGRAM è la ram che il controller usa per la generazione di caratteri extra definibili dall'utente: questo argomento verrà approfondito più avanti in un futuro post...
La DDRAM invece è la ram che il controller usa per memorizzare i codici dei caratteri da mostrare sul display) ed lo spazio utile è sempre di 80 bytes (anche se il display ne mostra meno).
I byte della DDRAM sono organizzati nel seguente modo: dall'indirizzo 0x00 a 0x27 troviamo le prime 40 locazioni e da l'indirizzo 0x40 a 0x67 le seconde 40 locazioni.
Come poi vengono organizzate fisicamente per mostrare i caratteri sul display dipende da quante linee un determinato modello può visualizzare: un'ottima spiegazione si trova qui.

Nel caso di un display a 2 linee la seconda linea inizia alla locazione 0x40.

Inviando più comandi di shift con S/C a 1 (scroll di tutto lo schermo) si possono mostrare i caratteri contenuti nelle locazioni 'nascoste' per entrambe le righe.

Scrittura sul display

Per mostrare un carattere sul display bisogna scrivere il codice del carattere sulla DDRAM.
Inviando il comando di scrittura il controller salverà il codice del carattere nella locazione corrente della DDRAM incrementando (o decrementando) il puntatore alla successiva locazione secondo quando configurato dal comando 'Entry mode set'.

In caso di incremento:
  • se il puntatore si trovava alla locazione 0x27 verrà spostato alla locazione 0x40
  • se si trovava alla locazione 0x67 verrà riportato alla locazione 0x00.
In caso di decremento:
  • se il puntatore si trovava alla locazione 0x40 verrà spostato alla locazione 0x27
  • se si trovava alla locazione 0x00 verrà spostato alla locazione 0x67.

Mano al codice

Il progetto ASM lo trovate qui.
Le sub di delay sono tutte calcolate per un FOSC di 8 MHZ: ovviamente se necessario andranno adattate (consiglio questo utile generatore di routine di delay on line: da evitare però i 'goto $').
Utile notare come, in questo esempio, ho utilizzato la lettura delle stringhe dalla memoria programma tramite la nuova e comodissima istruzione TBLRD.
Ogni funzione è ben commentata e non credo richieda ulteriori spiegazioni...

Realizzazione pratica

Una volta connesso il tutto (come da schema sopra indicato) e programmato il PIC (che anche in questo caso va autoalimentato) non rimane che regolare il contrasto, agendo sulla resistenza variabile VR1, fino a vedere scorrere i caratteri nel display.



Risultato






Stay tuned!
ap

Vai al successivo POST della serie

NB: l'autore non risponde di eventuali danni causati da omissioni, inesattezze o errori eventualmente presenti nell'articolo pubblicato.
Prego, segnalare suggerimenti e migliorie commentando questo post o inviando una email a padnest@gmail.com.

Nessun commento :

Posta un commento