LCD a matrice di punti compatibile HD44780

Indice

- Introduzione
- Foto del circuito
- Il trasmettitore
- Il ricevitore
- Forme d'onda
- Teoria degli oscillatori
- Lo stadio oscillatore
- I filtri attivi
- Il filtro passa-banda
- Le antenne
- I circuiti risonanti
- Progettazione antenna
- Modulazione ASK-OOK
- Demodulazione AM
- Mo-demodulatori
- Gli amplificatori
- Gli stadi amplificatori
- I disturbi
- Il display LCD
- Il PIC16F84
- Protocollo di trasmissione
- L'interfaccia RS-232
- Datasheet componenti
- Ringraziamenti

## LCD a matrice di punti compatibile HD44780

Per la visualizzazione dei dati ricevuti via radio, il ricevitore dispone di un visualizzatore a matrice di punti a cristalli liquidi da 2 righe e 16 caratteri per riga, al quale vengono inviati i dati dopo essere stati elaborati ed interpretati dalla circuiteria analogica e dal PIC. Siccome il PIC ricevitore utilizza solo le linee RA per le comunicazioni con la sezione analogica, le linee RB vengono utilizzate allora per comunicare con l'LCD con un bus dati a 8bit. Infatti questo modulo LCD può accettare dati anche in formato a 4bit, con le modalità descritte di seguito. Ciò semplifica di molto la scrittura del codice per il PIC permettendo di dedicare più spazio ad altre routine.
Il visualizzatore è, in realtà, solo la parte più appariscente di un modulo LCD e, spesso, si tende a confondere il primo con il secondo. Di certo il display LCD è assolutamente inutile senza un circuito elettronico in grado di gestirlo e, dato l'oneroso compito a cui è chiamato, sembra improbabile solo pensare a realizzarlo con componenti discreti. Per questo il mercato offre strutture integrate (moduli) dotate di tutto ciò che serve, montato su un circuito stampato; da un lato è saldato il display e sul lato opposto sono presenti numerosi componenti, tra cui circuiti integrati. Certamente il più importante tra questi è il controller, un componente programmabile con una duplice funzione:

- dispone della struttura necessaria per gestire fino a 50 (10 * 5) pixel per ciascuno dei possibili caratteri alfanumerici del display, organizzati su una o più righe;
- assicura l' interfaccia intelligente tra il visualizzatore e il processore o il microcontrollore chiamato a gestirlo.

Il controller di gran lunga più diffuso ed utilizzato sul mercato è senz'altro il controller HD44780 della Hitachi, quasi uno standard per questi oggetti. Questa sezione si occupa appunto di descrivere la struttura, il funzionamento e l'utilizzo di questo controller.

### Piedinatura del modulo LCD

N. Pin | Nome | I/O | Descrizione
1 | Vss | Power | Massa
2 | Vcc | Power | +5V
3 | Vo | Analog | Regolazione contrasto
4 | RS | Input | Selezione dati/istruzioni
5 | R/W | Input | Read/Write
6 | E | Input | Abilitazione
7 | D0 | I/O | Dati LSB
8 | D1 | I/O | Dati
9 | D2 | I/O | Dati
10 | D3 | I/O | Dati
11 | D4 | I/O | Dati
12 | D5 | I/O | Dati
13 | D6 | I/O | Dati
14 | D7 | I/O | Dati MSB
15 | A | Power | Retroilluminazione (+)
16 | K | Power | Retroilluminazione (GND)

Tab.1 - Assegnazione Pin

