LCD con caratteri a matrice
|
Siccome sono possibili scritture di dati o di indirizzi della
RAM, questo avviene semplicemente sotto controllo della linea RW=0, mentre RS
indica se si stanno scrivendo dati o indirizzi.
Una scrittura di dati richiederà RS=1:
Istruzione |
Controllo |
Bus |
Funzione |
RS |
R/W |
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
Scrittura dato |
1 |
0 |
Dato da scrivere |
Scrive un dato nella CGRAM o nella DDRAM |
|
Così si può trasferire un intero byte (8 bit), dato che il
bus conterrà solamente questo. Si può scrivere sia nella
CGRAM che nella DDRAM, ma non esiste nell' operazione un selettore per le due
aree. Questa selezione va fatta in precedenza indicando un indirizzo. Quindi:
Prima della scrittura della RAM occorre avere selezionato a quale RAM
ci si riferisce, inviando un comando di indirizzo (Set Address).
|
Se il comando riguarda la CGRAM, la successiva scrittura sarà
diretta lì; e così per la DDRAM.
Quindi una scrittura di un dato in RAM richiede la sequenza: Scrivere
indirizzo della CGRAM o DDRAM
Scrivere il dato da memorizzare
Se si è puntata la CGRAM, la scrittura avverrà in questa; lo
stesso per la DDRAM.
Per la lettura dei dati dalla RAM non sono impiegate particolari
istruzioni, ma l' operazione è governata via hardware dallo stato delle linee RS e R/W:
Istruzione |
Controllo |
Bus |
Funzione |
RS |
R/W |
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
Lettura
BF e indirizzo |
0 |
1 |
BF |
AC - Address Counter |
Lettura Busy Flag e
Address Counter
della locazione corrente |
Lettura dato |
1 |
1 |
Dato da leggere
|
Legge un dato dalla CGRAM o dalla DDRAM |
|
Ovvero, occorre portare il pin RW a livello alto per
effettuare le operazioni di lettura (Read).
E' quindi evidente che se la linea RW non viene usata nell'
interfaccia con il controller, NON sono possibili operazioni di
lettura dalla memoria del display.
Mantenendo RW a livello basso (collegato a Vss) sono possibili
solamente scritture.
|
Con RW a livello alto, RS è il selettore della lettura della RAM o
dello STATUS, che comprende il flag BF e il contatore AC. Se
il dato in CGRAM o in DDRAM è a 8 bit, l' indirizzo del contatore AC è a
soli 7 bit, per cui il costruttore ha aggiunto come settimo bit il flag BF:
Read busy flag & address |
RS=0
RW=1 |
|
Read data from CGRAM |
RS=1
RW=1 |
|
Anche per la lettura occorre fare una osservazione importante:
si può leggere sia dalla CGRAM che dalla DDRAM, ma non esiste nell'
operazione un selettore per le due aree. Quindi:
Prima della lettura della RAM occorre avere selezionato a quale RAM ci
si riferisce, inviando un comando di indirizzo.
|
Se il comando riguarda la CGRAM, la successiva lettura sarà
diretta lì; e così per la DDRAM.
Quindi una lettura di un dato in RAM richiede la sequenza: Scrivere
indirizzo della CGRAM o DDRAM
Leggere il dato voluto
Se si è puntata la CGRAM, la lettura avverrà da questa; lo
stesso per la DDRAM.
Sul tema, alcune note importanti:
- Prima della lettura o scrittura della RAM occorre avere
selezionato a quale RAM ci si riferisce, inviando un comando di
indirizzo.
- Non sono possibili scritture o letture a burst, ma i dati sono
letti o scritti uno alla volta. Ma:
- La scelta di CGRAM o DDRAM resta quella
determinata dall' ultimo Set Address fino a che non viene
sostituita da un altro comando di Set Address.
- Quindi scritture successive in cui non è cambiata la specifica
della RAM, sono indirizzate a locazioni successive della stessa
area, dato che il contatore di indirizzo è incrementato
automaticamente dopo ogni lettura o scrittura
|
Questa situazione è molto comoda, ad esempio, nel caricamento
dei font in CGRAM, dove ogni carattere è costituito da 8 bytes successivi.
Allora basta puntare la locazione di inizio del carattere in CGRAM ed eseguire
8 scritture consecutive con gli 8 bytes necessari senza dover toccare
ulteriormente il puntatore dell' indirizzo delle locazioni, che avanza
automaticamente ad ogni scrittura.
In una serie di scritture o letture successive, ogni lettura o
scrittura è una operazione a se stante.
Quindi occorre verificare il flag di busy BF (se si utilizza
questo modo) oppure attendere il tempo necessario (se non si utilizza
il flag) tra ogni singola operazione. |
Ultima osservazione riguarda i tempi di esecuzione: le
operazioni di scrittura, tanto di dati quanto di comandi richiedono un certo
tempo in quanto:
-
i comandi che vanno
ad agire sul display richiedono tempi sensibili di esecuzione perchè, come abbiamo detto,
il display LCD è una periferica piuttosto lenta e il liquido nematico
richiede un certo tempo per assestarsi. I comandi di clear sono quelli che
impiegano il tempo maggiore di esecuzione e, di nuovo, la cosa è
comprensibile, ricordando che la cancellazione della visualizzazione è
effettuata scrivendo un 20h - ASCII space - in tutte le celle della DDRAM:
i controller degli LCD a caratteri sono dispositivi previsti per il minimo
consumo di corrente e quindi lavorano con frequenze di clock molto basse
(200-500 kHz), con cicli di istruzione piuttosto lunghi.
-
La scrittura in RAM è un accesso ai registri
interni dell' HD44780, il che richiede nanosecondi, ma è accompagnato dalla
necessità di aggiornare più punti e solitamente anche il display, per
cui la specifica indica qualche decina di micro secondi di attesa prima
del completamento delle operazioni interne.
-
In lettura, invece, si accede ai registri del controller
senza che questo debba effettuare alcuna altra operazione sul display e quindi basta
un tempo minore.
Ecco una tabella di riepilogo
dei comandi principali:
FUNZIONE
|
Hex
|
Dec
|
Clear Screen e cancellazione DDRAM |
1
|
1
|
Cursor home (senza cancellare) |
2
|
2
|
Entry mode set |
4-7 (vedere
dettagli sopra) |
Display non visibile (senza cancellare) |
8
|
8
|
Cursore non visibile |
0Ch
|
12
|
Cursore visibile |
0Eh
|
14
|
Cursore visibile e
lampeggiante |
0Fh
|
15
|
Muove cursore una posizione
verso sinistra |
10h
|
16
|
Muove cursore una posizione
verso destra |
14h
|
20
|
Scroll display
una posizione verso sinistra |
18h
|
24
|
Scroll display
una posizione verso destra |
1Eh
|
28
|
Function set (bus a 4 bit, 1
linea, font 5*7) |
20h
|
32
|
Function set (bus a 4 bit, 2
linee, font 5*7) |
28h
|
40
|
Function set (bus a 8 bit, 1
linea, font 5*7) |
30h
|
48
|
Function set (bus a 8 bit, 2
linee, font 5*7) |
38h
|
56
|
Posiziona
cursore nella DDRAM |
80h + addr
|
128 + addr
|
Posiziona puntatore
nella CG RAM |
40h + addr
|
64 + addr
|
Questi codici, elencati in esadecimale e nell' equivalente
decimale, inviati come comandi al controller HD44780 (RW = 0, RS = 0), avranno
come risposta le funzioni relative.
Il comando 0
In effetti i controller dovrebbero poter rispondere anche ad
un comando 0. Questo comando non è documentato nella
maggior parte dei fogli dati e la cosa è sensata in quanto esso non esegue
alcuna operazione sul display, se non quella di mandare busy il controller per
un tempo pari a quello dei comandi "brevi", cioè attorno ai
30-40us.
Ovvero, inviando 0x00 al display, si otterrà solamente di dover attendere un
certo tempo prima di poter eseguire un altro comando.
Quindi il comando 0 non presenta alcuna utilità nè teorica nè pratica (non
può essere usato neppure come riferimento di tempo in quanto il periodo di
busy dipende dal tipo di controller, dalla sua frequenza di clock, dalla
temperature, dalla tensione di alimentazione): non ha senso parlare di un
"comando 0".
|