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.
|