I pin 1 (Vss) e 2 (Vcc) servono per fornire alimentazione (5 volt); di solito l'assorbimento è contenuto, dell'ordine di pochi mA.
Il pin 3 (Vo) è un ingresso analogico al quale si deve fornire una tensione compresa tra 0 e 5V al fine di regolare il contrasto del display, cioè la capacità di rendere più o meno scuri i pixel attivi, per rendere migliore la visualizzazione, in funzione della luminosità dell’ambiente, del display; di solito la regolazione si ottiene con un potenziometro da 10k.
Il pin 4 (RS), detto Register Selector, indica la natura dell’informazione presente sul bus dati: se viene forzato a 0 il byte in ingresso sarà interpretato come un comando da eseguire (istruzione), mentre con un 1 sarà ritenuto dato da interpretare.
Il pin 5 (R/W) specifica la direzione dei bytes sul bus: se vale 0 si sta scrivendo nella memoria interna LCD, mentre con un 1 questa memoria è sottoposta a lettura.
Il pin 6 (E) è il segnale che abilita il dispositivo: quando è a livello alto sincronizza la lettura del dato o del comando predisposto sul bus dati. L'Enable è il vero e proprio segnale di sincronismo, da forzare a 1 quando il dispositivo è pronto a gestire un dato o un comando predisposto sul bus dati (in funzione del valore del busy flag: finché il suo valore è 1 il controller è occupato a gestire i trasferimenti interni e non è in grado di accettare l'istruzione successiva).
I pin dal numero 7 al numero 14 (D0-D7) rappresentano il Data Bus su cui avviene la trasmissione o ricezione dati dal display, in base all’operazione che si sta svolgendo.
Talvolta sono presenti 2 pin aggiuntivi (pin 15 e 16), mediante i quali è possibile alimentare l'eventuale luce di retroilluminazione.

### Risorse interne del modulo LCD

#### ROM del generatore di caratteri

Questa struttura si basa sulla presenza di una capace memoria CGROM (Character Generator Read Only Memory), contenente i font dei 208 caratteri da 5x8 punti (8320 bit) e dei 32 caratteri da 5x10 punti (1600 bit). Il codice del carattere che si desidera visualizzare, fornito come dato al controller, consente di localizzare la matrice di punti corrispondente all'interno di questa memoria a sola lettura, in accordo con la seguente tabella:

Tab.2 - Codici carattere per matrice 5x8

#### RAM del generatore di caratteri

Il controller mette a disposizione 8 bytes di CGRAM (Character Generator Random Access Memory). In queste locazioni è possibile provvedere alla ridefinizione di caratteri da programma; i codici di dato in grado di puntare queste nuove matrici di punti sono quelli da 00H a 0FH, evidenziati dalla prima colonna a sinistra, nella precedente tabella.

#### RAM per i dati del Display

Sono disponibili 80 bytes di memoria DDRAM (Display Data Random Access Memory) sufficienti per memorizzare altrettanti codici ad 8 bit, cioè caratteri. Il generatore interno è in grado di localizzare il dato all'intero della CGROM e visualizzarlo sul display in una determinata posizione.
Ciascun carattere occupa una posizione ben precisa dentro la memoria DDRAM, indicata dal numero esadecimale del suo indirizzo; la loro sequenza varia in funzione della dimensione del visualizzatore presente sul modulo, o più precisamente in funzione del loro numero di linee e del numero di caratteri per linea. Le locazioni utili per il display utilizzato vanno da 0x80 a 0x8F per la prima riga e da 0xC0 a 0xCF per la seconda riga.
Le locazioni di memoria non utilizzate per la visualizzazione dei caratteri possono essere usate in modo convenzionale, come normali locazioni RAM.

#### Registri a 8 bit:

I registri a 8bit sono 2: l'IR e il DR
L'IR (Instruction Register), a sola scrittura, ha il compito di memorizzare i codici delle istruzioni di controllo della visualizzazione, come quelle destinate alla gestione del cursore o all'indirizzamento delle 2 RAM. Il DR (Data Register) è invece il registro di transito delle informazioni.
Il comportamento di questi due registri varia a seconda che siamo in modalità lettura o modalità scrittura. Nelle operazioni di scrittura una precedente scrittura di un indirizzo in IR specifica in quale locazione di una delle 2 RAM (CGRAM oppure DDRAM) verrà trasferito automaticamente il dato non appena il processore scrive in DR. Nelle operazioni di lettura una precedente scrittura di un indirizzo in IR provvede a trasferire automaticamente il dato in DR dalla specificata locazione di una delle 2 RAM. La lettura di DR da parte del processore attiva anche il trasferimento interno automatico di un nuovo dato dalla locazione di una delle 2 RAM puntata dall'indirizzo successivo, in attesa della prossima effettiva lettura da parte della CPU.
Dei 2 Registri quello coinvolto in queste operazioni dipende dal valore del segnale RS, che troveremo anche tra quelli presenti sul connettore del modulo LCD. Con RS a 1 il registro coinvolto in lettura o scrittura è DR e l'informazione scambiata è un dato per o da una delle 2 RAM; con RS a 0 il registro coinvolto è IR, ma solo in scrittura (del codice di una istruzione).
L'eventuale lettura da parte del processore mette a sua disposizione il valore corrente del contatore d'indirizzo (i 7 bit meno significativi, DB6-DB0) e quello del busy flag, cioè in sostanza dello stato del controller (entrambe queste risorse sono descritte qui di seguito).

