Qualsiasi
carattere che viene visualizzato sul
display è costituito da una matrice di 5
colonne per 8 o 11
linee.
Ad esempio, vediamo la struttura della matrice di un display a 8 caratteri
x 1 linea con matrice a punti 5x7 (1/4 Bias, 1/8 Duty) controllata da un S6A0069
di Samsung, un diretto compatibile dell' HD44780.
Certamente sarebbe possibile gestire separatamente punto per punto,
come accade nei display grafici, ma si tratterebbe di una inutile
complicazione dove la rappresentazione è limitata al
solo
testo o a caratteri semigrafici.
A questo proposito si potrebbe cominciare ad avere un inizio di
confusione tra la matrice 5x7 usata per i caratteri e la dimensione reale
della matrice che è 5x8.
In effetti 5x7 è la dimensione dei simboli che il controller visualizza
per default, essendo, come detto, l'ottava linea dedicata alla
presentazione del cursore, che appare come una "sottolineatura"
del carattere.
Questo è dovuto al fatto che, siccome i simboli alfanumerici sono
fissati da tempo nella loro forma grafica, per semplificare le
operazioni, il controller HD44780 contiene anche un character generator (CG).
Esso è costituito da una ROM al cui ingresso viene applicato il
dato ricevuto ed alla cui uscita corrisponde la matrice relativa al
carattere.
- sulle linee di comunicazione l' host invia 8 bit (nell' esempio 41h,
ovvero b'01000001' che corrisponde al carattere ASCII 'A').
Se i segnali RS e R/W sono corretti, HD44780 considera questo byte
come un dato da visualizzare e lo invia al CG
- Il CG rende per quel dato codice di 8 bit un pacchetto di 40 bit che
sarà organizzato in una matrice 5x8 di cui l' ottava linea è vuota
- il sistema di controllo trasferisce questi 40 bit in una cella della
DDRAM, puntata da un contatore di indirizzi AC
- il sistema di refresh del pannello fa si che i dati della DDRAM
siano riflessi nei corrispondenti pixel che formano un carattere. I
bit a 1 saranno visualizzati dall' LCD.
Quasi ognuna delle 256 combinazioni possibili di 8 bit
corrisponde nel CG ad una configurazione specifica di bit accesi o spenti;
ed è qui che si forma il carattere.
Il CG è essenzialmente una ROM da 9920 bit, che contiene lo schema di 208 caratteri nel formato
5x7 o 32 nel
formato 5x10.
La ROM è mascherabile
da parte del costruttore e, una volta realizzata, per quel dato chip
essa è fissa e incancellabile, il cui contenuto è inalterabile anche se
manca la tensione di alimentazione.
Può contenere diverse versioni di come i
caratteri ricevuti possono essere
visualizzati sul display. Ecco due esempi:
|
Pattern standard codice A00 di Hitachi. Questo set
contiene caratteri dell' alfabeto latino, di quello giapponese
semplificato e segni semigrafici, corrispondenti al set
ASCII.
Alcuni codici ASCII non sono previsti per dare origine a
visualizzazioni, essendo collegati a funzioni speciali. e se
richiamati con questa tabella originano un carattere vuoto.
In questa mascheratura i caratteri da 10h a 1Fh, da 80h a 8Fh e
da 90h a 9Fh non originano alcuna visualizzazione.
I caratteri da 00h a 0Fh sono indirizzati non alla
CGROM, ma alla parte RAM programmabile del CG, detta CGRAM, per
ospitare caratteri custom creabili dall' utente.
Dal foglio dati del componente è possibile rilevare quali set di
caratteri offre il costruttore, dato che normalmente dispone di parecchi
set di caratteri installabili sullo stesso modello di display e
identificati da una stringa nel codice del prodotto.
|
. |
E' importante verificare se il codice del display che si sta
usando contiene il set di caratteri voluto. Ad esempio,
Hitachi offre una altro set di caratteri denominato Pattern Standard
A02. Qui i codici non visualizzabili del set precedente sono
collegati altri caratteri (in questo caso dell' alfabeto cirillico
e altri segni semigrafici) che, arbitrariamente, si troveranno
collegati a quel codice.
La possibilità di mascherare a piacere - nei limiti delle
dimensioni della matrice- caratteri di ogni genere permette di
disporre di set alfanumerici o semi grafici, anche per altri alfabeti
e il costruttore
potrà mascherare qualsiasi altra possibile combinazione a seconda delle
necessità dell' utilizzatore.
A questo proposito va detto che la mascheratura della ROM può
essere richiesta da chiunque, ma i costruttori hanno minimi di
ordine tali da poter interessare solamente i grossi utenti (OEM). |
Vediamo in una diversa forma la struttura di un set base del CG,
disponibile comunemente sui display venduti in Europa occidentale:
LSN
MSN |
x0 |
x1 |
x2 |
x3 |
x4 |
x5 |
x6 |
x7 |
x8 |
x9 |
xA |
xB |
xC |
xD |
xE |
xF |
0x |
cg0 |
cg1 |
g2 |
cg3 |
cg4 |
cg5 |
cg6 |
cg7 |
cg0 |
cg1 |
g2 |
cg3 |
cg4 |
cg5 |
cg6 |
cg7 |
1x |
non definiti o caratteri semigrafici
(dipendenti dal set) |
2x |
|
! |
" |
# |
$ |
% |
& |
' |
( |
) |
* |
+ |
, |
- |
. |
/ |
3x |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
: |
; |
< |
= |
> |
? |
4x |
@ |
A |
B |
C |
D |
E |
F |
G |
H |
I |
J |
K |
L |
M |
N |
O |
5x |
P |
Q |
R |
S |
T |
U |
V |
W |
X |
Y |
Z |
[ |
** |
] |
^ |
_ |
6x |
' |
a |
b |
c |
d |
e |
f |
g |
h |
i |
j |
k |
l |
m |
n |
o |
7x |
p |
q |
r |
s |
t |
u |
v |
w |
x |
y |
z |
|
|
|
|
|
8x |
non definiti o caratteri semigrafici
(dipendenti dal set) |
9x |
non definiti o caratteri semigrafici
(dipendenti dal set) |
Ax |
caratteri semigrafici
(dipendenti dal set)
o alfabeti alternativi (KANA, greco, ecc) |
Bx |
Cx |
Dx |
Ex |
caratteri di alfabeti alternativi (KANA, greco,
nordico, ecc) |
Fx |
In sostanza, vediamo che la base della tabelle caratteri dei CG fa riferimento direttamente al codice
ASCII come corrispondenza tra valori esadecimali
in ingresso e il carattere presentato in uscita.
E, nei set "europei" o di uso generale come quelli sopra
esemplificati, i codici esadecimali tra 20h e 7Fh corrispondono agli
equivalenti caratteri del set ASCII-alfabeto latino e cifre arabe, con
qualche segno speciale.
Per i codici da A0h a FFh, nel set base 00 ci sono caratteri KANA
(giapponese ridotto) e caratteri greci, ma possono essere usati in altri
set per semigrafici o caratteri di altre lingue, come greco, cirillico,
vocali accentate, ecc., come quelli presenti nel set 02.
Pure tutto il contenuto del GC può essere modificato dal costruttore a
seconda delle richieste del committente.
Nei set di caratteri ora visti, ad esempio, inviando come dato il codice 41h il display
presenterà la lettera A; inviando il codice 61h si otterrà
la lettera a.
Grande! Inviamo il codice ASCII di una
"Q" e il display visualizzerà la Q; inviamo il codice ASCII di
"$" e il display visualizzerà $, senza alcun altra operazione
da parte nostra.
Però la CGROM è prefissata dal costruttore ed è inalterabile (ROM=
Read Only Memory, ovvero memoria a sola lettura, senza possibilità di
modifica) e può essere necessario all' utente disporre di caratteri che
non sono presenti in quella particolare versione della ROM, ma, nello
stesso tempo, l' utente può non essere delle dimensioni tali da potersi
far produrre una serie (migliaia di pezzi..) con un CG secondo le sue
necessità.
Il costruttore di HD4780 ha previsto una soluzione anche per questo
problema.
La CGRAM
In effetti il CG è composto di due parti:
- la CGROM appena descritta e
- la CGRAM, con la capacità di 64 bytes
Il CG comprende quindi una parte RAM, (Random Access Memory, leggibile e riscrivibile), che ha la funzione di fare da deposito per
un set di 8 caratteri 5 x 8 o 4
caratteri 5 x 11 che l' utente può creare, scrivendoli
nella memoria stessa.
CGROM è una area di memoria fissa, CGRAM è un' area
di memoria leggibile e scrivibile.
Il meccanismo di accesso è semplicissimo (per l' utilizzatore): per disporre di caratteri diversi, ad esempio per
comporre una barra o aggiungere frecce, separatori o altro, i codici da 00h a 0Fh, che
non sono caratteri
visualizzabili secondo la tabella ASCII, vengono deviati dalla ROM alla CGRAM.
Quindi, nel momento in cui invio il dato da visualizzare 21h, la logica
interna al controller invia questo dato alla CGROM per la decodifica. Se
invio il dato 01h, la logica lo invia per la decodifica alla CGRAM.
Come si vede nella tabella precedente, i sedici indirizzi da 00h a 0Fh
sono indirizzi di CGRAM, ma si tratta di soli 8 indirizzi utili, essendo
duplicati; ovvero 00h equivale a 08h e così via.
Se la CGRAM non è caricata dall' utente, il suo contenuto dopo il reset sarà un
carattere non visualizzato, corrispondente ad uno spazio sul display.
Però l' utente può caricare queste celle con qualsiasi combinazione
possibile della matrice e far quindi apparire caratteri o segni diversi da
quelli contenuti nella ROM del CG.
Molto importante ricordare che anche questa RAM è una memoria volatile.
- Il set di
caratteri conservato nella ROM è fisso e non cancellabile,
ma
- il set di caratteri extra caricato
in CGRAM va perduto al momento della
mancanza di tensione e deve essere ricaricato in uso successivo.
|
Nella matrice, ad esempio 5 x 8, i 40 pixel potranno essere
"accesi" portando a livello 1 il bit relativo nella RAM.
Così anche i pixel dei caratteri extra corrispondono a bit nella memoria CGRAM.
Ogni linea corrisponde ad 1 byte, anche se si
tratta di soli 5 bit realmente impiegati.
|
Ogni punto in una riga, corrispondendo ad un bit, ha lo stesso
valore binario di posizione del bit.
Quindi, per accendere pixel in modo da rappresentare la cifra 6,
occorrerà caricare di seguito i seguenti valori esadecimali:
0Eh,
10h, 10h, 1Fh, 1Bh, 1Bh, 1Fh, 00h
|
|
Qui potrebbe sorgere un primo dubbio sulla dimensione della matrice:
5x7 o 5x8 ?
La matrice, geometricamente, è costituita da 8 righe di 5 punti ciascuna.
Tutti sono visualizzabili, ma mentre i set standard della CGROM sono
predisposti per rendere simboli visibili da 5x7 e questi non sono
alterabili dall'utente, nella CGRAM l' utente, se lo ritiene, può
scrivere anche l' ottava riga con elementi visualizzabili, ovvero con i
relativi bit a 1. Ovviamente, se è presente il cursore, questo si
sovrapporrà all' ottava riga e di questo va tenuto conto per la
comprensibilità del simbolo.
Si sovrapporrà, ma solo nella
visualizzazione, perchè il contenuto della CGRAM resta invariato fino a
che non viene sovrascritto dall' utente o viene a mancare la tensione di
alimentazione.
E, in effetti, scrivendo un carattere in CGRAM si potranno scrivere
anche solo le prime 7 righe, dato che l' ottava è già azzerata. Se però
precedentemente è stata scritta anche questa, per modificarla occorrerà
sovrascriverla.
Allo scopo di evitare un lavoro
manuale che potrebbe essere impreciso, esistono sul WEB numerose utilities
per facilitare la preparazione dei codici relativi ai caratteri che l'
utente può caricare in CGRAM. Ad esempio:
|
Nell' immagine sopra, il prompt del calcolatore di Proton
che fornisce un supporto per gli 8 caratteri programmabili in CGRAM e
indica il relativo codice in BASIC che dovrà essere caricato
per scrivere quella locazione. Un pannello con la matrice 5 x 8 permette di selezionare in modo
grafico con il mouse i pixel da accendere, in modo da avere una pre
view di come sarà il carattere presentato dal display. |
Nell' esempio qui sopra sono scritte tutte e 8 le righe che compongono
il carattere, quindi 8 bytes. I primi due bytes della riga di PRINT
corrispondono ai comandi necessari per accedere alla prima locazione (0)
della CGRAM.
Occorre forse una ulteriore nota di chiarimento per quanto riguarda la differenza tra CGROM e
CGRAM che potrebbe essere non di immediata comprensione:
-
CGROM, come visto prima, riceve 8 bit e rende i 40
pixel del carattere.
Quindi, il richiamo di un carattere fissato nella CGROM richiede solamente
l' invio del byte voluto.
Non è necessaria alcuna scrittura preliminare per creare i caratteri:
essi sono sempre disponibili.
E non occorre alcun calcolo o operazione per posizionare i pixel attivi
nella loro giusta posizione, dato che questo lavoro è eseguito dal CG e
dalla sua circuiteria di controllo.
Ad esempio, inviando al controller il byte 61h si otterrà
immediatamente la scrittura della a minuscola.
-
Anche CGRAM riceve 8 bit e rende i 40
pixel del carattere. Ma le celle della CGRAM, all' arrivo della tensione di alimentazione sono
vuote e non contengono caratteri.
I caratteri vanno creati dall'
utente prima di utilizzarli.
Trattandosi di una RAM, quanto scritto andrà
perso se manca la tensione e sarà necessario riscrivere per un nuovo uso.
Per contro, quanto scritto non è fissato in modo definitivo, ma, anche
durante il funzionamento del modulo, l' utente può cambiarne il
contenuto.
CGRAM richiede un intero byte in scrittura per formare una sola linea
della matrice del simbolo, ovvero il caricamento di un carattere
in CGRAM richiede 8 scritture di 1 byte ciascuna, una per ogni
linea della matrice (5x8), dato che, come abbiamo visto ora, un carattere nella matrice 5x7 (in effetti si
tratta di un 5x8 di cui l' ottava linea è dedicata al cursore) è
composto da 40 bit, ovvero 8 bytes per ognuna delle 5 linee.
Dal punto di vista dell' interfaccia utente, una volta effettuata la
scrittura del simbolo voluto nella CGRAM, il richiamo del carattere
consiste semplicemente, come per la CGROM, all' invio di un codice a 8
bit.
Questi codici corrispondono ai codici iniziali della tabella di CGROM,
ASCII non visualizzabili, ma non sono presenti nella CGROM: la richiesta
di quel codice viene dirottata verso la CGRAM, che si sotituisce alla
CGROM.
Quindi il sistema di viusalizzazione finale è identico per entrambi i due
segmenti del CG.
L' ampiezza della CGRAM è pari a 8 caratteri per 8 bytes
ciascuno, ovvero 64 bytes. Certamente limitata per effetti grafici
complessi, ma va ricordato che questo tipo di display è previsto per
presentare essenzialmente messaggi alfa numerici e le possibilità
grafiche sono limitate dalla semplicità della struttura.
La CGRAM si estende dall' indirizzo 00h all'
indirizzo 3Fh ed è
accessibile con un comando dedicato, analogamente alla DDRAM.
Il suo contenuto è così organizzato:
CGRAM |
Indirizzo |
Contenuto |
|
Indirizzo |
Contenuto |
00h-07h |
8 bytes del carattere 0 |
|
20h-27h |
8 bytes del carattere 4 |
08h-0Fh |
8 bytes del carattere 1 |
|
28h-2Fh |
8 bytes del carattere 5 |
10h-17H |
8 bytes del carattere 2 |
|
30h-37H |
8 bytes del carattere 6 |
18h-1Fh |
8 bytes del carattere 3 |
|
38h-3Fh |
8 bytes del carattere 7 |
La corrispondenza tra contenuto della CGRAM e carattere è quella vista
prima e anche schematizzabile così
Il byte di peso minore corrisponde alla prima riga (superiore) del
carattere e l' ultimo byte corrisponde alla ottava riga del carattere
(lasciata normalmente a 0 per ospitare il cursore, ma che può essere
benissimo occupata, dato che un eventuale cursore si sovrappone alla
visualizzazione del carattere senza modificarne la matrice in RAM).
Da notare che, essendo i punti visibili solo 5 per riga, i bit da 5
a 7 di ogni bytes non sono utilizzati.
Ma siccome le operazioni di scambio dati con il controller del display
sono organizzate su 8 bit, anche se solo 5 bit sono utilizzati, occorre
trasferire 1 byte per ogni riga del carattere, con i bit da 5 a 7 che sono
scartati al momento dell' inserimento nella cella di memoria della CGRAM.
Per riassumere e ripetere ancora una volta questo apparente garbuglio di
bit e byte, evidenziamo i punti chiave, che sono:
- tutti i codici da 20h a FFh corrispondono ad un simbolo nella CGROM;
inviandoli come dati renderanno visibile il carattere corrispondente,
che dipende da quanto fissato dal costruttore nella ROM
- tutti i codici da 00h a 07h sono deviati alla CGRAM che utilizza il
suo contenuto che è scritto a cura dell' utente. Se non è stato
scritto nulla, verrà visualizzato uno spazio.
- quando l' utente scrive la CGRAM, ovvero crea il carattere che gli
è necessario, deve inviare 8 bytes consecutivi che formano il
carattere voluto, di cui solo i primi 5 bit (da 0 a 4) saranno quelli
utili
Uno dei vantaggi della CGRAM è
che si rende
possibile cambiare quando
si vuole il suo contenuto e quindi variare il set di caratteri extra
durante il funzionamento del display.
Va tenuto però presente che i tempi di esecuzione
del controller sono piuttosto lenti: il
suo clock è dell' ordine delle
centinaia di kHz e una operazione richiede molti microsecondi, che, rispetto al ciclo di istruzione del microcontroller
che governa il processo, sono molto lunghi. Però si deve considerare che
il display è una interfaccia tra uomo e macchina e per i tempi di
risposta "umani", la velocità del display è più che
adegauata.
Sia che si tratti di caratteri decodificati dalla CGROM che dalla CGRAM, la posizione del carattere sul display corrisponde ad un indirizzo
della DDRAM.
Allo scopo di mantenere sotto controllo la presentazione del
testo e la posizione del cursore occorre mantenere sotto controllo ii
contatore di indirizzi AC , che viene aggiornato ad ogni operazione di scrittura.
Il valore corrente dell' AC può essere letto con una opportuno comando.
Ulteriori informazioni le trovate qui.
Il cursore
Qualche parola sul cursore.
Questo segno, che accende i 5 pixel dell' ottava riga della matrice,
indica la posizione in cui sarà scritto il prossimo carattere.
Dal punto di vista grafico si tratta di una "sottolineatura"
del carattere, che è possibile visualizzare o meno a volontà dell'
utente.
|
Esiste anche una modalità "lampeggiante" (blinking)
in cui il cursore assume il controllo di tutti i pixel della
matrice, accendendoli e spegnendoli con una certa cadenza (0.4 s
circa), che dà
l' impressione di lampeggio.
Come per il cursore a sottolineatura, esso si sostituisce ai
pixel spenti del carattere, ma non lo cancella e quindi alla vista
appare alternativamente il carattere o il rettangolo completamente
scuro. |
Anche questa funzione è programmabile in qualsiasi momento dall'
utente, con l' invio degli opportuni comandi al display.
Quindi, per riassumere, il cursore può essere comandato come:
- non visibile
- visibile come sottolineatura
- visibile come lampeggio
Il cursore può, inoltre scorrere a mano a mano che i caratteri sono
scritti sul display oppure restare fisso in un punto mentre è la riga di
testo a scorrere. Questo consente vari "effetti" nella
presentazione dei messaggi. Ad esempio è possibile una scritta tipo
banner in movimento oppure una scrittura occidentale da sinistra a destra
o una orientale da destra a sinistra.
Per chiarire meglio, anche se il cursore non è visibile, sono comunque
possibili lo scorrimento del testo o della riga: semplicemente il cursore
è assente dalla visualizzazione. Anche se non visibile, il cursore è collegato alla posizione corrente nella DDRAM,
ovvero all' Address Counter (AC).
La matrice 5x11
HD44780 ha la possibilità di presentare caratteri anche nella forma di
matrice 5 x 11.
Nel caso in cui si voglia utilizzare questa modalità, occorre
dichiararla nell' inizializzazione del display che lavorerà in questo
modo. Questa scelta non può essere modificata durante il funzionamento
e necessita di una nuova inizializzazione per essere cambiata.
La matrice 5x11 richiede l' impiego di due locazioni di CGRAM per
definire ogni simbolo, per cui la sua capacità si riduce a 4 simboli.
Quindi, una volta impostata questa modalità, la CGRAM si organizzerà in
blocchi da 5x11.
|
Il carattere creato in questa matrice, avendo a disposizione
più punti, potrà avere più variazioni che non quello della più
piccola matrice 5x8. Per contro impegna più memoria (anche se i
tempi di esecuzione dei comandi sono gli stessi).
La riga più bassa è sempre preferibilmente dedicata al
cursore-sottolineatura e viene generalmente lasciata vuota, ma,
come per la matrice più piccola, può comunque essere scritta: il
cursore in undicesima riga si sovrapporrà al carattere. |
Questa matrice, a causa della geometria con cui sono realizzate le
matrici, non è disponibile in tutti i modelli di display e in
altri utilizza parte della seconda riga, che diventa quindi non altrimenti
utilizzabile.
E' relativamente poco usata, perchè, nonostante possa generare caratteri
di altezza maggiore o di maggiore complessità, non sempre dà risultati
esteticamente gradevoli, essendo la geometria del display pensata per il
5x8, oltre a consentire un minore numero di caratteri custom in CGRAM, con
una leggera complicazione nell' uso.
In ogni caso, inizializzando il display per il set 5x11, sarà
possibile rendersi conto direttamente delle possibilità e dei limiti di
questo modo.