BoxIdee

DISPLAY SERIALE PER LCD HD44780

Descrizione

Stanco di dover 'reinventare l'acqua calda' per ogni progetto che necessita di un display LCD mi sono deciso a farmi anch'io il mio bravo modulo display 'intelligente' per controller HD44780 pilotato da una porta seriale a 1 filo (+massa!) a 115Kbps.

E' destinato a semplificare e velocizzare lo sviluppo di altri progetti, sia in termini di cablaggio costruttivo che di firmware, in quanto mette a disposizione dello sviluppatore un set completo di comandi che realizzano a basso livello (è scritto interamente in Assembler) tutte le possibili funzioni richieste; da qui il termine 'intelligente'.

Dotato di una interfaccia semplice e veloce libera preziose risorse di pin del microprocessore Host e rende più snello il programma, eliminando l'imcombenza di testare e verificare il funzionamento del modulo software di comunicazione.
L'hardware è sviluppato per collegarsi meccanicamente al display stesso, tipo 'piggiback', in modo da rendere il tutto molto compatto e facile da inserire nella meccanica del progetto.



Caratteristiche

Il progetto impiega un processore PIC18F2620 o simili (es. 18F2610, 18F2520, 18F2580), piuttosto sottoutilizzato, ma comodo per l'alta velocità di clock interno senza quarzi a 32MHz con l'uso del PLL 4x.
Per il funzionamento è richiesto un solo filo, quello dei dati ricevuti; volendo, anche il pin di trasmissione è abilitato e previsto nel software (es. echo dei caratteri ricevuti oppure testing).
Era prevista anche un'interfaccia SPI emulata in SW, poi rimossa perchè non avrebbe offerto significativi vantaggi.
Il display è pilotato a 8 bit e utilizza il pin di R/W per la lettura del bit Busy, per la massima velocità.

Una particolarità interessante è la capacità di adattarsi, tramite jumpers, ai principali tipi di display a caratteri con configurazione 16x2, 16x4, 20x2 e 20x4.
Sulla scheda sono presenti il connettore ICSP per la programmazione e 2 pad (o un jumper) per il reset del modulo.
Un led ACT lampeggia con frequenza di 0.5Hz (1s ON, 1s OFF), per verificare il funzionamento. Il led RX è sul percorso dei dati ricevuti per visualizzarne l'attività.
La backlight è pilotata tramite un Mosfet per piccoli segnali tipo BS108 (attenzione: ho provato anche altri modelli, quali il più comune 2N7000, con risultati insoddisfacenti per la scarsa sensibilità). Si possono utilizzare anche dei transistor con buon guadagno; per questo sono previste 2 resistenze, sulla base e sul collettore, per adattarsi ad altre soluzioni.

Il modulo è alimentato a 5V, dall'Host (tramite il connettore a 4 fili di interfaccia) o tramite alimentazione esterna stabilizzata, portata a un secondo connettore a 2 fili dedicato.
L'assorbimento non è banale in quanto la MCU a 32MHz utilizza da sola circa 30mA; con i led si arriva intorno ai 50mA; la retro-illuminazione, se utilizzata, comporta carichi diversi a seconda del tipo di display. Tipicamente, si possono aggiungere dai 20 ai 120mA. Per diminuire il consumo, i led ACT e RX possono essere rimossi.



Teoria di funzionamento

Dopo l'inizializzazione, vengono i letti i jumper di predisposizione per il formato dell'LCD, ovvero a 16 o 20 caratteri, per 2 o 4 righe.
Il modulo si pone quindi in ricezione dei dati seriali: di norma questi sono immediatamente inviati al display.
Quando vengono ricevuti i simboli attribuiti alla modalità 'comando' o 'numero' il flusso del programma cambia e si predispone alla ricezione di queste varianti.
NOTA BENE: i codici per le modalità di rappresentazione sono definiti come costanti in un modulo del programma, per essere facilmente modificati. I valori suggeriti sono 0x1B (ESC) per i comandi e 0x1C per i numeri.
Per il debug del programma, o per pilotarlo da emulatore terminale (es. HyperTerminal), è necessario modificarli in caratteri stampabili; io utilizzo per questo scopo i caratteri "^" per i comandi e "|" per i numeri. Questi ultimi sono quelli utilizzati nel file eseguibile qui linkato.