#### Il Busy Flag

Il controller LCD richiede del tempo per eseguire le istruzioni o la scrittura di un dato, e quando riceve qualcosa fa partire le sue routine operative internet che richiedono tempo. Durante questo tempo il controller è occupato e non interpreterà nient'altro di quello che gli verrà inviato. Per questo è necessario aspettare nu po' prima di inviare nuovamente dati al modulo. E' impossibile sapere quanto tempo occorrerà per l'esecuzione di queste operazioni, che dipendono dal tipo di controller, dal tipo di operazione, dalla frequenza di clock del controller.
Il controller mette allora a disposizione un bit, chiamato Busy Flag che viene posto sulla linea D7 dopo un'istruzione di lettura. Un livello alto su questa linea significa che il controller è ancora occupato, un livello basso indica che il controller ha finito le precedenti operazioni ed è pronto per ricevere altri dati.
La routine che gestirà le comunicazioni con il display dovrà anche poter controllare questo flag, al fine di evitare errori di scrittura sul display o errata interpretazione dei dati.

### Temporizzazioni

Per interfacciare correttamente il controller HD44780 con i processori chiamati a gestire il visualizzatore associato è necessario conoscere con grande dettaglio anche le temporizzazioni necessarie al componente per interpretare ed eseguire le sue istruzioni.
Le 2 figure seguenti mostrano in dettaglio i diagrammi temporali relativi alle fasi di scrittura verso il controller e di lettura dal controller. Il tempo minimo previsto per un intero ciclo di lettura o scrittura (Tc) è di 1 ms, tutti i tempi di transizione (fronti di salita e di discesa) sono da ritenere dell'ordine di 25 ns al massimo.

#### Ciclo di scrittura

Il ciclo di scrittura permette di scrivere dei dati all'interno di locazioni della RAM del controller, o all'interno di uno dei suoi registri; inoltre il ciclo di scrittura viene anche usato per l'esecuzione di tutti i comandi che il controller può interpretare
La fase di scrittura verso il controller HD44780 è la più ricorrente. Il ciclo di scrittura si compone delle seguenti fasi:

1. si pone il codice operativo di una istruzione per il controller o il codice del carattere da scrivere deve sul bus dati. Nel primo caso (istruzione) il segnale RS deve essere posto a 0; nel secondo (dato) deve essere forzato a 1;
2. il segnale R/W deve essere messo a 0;
3. i segnali RS e R/W devono essere posti (pressocchè simultaneamente) almeno 60 ns prima di portare alto il segnale di abilitazione E; questo tempo minimo è definito Tas.
4. il segnale E è ancora a 0; bisogna attendere almeno 60 ns prima di portarlo a 1. Dopo questo tempo l'impulso di abilitazione E deve rimanere a 1 almeno per 450 ns (Tw), per lasciare al visualizzatore il tempo necessario per interpretare (o fornire) il dato; al termine è necessario riportare l'impulso a 0: il valore presente sul bus dati viene scritto sul fronte di discesa di E (si da per scontato che esso sia presente sul bus almeno 195 ns prima che E torni a 0);
5. il dato deve essere mantenerlo sul bus almeno altri 10 ns (cioè per Th) dopo che il segnale E è tornato basso. Non appena il segnale di abilitazione E viene riportato a 0 devono passare almeno 20 ns prima di rilasciare i segnali RS e R/W; questo tempo minimo è definito Tah.

