PILOTAGGIO LCD

 

 

Dopo aver controllato tutte le connessioni due volte (non vorrei sentire odore di bruciato) siamo pronti a cercare di scrivere qualcosa sullo schermo.

Secondo quanto riportato nel datasheet il primo passo da compiere è l'inizializzazione dell' HD44780.

Dato che viene utilizzata la porta parallela (LPT1, settata in SPP) il registro di uscita (lunghezza 8 bit) lo troviamo all'indirizzo 0378h (indirizzo LPT base, h= notazione esadecimale) : ogni dato che scriveremo a quell'indirizzo sarà replicato bit per bit nei pin da 2 a 9 della porta parallela.

Per controllare il pin 1 (connesso al pin RS dell' HD44780) ed il pin 16 (connesso al pin E dell' HD44780), dovremo scrivere in un registro differente: il registro di controllo all'indirizzo 037Ah (oppure all'indirizzo LPT base+2).

Questo registro è utilizzato per controllare alcuni segnali della porta parallela ed è "collegato" ai pin 1,14,16,17 (i 4 bit meno significativi) della porta parallela.

Anch'esso è lungo 8 bit ma solo i 4 bit meno significativi sono utilizzati, gli altri 4 sono riservati ed ignorati.

Se si vuole utilizzare la porta parallela bisogna notare che i pin 1,14 e 17 sono negati in uscita (il pin 16 invece è "dritto", attivo alto) ciò significa che per avere un "1" in uscita, bisognerà scrivere uno "0" nel bit corrispondente al pin selezionato.

I dati che l' HD44780 può ricevere sono di due tipi: istruzioni o codici di caratteri da visualizzare.

Ma come il nostro HD44780 distingue i due tipi di dato?

La risposta è: il valore del pin RS.

Se RS=0 (GND) allora il dato presente nelle linee da Db0 a Db7 è un'istruzione, se RS=1 (+5 Volt) allora il dato è il codice ASCII del carattere da visualizzare.

E' abbastanza facile, no?

Andiamo avanti.

Il primo passo (OBBLIGATORIO) dell'inizializzazione è settare la modalità di funzionamento a 8 bit anche se poi lo utilizzerete a 4 bit.

Per fare questo si dovrà seguire questa sequenza: (supponendo che si utilizzi al LPT1)

 

scrivere 30h nel registro di uscita all' indirizzo 0378h

  quindi

E=1, RS=0 *

  ritardo di 1 msec

E=0, RS=0 *

  ritardo di 1 msec

 

Ripetere l'intera sequenza per 3 volte.

 

* se avete utilizzato il mio schema di collegamento per ottenere E=1 ed RS=0 dovrete scrivere 5 nel registro di controllo (LPT base+2), E=0 RS=0 scrivete 1, E=1 RS=1 scrivete 4, E=0 RS=1 scrivete 0.

 

Il prossimo passo è selezionare la modalità di funzionamento (8 bit nel mio caso), il numero di righe (2) e la dimensione del carattere (5x8).

La sequenza è: (solo una volta)

 

scrivere 38h nel registro di uscita all'indirizzo 0378h

  quindi

E=1, RS=0

  ritardo di 1 msec

E=0, RS=0

  ritardo di 1 msec

 

Ora display ON, cursore OFF (invisibile):

 

scrivere 0Ch nel registro di uscita all'indirizzo 0378h

  quindi

E=1, RS=0

  ritardo di 1 msec

E=0, RS=0

  ritardo di 1 msec

 

Ora l'ultimo passaggio: l' "entry mode set".

 

scrivere 06h nel registro di uscita all'indirizzo 0378h

  quindi

E=1, RS=0

  ritardo di 1 msec

E=0, RS=0

  ritardo di 1 msec

 

L'inizializzazione è terminata.

Ora, per scrivere un carattere sullo schermo dobbiamo selezionare prima la riga dove vogliamo che il testo compaia.

 

Per la riga #1:

 

scrivere 80h nel registro di uscita all'indirizzo 0378h

  quindi

E=1, RS=0

  ritardo di 1 msec

E=0, RS=0

  ritardo di 1 msec

 

Per la riga #2:

 

scrivere C0h nel registro di uscita all'indirizzo 0378h

  quindi

E=1, RS=0

  ritardo di 1 msec

E=0, RS=0

  ritardo di 1 msec

 

Ora per scrivere, per esempio, il carattere "H" alla riga selezionata:

 

scrivere 48h nel registro di uscita all'indirizzo 0378h

  quindi

E=1, RS=1

  ritardo di 1 msec

E=0, RS=1

  ritardo di 1 msec

 

Se siete stati fortunati una "H" dovrebbe apparire sul display.

Per tutte le altre istruzioni (pulisci schermo, posiziona il cursore ecc.) vi suggerisco di leggere il datasheet.

 

Nota tecnica:

 

con Windows 2000/XP non si può accedere direttamente ai registri della porta parallela, quindi se decidi di sviluppare software che utilizzi la parallela com eporta di interfaccia, dovrai utilizzare una libreria che permetta l'accesso alla porta.

Per esempio con il Borland Delphi si può utilizzare ZLPORTIO che puoi trovare facilmente con Google.

 

Considerazione finale:

 

la porta LPT è facile da gestire ma permette di pilotare solo 1 display (con qualche trucco anche 2) il che si rivela piuttosto limitativo.

Inoltre l'utilizzo e la gestione della porta parallela impegna di più la CPU e sappiamo quanto sia importante avere la piena potenzialità del processore nella simulazione.

Ecco perchè ho cominciato a sviluppare un modulo USB per pilotare questo tipo di display.

Usando un processore PIC18F4550 ( http://www.microchip.com ) che supporta sia USB 1.1 che 2.0, è possibile pilotare fino a 20 display con un modulo singolo avendo sicuramente un impatto minore nel sistema della porta parallela.

Naturalmente non appena sarà completato ne pubblicherò tutto il materiale per la realizzazione.