In modalità comando vengono accettati 1 o 2 caratteri (comando + variante) e fino a 10 parametri numerici (ne sono previsti 10 per la gestione dell'upload di caratteri speciali), ciascuno separato da una virgola; la sequenza è terminata da un carattere di terminazione (default 'CR' 0x0D).
La tabella più avanti descrive in dettaglio i comandi riconosciuti e i parametri accettati.

In modalità numero è atteso un carattere di formattazione e da 1 a 4 byte binari del numero da visualizzare.
Per i numeri Word e Long, devono essere inviati i codici binari da 2 e 4 byte rispettivamente, a partire dal meno significativo (LSB).
Il carattere di formattazione stabilisce se il numero che segue è un byte, una word o un long; informa inoltre se deve applicarsi la soppressione degli zeri iniziali, se si vuole l'allineamento a destra, se il numero deve essere rappresentato in esadecimale, con o senza prefisso ('$', modificabile).
L'assegnazione dei bit all'interno del carattere di formattazione è il seguente:

  • B0: x1xx xxx1 = byte
  • B1: x1xx xx1x = word
  • B2: x1xx x1xx = long
  • B3: x1xx 1xxx = hex
  • B4: x1x1 xxxx = zero suppress (skip)
  • B5: x11x xxxx = allinea destra
  • B6: x1xx xxxx = bit fisso (ovvero = 0x40) per permettere il testing da terminale
  • B7: 11xx xxxx = usa prefisso Hex (non utilizzabile in testing)

La presenza del bit 6 a 1 consente di inviare una lettera da terminale, sommando i valori degli altri bit; ad esempio, il valore 0101 0101=0x55='U' è un Word decimale con zeri soppressi, mentre 0100 1100=0x4C='L' è un Long in esadecimale).
In ogni caso, dopo la visualizzazione del numero il cursore si riporta alla posizione iniziale, in modo da poter rivisualizzare il numero ripetutamente.



Timing

I comandi che prevedono una temporizzazione utilizzano un timer interno con ciclo di 20mSec.
Il led ACT commuta stato ogni secondo e verifica che il circuito e il programma siano attivi.
NOTA: durante la programmazione della CPU, lo switch S1 deve essere spostato per isolare i pin di programmazione dai bit 6 e 7 del display, pena la possibile mancata programmazione.



Caratteri personalizzati (custom characters)

Il controller HD44780 prevede la possibilità di scaricare nella RAM (esattamente, la CGRAM=Character Graphic RAM) del modulo 8 caratteri creati dall'utente.
Ciascun carattere utilizza 8 byte, ovvero un byte per ciascuna delle 7 righe orizzontali di pixel del carattere più un byte per il cursore. Ogni byte è composto da 5 bit (da b0 a b4) per i 5 pixel di riga; i bit da b5 a b7 non sono visualizzati. Ciascun carattere è quindi formato da una matrice di 5x7 punti.
Gli 8 caratteri personali corrispondono alla sequenza di codici ASCII da 00 a 07. Inviando quindi uno di questi codici, corrispondenti normalmente a caratteri di controllo non visualizzabili, il display mostra il nostro carattere personalizzato.
Al momento, il programma include una tabella che contiene 4 Set di caratteri (da 0 a 3), ampliabili a 8, pari a 5x8 caratteri x 8 byte l'uno, quindi 232 byte.
Una routine del programma è predisposta per copiare uno dei 4 Set dalla EPROM del PIC alla CGRAM.