La fig.1 mostra le temporizzazioni descritte qua sopra con inserite le nomenclature dei vari tempi:

Fig.1 - Temporizzazioni per la scrittura

#### Ciclo di lettura

Il controller HD44780 permette anche di leggere le locazioni di memoria della CGRAM e della DDRAM per poter risalire ai dati scritti all'interno del display. Come gia detto l'HD44780 dispone di 80 celle di memoria DDRAM, nn tutte utili per la visualizzazione. E' pertanto possibile utilizzare le celle non di visualizzazione per altri scopi, come la memorizzazione temporanea di dati.
La fase di lettura dal controller HD44780, intesa come assunzione dei dati contenuti in una delle 2 memorie CGRAM e DDRAM, è poco probabile; essenziale è, invece, la necessità di leggere lo stato del componente, cioè il bit7 del dato assunto con segnale RS a 0 gia citato in precedenza, che deve essere letto in polling per stabilire il momento giusto per fornire il comando successivo (quando il bit vale 0).
In dettaglio il ciclo di lettura si compone delle seguenti fasi:

1. per leggere lo stato del controller (flag di busy e valore corrente del contatore d'indirizzo) il segnale RS deve essere posto a 0; per leggere i valori dalle 2 memorie (dati) deve essere posto a 1;
2. il segnale R/W è posto a 1;
3. i segnali RS e R/W devono essere posti (pressocchè simultaneamente) almeno 60 ns prima di portare alto il segnale di abilitazione E;
4. il segnale E è ancora a 0; bisogna attendere almeno 60 ns prima di portarlo a 1. Non appena E è a 1 il controller metterà il dato sul bus in un tempo massimo di 360 ns;
5. dopo che l'impulso E dell'abilitazione è passato a 1 è necessario attendere almeno altri 450 ns prima di riportarlo a 0: il valore presente sul bus dati sarà letto sul fronte di discesa di E;
6. il controller mantiene il dato sul bus per almeno altri 5 ns (cioè per Th) dopo che il segnale E è tornato basso. Non appena il segnale di abilitazione E viene riportato a 0 devono passare almeno 20 ns prima di rilasciare i segnali RS e R/W.

Fig.2 - Temporizzazioni per la lettura

Utilizzando un PIC cloccato a 4MHz si ottiene una frequenza di lavoro interna pari ad 1MHz. Da questo si ricava che il PIC, per eseguire una singola istruzione, impiega un tempo minimo pari ad 1µs. I tempi di mantenimento e attesa descritti qui sopra sono quindi sempre e largamente mantenuti. La nostra routine di gestione del display non dovrà quindi preoccuparsi di queste temporizzazioni.

### Il set di istruzioni

Il componente HD44780 è nato per costituire un'interfaccia con qualunque microprocessore o controllore di processo in grado di fornire i 2 segnali R/W e RS che regolano il traffico d'informazioni del suo bus dati a 8bit. Anche una porta parallela può simulare con estrema facilità questa gestione.
Naturalmente diventa importante imparare le istruzioni che consentono il controllo alla CPU esterna; alcune istruzioni sono dedicate al controllo del visualizzatore, altre alla gestione dei dati sulle 2 RAM.
Le istruzioni (bytes di comando) necessarie per controllare il display sono raccolte nella tabella seguente:

Istruzione | Input | Data Bus | Descrizione | Tempo MAX
RS | R/W | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0
NOP | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | Nessuna operazione | 0s
Cancella display | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | Cancella il visualizzatore e fa tornare il cursore alla posizione 0. | 1,64ms
Cursore a capo | 0 | 0 | 0 | 0 | 0 | 0 | 1 | - | Riporta il cursore alla posizione 0. | 1,64ms
Modo d'accesso dei caratteri | 0 | 0 | 0 | 0 | 0 | 1 | I | S | Imposta la direzione del movimento del cursore (I/D) e specifica se muovere il display (S). Queste operazioni sono fatte durante la lettura/scrittura dati. | 40µs
Controllo Display | 0 | 0 | 0 | 0 | 1 | D | C | B | Imposta il display On/Off (D), il cursore On/Off (C) e il lampeggio del cursore (B). | 40µs
Scorrimento cursore e display | 0 | 0 | 0 | 1 | S/C | R/L | - | - | Imposta il movimento del cursore o lo spostamento del display (S/C) e la direzione del movimento. Il contenuto della DDRAM rimane invariato. | 40µs
Impostazioni Funzioni | 0 | 0 | 1 | DL | N | F | - | - | Imposta la lunghezza dei dati dell'interfaccia (DL), il numero di linee del display (N) e il font del carattere (F). | 40µs
Indirizzo CGRAM | 0 | 1 | CGRAM Address | Imposta l'indirizzo della CGRAM. Il dato CGRAM deve essere inviato o ricevuto dopo questa impostazione. | 40µs
Indirizzo DDRAM | 1 | DDRAM Address | Imposta l'indirizzo della DDRAM. Il dato CGRAM deve essere inviato o ricevuto dopo questa impostazione. | 40µs
Lettura Bit di Stato/Indirizzo | 1 | BF | Address Counter | Legge Busy Flag e l'Address Counter | 0s
Scrittura dato | 1 | 0 | Dato da scrivere | Scrive un dato nella CGRAM o nella DDRAM | 40µs
Lettura dato | 1 | Dato da leggere | Legge un dato dalla CGRAM o dalla DDRAM | 40µs

Tab.3 - Set di istruzioni del controller HD44780

Nella tabella che segue sono descritti i bit di configurazione da utilizzare nei comandi elencati sopra:

Nome del bit | Settaggio/Stato
0 | 1
I/D | Decrementa la posizione del cursore | Incrementa la posizione del cursore
S | Spostamento del display | Nessun spostamento del display
D | Display Off | Display On
C | Cursore Off | Cursore On
B | Lampeggio cursore Off | Lampeggio cursore On
S/C | Muovi cursore | Sposta display
R/L | Sposta a sinistra | Sposta a destra
DL | Interfaccia a 4bit | Interfaccia a 8bit
N | Una linea | Due linee
F | Carattere di 5x7 punti | Carattere di 5x10 punti
BF | Comando eseguito | Comando in esecuzione

Tab.4 - Bit di configurazione

### Descrizione comandi

##### (0x00) - NOP

Nessuna operazione, classica istruzione che non produce alcun effetto.

##### (0x01) - Clear Display

Scrive il codice 20H (cioè il carattere "spazio") in tutte le locazioni DDRAM ed azzera il Contatore d'indirizzo AC, riportando il visualizzatore nelle condizioni originali; il cursore lampeggia nell'angolo in alto a sinistra (primo carattere della prima riga); in pratica esegue lo stesso servizio che la procedura ClearScreen (Pascal) impone al nostro monitor.

##### (0x02-0x03) - Cursore a capo

Forza a 0 il contatore d'indirizzo AC, senza cambiare il contenuto della DDRAM; il cursore lampeggia nell'angolo in alto a sinistra (primo carattere della prima riga); si comporta come il cursore del nostro monitor quando si preme il tasto Home.

##### (0x04-0x07) - Modo di accesso dei caratteri

Specifica la direzione verso la quale si sposterà il cursore (se i caratteri sono mantenuti al loro posto) o i caratteri visualizzati (se è il cursore che rimane fisso); in sostanza stabilisce se le 2 memorie DDRAM o CGRAM saranno lette o scritte in locazioni con indirizzo crescente o decrescente, (cioè incrementando o decrementando l'indirizzo contenuto in AC); naturalmente qualora l'istruzione sia riferita alla CGRAM l'eventuale effetto di shift sul display non viene imposto.
Bit I = 0; bit S = 0: si scrive in locazioni con indirizzo decrescente (cioè AC viene decrementato); il cursore si muove verso sinistra, cioè il testo creato rimane fisso: l'effetto è quello di una frase che si sviluppa alla rovescia all'indietro, estratta dal cursore, a partire dalla sua posizione iniziale.
Bit I = 0; bit S = 1: si scrive in locazioni con indirizzo decrescente (cioè AC viene decrementato); il cursore è mantenuto fisso, cioè il testo creato si muove verso destra: l'effetto è quello di una frase che si sviluppa alla rovescia in avanti, estratta dalla posizione iniziale del cursore.
Bit I = 1; bit S = 0: si scrive in locazioni con indirizzo crescente (cioè AC viene incrementato); il cursore si muove verso destra (cioè il display è fisso): l'effetto è quello di una frase che si sviluppa diritta in avanti, estratta dal cursore, a partire dalla sua posizione iniziale.
Bit I = 1; bit S = 1: si scrive in locazioni con indirizzo crescente (cioè AC viene incrementato); il cursore è mantenuto fisso, cioè il testo creato si muove verso sinistra: l'effetto è quello di una frase che si sviluppa diritta indietro, estratta dalla posizione iniziale del cursore.

##### (0x08 - 0x0F) - Controllo display

Questo comando permette di effettuare tre operazioni sul display. La prima operazione consiste nel decidere se il cursore deve essere visibile o invisibile: quando è visibile il cursore ha la forma di un trattino (underscore) di 5 pixel sulla linea più bassa; quando non è visibile i caratteri sul display rimangono congelati, anche se nel frattempo sono state eseguite operazioni di scrittura o lettura. La seconda funzione permette l'attivazione o meno dell'effetto lampeggio (blinking) sul carattere puntato dal cursore, alternando alla sua consueta matrice di punti quella composta da pixel tutti spenti. La terza operazione consenti accendere o spegnere tutti i pixel del display: pur mantenendo i dati in memoria DDRAM, i caratteri corrispondenti non vengono visualizzati; quando il display è spento ogni controllo sul cursore può ancora essere esercitato (cursore visibile/invisibile, con o senza effetto blink) ma risulta ovviamente inutile: per questo per spegnere il display può essere utilizzato indifferentemente uno dei 4 codici operativi corrispondenti.

##### (0x10 - 0x1F) Scorrimento Cursore/Testo

Impone lo spostamento di tutti i caratteri visualizzati o del solo cursore, verso destra o verso sinistra, senza intervenire sul contenuto delle locazioni DDRAM (come invece imponeva il modo d'accesso dei caratteri visto in precedenza, legato alla effettiva scrittura o lettura). Il servizio torna utile quando si deve intervenire sui caratteri già scritti, per effettuare una correzione, o semplicemente per cercare un determinato carattere; ovviamente il cursore passa automaticamente da una linea all'altra e lo scorrimento è imposto simultaneamente su tutti i caratteri di entrambe le linee. Lo spostamento a sinistra (a destra) del cursore decrementa (incrementa) il registro d'indirizzo AC. Lo spostamento a sinistra (a destra) del display da la sensazione che il cursore si muova dalla parte opposta, a destra (sinistra); lo spostamento del display non comporta modifiche di AC.
I 2 bit meno significativi del comando non sono coinvolti nella definizione delle istruzioni.

##### (0x20 - 0x3F) - Impostazioni funzioni

Predispone il componente per garantire l'interfaccia desiderata dall'utente. In sostanza è possibile scegliere il numero di linee coinvolte sul bus dati, di solito DB7-DB0 con 8bit di dati o DB7-DB4 con 4bit di dati; è possibile scegliere il numero di linee del display coinvolte nella visualizzazione (se il display ne prevede più di una) e la quantità di pixel utilizzata per le matrici del carattere. E' possibile utilizzare caratteri da 5x7 pixel o 5x10 pixel. Anche in questo caso 2 bit meno significativi del comando non sono coinvolti nella definizione delle istruzioni.

##### (0x40 - 0x7F) - Indirizzo CGRAM

Le locazioni della CGRAM (memoria del Generatore di Caratteri) sono 64, per cui sono necessari 6bit (26=64) bit per la selezione dell'indirizzo: poichè le istruzioni sono a 8 bit, questa istruzione si compone anteponendo al valore binario 01 (bit7, bit6, più significativi) quello dell'indirizzo, da 00000 a 111111 (bit5-bit0, meno significativi). L'effettivo dato sarà scritto o letto solo dopo aver eseguito una di queste istruzioni.

##### (0x80 - 0xFF) - Indirizzo DDRAM

Le locazioni della DDRAM (memoria dati del display) sono 80, per cui i codici operativi necessari richiedono l'utilizzo di almeno 7 bit (27=128). Dato che con 7 bit è possibile esprimere locazioni fino alla numero 128 è chiaro che non tutte le combinazioni sono necessarie: i 7 bit d'indirizzo dovranno esprimere solo i numeri da 0 (0b0000000) a 79 (0b1001111); per formattare a 8 bit il corrispondente codice operativo, ai 7 bit dell'indirizzo si antepone un bit a 1 (bit7, il più significativo).
E' comunque chiaro che il controller HD44780 è in grado di immagazzinare più caratteri di quanti il visualizzatore possa mostrare. Per esempio, quelli ad una linea gestiscono fino a 40 caratteri, per cui solo una metà (da 0 a 39, da 00h a 27H) delle locazioni è copiata sul display; la rimanente metà può però essere fatta scorrere nelle medesime 40 posizioni del visualizzatore, con le istruzioni descritte in precedenza.
Per il mio visualizzatore a 2 linee (N=1) gli indirizzi di memoria corrispondeti alla prima riga vanno da 0x00 a 0x27, mentre per la seconda riga vanno da 0x40 a 0x67

### Fasi iniziali della programmazione

La prima fase di ogni programma deve provvedere all'inizializzazione del componente per permetterne un corretto utilizzo.
All'accensione del display il Busy Flag è mantenuto a 1 fino alla fine della fase di inizializzazione; la memoria DDRAM viene riempita di spazi (come l'opcode 0x01); l'interfaccia viene predisposta per 8 bit di dati (DL=1), per visualizzatore ad 1 linea (N=0) e per matrice del carattere con 5x7 pixel (F=0) (come l'opcode 0x30); il visualizzatore viene spento (D=0) e il cursore reso invisibile (C=0) e a forma di trattino (B=0) (come l'opcode 0x08); il modo d'accesso dei caratteri prevede l'autoincremento dell'indirizzo (I=0) con display bloccato (S=0) (come l'opcode 0x04).
Di solito queste condizioni iniziali sono imposte da hardware nel momento dell'accensione o in seguito all'attivazione del segnale reset; va per altro sottolineato che il costruttore specifica chiaramente che per garantire l'inizializzazione da HW il tempo concesso all'alimentazione per raggiungere i 4,5V (power supply rise time) è al massimo di 10 ms.
Il costruttore del display raccomanda di utilizzare sempre una determinata sequenza di comandi subito dopo l'accensione:

- attendere per un periodo iniziale di almeno 15ms (con alimentazione a 5V) o di almeno 40ms (con alimentazione a 2,7V);
- inviare il comando per la predisposizione di un'interfaccia a 8bit o a 4bit senza curarsi della forma del visualizzatore e della matrice del carattere; il codice operativo può essere dunque ambiguo su tutti i 4bit meno significativi, cioè sarà del tipo 0011xxxx;
l'imposizione di un ulteriore ritardo di 4,1ms;
- la ripetizione della predispone per l'interfaccia, ancora in modo ambiguo su tutti i 4bit meno significativi;
- un ulteriore ritardo di 100 microsecondi;
- per la terza volta la medesima predisposizione ambigua dell'interfaccia.

Dopo queste 3 istruzioni di sincronizzazione (durante le quali R/W=0 e RS=0 e non è ammesso verificare il Busy Flag) sono fornite in sequenza quelle che impostano il controller per le nostre effettive esigenze; dopo ciascuna di esse è ammessa ora la verifica del Busy Flag.
Una prova pratica ha dimostrato che le sequenze di ritardo consigliate dal costruttore e la necessità di ribadire 3 volte la predisposizione ambigua di un'interfaccia a 8 bit con il codice operativo 30H non è strettamente necessaria. Della sequenza di inizializzazione descritta poco fa, per sincronizzare il componente è stato sufficiente eseguire un solo OUT del valore 30H. Naturalmente, essendo operazioni una-tantum vale la pena comunque seguirle alla lettera. Ad esse faranno seguito i comandi per la gestione con interfaccia a 6bit o interfaccia a 4 bit.