Tutorials - Elettronica

 

 

LCD con caratteri a matrice


La memoria DDRAM

Un elemento essenziale del controller è la sua area di memoria RAM.

Essa ha lo scopo di conservare il testo da visualizzare, come in un buffer in cui ogni carattere occupa una cella di memoria e la linea è un array di celle consecutive, accessibili in lettura e scrittura.
In altre parole, ogni carattere visualizzato sul display corrisponde al contenuto di una determinata cella della DDRAM. E non solo, perchè è possibile, se il numero di caratteri presentabili sul display è minore dell' estensione della memoria (come accade in tutti i moduli con meno di 80 caratteri visibili); in tal caso parte del contenuto della RAM non verrà visualizzato, non corrispondendo alle locazioni del display, ma sarà comunque possibile ottenerne la visualizzazione facendo shiftare le linee con l' opportuno comando.

Comprendere questo meccanismo è essenziale per capire come funzionano questi moduli: l' utente scrive i codici dei caratteri in DDRAM e il controller lavora in modo autonomo per quanto riguarda la presentazione dei dati; una volta inizializzato correttamente, il governo del pannello LCD è del tutto indipendente dalla necessità di un controllo esterno, dato che il sistema dispone di una propria "intelligenza". 
Questa autonomia è completa: se abbiamo reso visibile un messaggio, possiamo anche staccare totalmente la connessione tra il modulo LCD e il microcontroller che lo comanda: il messaggio sarà visibile nelle modalità imposte fino a quando la tensione di alimentazione è presente. La connessione con il microcontroller sarà necessaria solo per apportare una qualsiasi variazione alla visualizzazione.

A questo proposito va detto che 

la memoria dati del modulo LCD è di tipo volatile (RAM) e quanto scritto viene cancellato dalla caduta della tensione di alimentazione.

Questa memoria dati,  denominata DDRAM, è accessibile in un blocco di indirizzi da 00H a 67H, inviando un opportuno comando al controller. 
Da un punto di vista strutturale la DDRAM viene associata al pannello LCD con una organizzazione in due blocchi, che corrispondono a due linee di caratteri: la prima linea da 40 bytes, dall' indirizzo 00h a 27h, e la seconda linea, sempre da 40 bytes, va da 40h a 67h.
Ognuno di questi indirizzi di memoria corrisponde alla posizione di un carattere sul visualizzatore, ma, come abbiamo detto, occorre tenere presente che si possono realizzare display con un numero minore di elementi visibili rispetto agli 80 possibili. Quindi la parte di DDDRAM visualizzabili potrà interessare solamente una parte della RAM, che resta comunque complessivamente disponibile.

All' inizializzazione hardware, ovvero all' arrivo della tensione, il controller scrive la DDRAM riempiendola con il codice ASCII 20h che corrisponde ad uno "spazio" e quindi ad una visualizzazione nulla: il display è vuoto.
Successivamente, se viene inviato un diverso codice, il carattere corrispondente sarà reso visibile automaticamente in una posizione specifica sul display.

Questa posizione è determinata da un AC (Address Counter) che, inizialmente, è settato a 00, ovvero alla prima posizione della prima riga, ed avanza (o arretra), scorrendo lungo la DDRAM a seconda del comando impostato.  Si può accedere al valore di AC e modificarlo attraverso un comando di scrittura; questo consente di indirizzare il prossimo carattere inviato al display in una specifica posizione, ad esempio in testa ad una riga successiva, o in qualsiasi altro punto, anche in una area al di fuori della mappa di visualizzazione di quel dato display.  AC è anche leggibile e questo permette di conoscere in ogni momento la sua posizione.
Nel set di comandi, c'è anche la  possibilità di specificare se il contatore viene incrementato o decrementato automaticamente ad ogni scrittura: questo permette di scrivere i caratteri da sinistara a destra (incremento), ma anche da destra a sinistra (decremento). Normalmente si incrementa, dando alla sequenza dei caratteri scritti la direzione della scrittura normale: ad esempio, se si è impostato un incremento, il primo carattere sarà all' indirizzo 00h e il successivo all' indirizzo 01h e così via; arrivati a fine riga, AC passa automaticamente all' inizio della successiva.
Però è possibile ottenere diversi effetti utilizzando il contatore in decremento assieme allo shift della riga, ottenendo uno scorrimento dei caratteri, del genere di quello comune nei pannelli di messaggistica.

Per il controller, la forma fisica del display LCD è del tutto indifferente: esso si occupa solo di trasferire il codice in DDRAM al pannello e di implementare le modalità di scrittura, scorrimento, lampeggio, ecc.
Ne deriva che l' organizzazione dei caratteri sul pannello dipende solamente da come il costruttore collega le linee di comando dei punti al controller. Solitamente questo viene fatto secondo uno standard logico, che origina, per ogni linea visibile, una corrispondenza determinata con la DDRAM.

