Tutorials - Elettronica

 

 

LCD con caratteri a matrice


I caratteri a matrice

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.

Quindi, una prima semplificazione è stata quella di disporre geometricamente i punti visibili in matrici a 7 linee (C1-C7) e 5 colonne, con una ottava linea (C0) dedicata al cursore. Tra ogni matrice e la successiva, come tra ogni linea e la seguente, c'è uno spazio tale da rendere ben definiti i caratteri visualizzati.

Va compreso che per il controller l' accensione di un punto piuttosto che di un altro non ha alcuna relazione con quanto vediamo visualizzato leggendolo come una lettera dell' alfabeto o un numero. Il controller vede esclusivamente una matrice e "accende" i punti che gli viene imposto di accendere. Così, al posto dei punti potremmo costruire dei segmenti o sagomare le aree attivabili in qualunque modo si desideri.
Si è però rilevato che, per rappresentare abbastanza chiaramente le lettere dell' alfabeto latino e anche molti segni di altri alfabeti, la matrice 5x7 (o la più grande 5x10) è una delle vie migliori, compromesso tra la semplificazione di simboli visualizzati schematicamente e quella dei relativamente pochi punti utilizzati. Se facciamo un confronto con i display a 7 segmenti, nati principalmente per presentare cifre numeriche o dei display a 16 segmenti, evoluzione dei primi con lo scopo di presentare anche caratteri alfabetici, ci possiamo fare una idea delle possibilità ben maggiori che si hanno usando i 35 elementi della matrice 5x7 (40 se consideriamo la matrice come 5x8, comprendendo anche la linea più bassa). 

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.

Il CG, dunque, è un "convertitore" hardware dal codice ASCII, composto da 8 bit, ai 40 bit necessari per accendere la matrice 5x8.

Per comprendere correttamente la funzione essenziale del CG possiamo provare a tracciarne un diagramma:

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


     

     


  • Copyright © afg. Tutti i diritti riservati.
    Aggiornato il 04/08/15.