Funzionalità e comandi implementati

  • Ricezione continua di stringhe di caratteri
  • Pulizia schermo (totale, per riga, parziale di riga)
  • Ritorno a inizio riga (totale o per riga)
  • Posizionamento cursore alle coordinate ricevute
  • Controllo del display (On/Off) e del cursore (nulla, sottolineato, lampeggiante)
  • Controllo della retroilluminazione (acceso,spento,temporizzato)
  • Slittamento ('shift') temporizzato a sinista/destra del display o singole righe
  • Rotazione verticale ('roll') su/giù temporizzata
  • Stampa formattata di valori numerici ed esadecimali
  • Set di caratteri speciali memorizzati in EPROM e richiamabili
  • Funzioni di test e debug (echo,test caratteri,messaggio di benvenuto)

Comandi

Comando Parametri Descrizione
--- --- ANNULLA
comando vuoto senza parametri: annulla l'operazione in corso
B --- M [T] BACKLIGHT
controlla l'illuminazione del display: M stabilisce il modo:
0=sempre spento, 1=sempre acceso, 3=acceso temporizzato per T secondi.
In temporizzato, ogni carattere ricevuto provoca l'accensione e la ripartenza del timer (Es. B3,5)
C --- [N] CLEAR
cancella tutto il display (con N=0 o assente) oppure solo la riga [N]
C A R N P CLEAR AT
nella riga R cancella N caratteri a partire da P (Es. CA2,5,10)
D --- 1..7 DISPLAY
cambia la modalità del display secondo le combinazioni di questi 3 valori:
1=display acceso, 2=cursore sottolineato, 4=cursore lampeggia, (Es. D3)
H --- [N] HOME
sposta il cursore a inizio display (con N=0 o assente) oppure alla riga N (Es. H3)
L S N LOAD SET
Carica il set personalizzato N [1..8] nel display (caratteri da 0 a 7) (Es. ST4)
P --- X Y POSITION
sposta il cursore alla posizione definita da X (1..maxX) e Y (1..maxY) (Es. P8,2)
R D T [N] ROTATE
ruota in verticale berso il basso con tempo T tutto il display per N volte, o continuamente con N=0 (Es. RD3,8)
R [U] T [N] ROTATE
ruota in verticale berso l'alto con tempo T tutto il display per N volte, o continuamente con N=0 (Es. R3,8)
S [L] T [N] [R] SHIFT
slitta a sinistra con tempo T la riga R (o tutto il display con R=0) per N volte, o continuamente con N=0 (Es. S5,10,2)
S R T [N] [R] SHIFT
slitta a destra con tempo T la riga R (o tutto il display con R=0) per N volte, o continuamente con N=0 (Es. SR5,10,2)

NOTA: i valori tra parentesi [] sono opzionali; possono essere vuoti oppure a 0



To Do

Nel riguardare l'articolo mi sono accorto che il link per il donwload era interrotto, dovuto ad un crash del PC con conseguente ricostruzione, ardua e incompleta, della struttura file e cartelle. Ho sistemato il link e già che c'ero ho revisionato il codice, eliminando la funzionalità di animazione dei caratteri personali.
Erano difficili da capire (anche per me, a distanza di tempo) e probabilmente poco utilizzabili.

Devo ancora stabilire se implementare il download dei caratteri personalizzati da PC; il punto non è tanto nella funzione nel firmware, quanto nell'interfaccia utente richiesta sul PC per creare e caricare i codici. L'interfaccia esiste ed è funzionale, ma richiederebbe un pò di pulizia e qualche cura. Non è per me prioritario in questo momento.
Vorrei anche riuscire a pubblicare un programma in Visual Basic 6 per il debug del SW e per la creazione di maschere. Il programma esiste già e deve solo essere anch'esso 'ripulito'.



Download

» Scarica il file compresso ZIP
Contiene lo schema elettrico e il circuito stampato in versione EagleCad 6.x + il file sorgente in Assembler (PicSimulatorIDE di Oshonsoft) + l'eseguibile (.exe).
E' programmata la conversione del codice in assembler per MPASM di Microchip (appena possibile).


Click su qualsiasi immagine per ingrandire


Schema elettrico


Circuito stampato


Disposizione componenti


PCB Top


PCB Bottom


Il tutto finito e montato