La tabella seguente cerca di chiarire la mappa di memoria nelle varie situazioni:

Display Linea Note
1 2 3 4
1x8 00-07 - - -  
1x16 00-0F - - -  
00-07 40-47     display organizzati come se si trattasse di due linee da 8 caratteri
1x20 00-13 - - -  
1x40 00-27   - -  
2x8 00-07 40-47 - -  
2x12 00-0B 40-4B - -  
2x16 00-0F 40-4F - -  
2x20 00-13 40-53 - -  
2x24 00-17 40-57 - -  
2x40 00-27 40-67 - -  
4x16 00-0F 40-4F 14-23 54-63
00-0F 40-4F 10-1F 50-5F display con diversa organizzazione
4x20 00-13 40-53 14-27 54-67  
4x40 00-27

-

40-67

-

-

00-27

-

40-67

display governati da 2 controller diversi, con memoria separata

Da un punto di vista grafico, per un display a 2 righe da 40 elementi ciascuna, tutte e 80 le celle di memoria della DDRAM sono visualizzate

Il dato nell'indirizzo 00h in DDRAM all'estremità sinistra (home) della riga superiore del display (linea 1). Un dato nell'indirizzo 63h  apparirà cinque posti prima della fine della linea inferiore (linea 2) e così via.

Quando il controller host vuole far apparire un carattere sul display può usare due vie:

  • affidarsi all' automatismo che governa AC
  • specificare un indirizzo determinato
Nel primo caso HD44780 prende il codice che riceve e lo memorizza nella locazione puntata in quel momento da AC. Nel secondo caso, AC viene prima puntato su una specifica locazione e quindi viene scritto il carattere.
Come accennato, il controller incrementa (se così è stato programmato) AC e, arrivato a 27h passa a 40h; nello stesso modo arrivato a 67h passa a 00h. 
In queste condizioni, la scrittura di un lungo testo appare su linee successive come in un libro.
Per un display a 80 caratteri è possibile anche un' altra configurazione, ovvero 4 linee da 20 caratteri.

La mappa della memoria è la stessa, indipendentemente dalla configurazione del display e per questa ragione  il controller HD44780 ritiene che l' organizzazione  (specificata nell' inizializzazione) della DDRAM sia su due linee.

È importante considerare che per il controller la differenziazione nella gestione della DDRAM riguarda solamente una inizializzazione a 1 linea o a 2 linee; il fatto che i caratteri siano organizzati geometricamente su 2 linee reali o su 4 linee, o in qualsivoglia altro modo, per il controller è del tutto indifferente.

Il controller piazza il carattere inviato all' indirizzo corrente in AC e basta. Sta al costruttore organizzare geometricamente i caratteri e le linee ed all' utente impiegarle come desidera.

Nella realizzazione in 4 linee invece che in due, ogni linea occupa gli indirizzi indicati sopra, su questo display 4x20 di Newhaven.

Osserviamo in primo luogo che la linea 1 ha come consecutiva fisica la linea 2, ma questa linea non sta nella continuazione in DDRAM della linea 1, bensì è all' inizio della seconda linea di DDRAM. La linea 1 fisica termina con la locazione 13h di DDRAM e la sua prosecuzione appare nella linea fisica 3. E così la linea 2 è completata dalla 4. Parrebbe un guazzabuglio, ma se ricordiamo che HD44780 gestisce due linee e non quattro, vediamo che la distribuzione su 4 linee è una combinazione tra il fatto fisico-geometrico e gli indirizzi della RAM; per il controller si tratta sempre e solo di due linee, la prima linea che va da 00h a 27h e la seconda inizia da 40h e finisce a 67h. Dunque, questo fa partire la linea 2 fisica e logica a 40h e non a 14h !
In pratica è come se un display a 4 linee sia composto da due display a due linee sovrapposti.

Quando la prima linea è piena, il successivo carattere sarà indirizzato alla terza line e solo con l' incremento automatico da 27h a 40h, il nuovo carattere sarà scritto all' inizio della seconda linea, per continuare poi sulla quarta.
Se si vuole ottenere una visualizzazione coerente sulla sequenza delle righe è necessario, esaurita una riga, puntare all' inizio della successiva cambiando il valore di AC; il programma di gestione del display dovrà tenere traccia degli indirizzi di DDRAM. Questo può rendere la gestione del display un po' più complicata.


Per display con 4 linee da 40 caratteri, quindi con 160 caratteri visualizzati, si ha a che fare con due display da 2 linee di 40 caratteri sovrapposti, in quanto occorre un doppio set di HD44780 + HD44100 per ogni gruppo di 80 caratteri.
Sul connettore ci saranno allora due pin E, ognuno dei quali da accesso ad uno dei due gruppi, che vanno gestiti separatamente.

Consideriamo ora display che hanno una visualizzazione inferiore ad 80 caratteri.

Un display a 2 linee da 20 caratteri ciascuna può essere considerato come una metà di un display 4 x 20: il problema essenziale è che sia la prima che la seconda linea visualizzano la metà delle locazioni DDRAM disponibili.

È importante comprendere che la mappa di memoria del controller, inizializzato su due linee, è sempre la stessa, ovvero la prima linea inizierà a 00h e terminerà a 27h e la seconda andrà da 40h a 67h.
Ne risulta che solo i dati immagazzinati da 00h a 13h saranno visualizzati sulla prima linea e quelli da 40h a 53h sulla seconda.

Se inviamo un carattere al display e l' AC si trova in posizione 13h, il carattere seguente viene depositato nella locazione 14h, che non è visualizzata.

Questo non vuol dire che i restanti bytes della DDRAM non possono essere utilizzati: indica semplicemente che una linea ha solo 20 caratteri visualizzabili: gli indirizzi di DDRAM che non hanno posizione corrispondente sul display possono essere visualizzati facendo scorrere la linea con il comando opportuno. In sostanza lo shift della linea è come se applicasse una finestra scorrevole sulla DDRAM che appartiene alla linea, pari alla lunghezza dei caratteri visualizzabili.

Come nel caso precedente, se si vuole ottenere una visualizzazione "a pagina" occorre, esaurita una riga, puntare all' inizio della successiva cambiando il valore di AC. Oppure si può ricorre a scritte scorrevoli facendo shiftare le linee.

Del tutto analogo il discorso per un display a due linee da 16 caratteri.

il primo carattere in alto a sinistra, nella posizione iniziale chiamata Home, corrisponde al dato conservato all' indirizzo 00h della DDRAM e l' ultimo della prima righa è quello all' indirizzo 0Fh. La seconda riga inizia con la locazione 40h e termina con la 4Fh. In queste condizioni HD44780 è in grado di memorizzare più caratteri (80) di quelli visualizzabili (in questo esempio, 32). 

La rimanente parte della DDRAM può essere comunque scritta e fatta scorrere con un comando apposito che permette alla riga di shiftare a destra o a sinistra.

Alcuni comandi consento di selezionare se sarà la riga o il cursore a scorrere sul display, permettendo così un' ampia serie di effetti di scrittura comune, testo scorrevole, scorrimenti in avanti e indietro, ecc.

La posizione del carattere corrente, che corrisponde a quella del cursore, è conservata in  AC , che, nell' impiego normale, corrisponde alla posizione del cursore.

Analoghe situazioni per altri formati a due righe.

Per i display con una sola riga, occorre che l' inizializzazione specifichi questo parametro.
In tal caso la memoria sarà organizzata su un' unica linea, con tutte le relative conseguenze per quanto riguarda indirizzi e shift.

Ci possono essere però dei problemi con i display a 16 caratteri su una riga in quanto possono essere organizzati sia come una riga da 16 che come due righe da 8 caratteri geometricamente successivi, ma non logicamente.

La soluzione apparentemente più logica è quella di assegnare al primo carattere l indirizzo 00h e all' ultimo 0Fh. Non si tratta però della soluzione più comune.
Anche qui la parte non visibile della DDRAM può essere shiftata sul display, ma questo formato, come 8x1 o 12x1), dal momento che è stata inizializzata una sola linea,  si presta molto meglio ad essere utilizzato per la sua reale ampiezza, come display per brevi messaggi, strumentazione, orologi, termometri 
Nel caso più comune si tratta delle solite due linee della mappa di memoria già vista, di cui, meccanicamente, i primi 8 caratteri visualizzano gli indirizzi da 00h a 07h e i successivi 8 gli indirizzi da 40h a 47h. 
Ovvero il display ha   solo una singola riga di caratteri, ma per il controller ce ne sono due. In questo caso il display va inizializzato come se fosse a due linee: in caso contrario metà del display non sarà visibile.

Da osservare che alcuni display possono avere assegnazioni di memoria  diverse dallo standard generale.
In particolare, la mappatura della memoria può essere anche diversa da prodotto a prodotto, sopratutto se non è usato l' HD44780 originale, ma un altro dei suoi omologhi.

Quindi occorre sempre dare uno sguardo al foglio dati del componente specifico per non doversi trovare in difficoltà con la gestione software.

Una nota finale.

Nulla vieta di utilizzare la DDRAM non visualizzata come una memoria generica, ricordando che il suo accesso è più macchinoso rispetto ad una RAM normale e che si tratta appunto di RAM, ovvero di memoria volatile.


 

 


  • Copyright © afg. Tutti i diritti riservati.
    Aggiornato il 12/01/13.