Impariamo ad usare il protocollo HD44780

Posted in: Elettronica,Schemi e Progetti |

Usiamo il protocollo “HD44780”

Salve, vorrei descrivervi in questa occasione il funzionamento ed i comandi necessari a pilotare in modo corretto un display a cristalli liquidi. Ormai se ne trovano tanti in giro nei negozi e nelle bancarelle a prezzi veramente allettanti che vanno da circa cinque Euro e oltre per i tipi più sofisticati. Per la precisione analizzeremo tutti i codici di controllo per attivare un display a due righe da sedici caratteri ciascuna, funzionante con logica “HD44780” della Hitachi. Vorrei subito chiarire che quando parliamo di sedici caratteri per riga, ci riferiamo ai caratteri visualizzati, perché in realtà ve ne sono altri ventiquattro fuori schermo per un totale di quaranta caratteri per riga.

Per esplicitare meglio le idee mi avvarrò anche di un semplice programmino che ho preparato in “visual basic”, col quale potremo attraverso la porta parallela di un personal computer, inviare i vari codici di controllo al display e verificarne subito gli effetti. Il circuito elettrico da me utilizzato e che vi propongo, raffigura solo i collegamenti tra la porta parallela di un P.C. ed il display, infatti, per le prove dimostrative che faremo noi, non occorrono altri componenti. Per ragioni di sicurezza e di protezione dei circuiti interessati è consigliabile l’uso di una batteria di pile con una tensione complessiva compresa tra 4 e 5 volt. Nel mio caso ho utilizzato tre pile stilo, per un totale di circa 4,5 volt.

sch_hd

Mi raccomando per i collegamenti attenetevi scrupolosamente allo schema elettrico visibile in fig.1, procedendo con la massima cautela. Vi ricordo inoltre che un uso improprio della porta parallela potrebbe comportarne la sua immediata ed irreversibile distruzione; perciò qualora decideste di mettere in pratica i suggerimenti dati in questo articolo, lo farete solo a vostro rischio e pericolo.

Dopo aver effettuato i collegamenti, avviate il programma ed alimentate il circuito, a questo punto compariranno sul display una serie di rettangolini al posto dei caratteri che spariranno dopo che col mouse farete click sul pulsante inizializza. L’inizializzazione si rende necessaria ogni volta che si da alimentazione al display, serve ad impartire innanzi tutto i primi comandi relativi al tipo di comunicazione, se deve avvenire su quattro oppure su otto fili e se si sta lavorando con un display ad una o a due righe.

Tali codici espressi in esadecimale, sono dati col seguente ordine: 30-01-02-06-0F-14-28-01. Se clickate adesso sul pulasante invia testo, sul display comparirà la scritta text2 visibile nella finestra sopra al pulsante in questione. Se cambierete il contenuto di tale finestra, sostituendo text2 con qualsiasi altro testo e premendo “invia testo”, quest’ultimo contenuto sarà inviato al display e comparirà sullo schermo LCD.

Dopo questo breve collaudo, passiamo adesso ad analizzare tutti i possibili codici binari che possiamo inviare al display, essi sono rappresentati nella TABELLA N°1 con una breve descrizione relativa ad ogni singolo bit.

1) Analizzando la prima riga ci rendiamo subito conto che abbiamo la possibilità di inviare un solo codice e cioè 0000.0001; tale codice sarà inviato ogni qual volta clickeremo sul pulsante “cancella display” e ciò comporterà la cancellazione di tutti i caratteri, anche di quelli fuori schermo ed il posizionamento del cursore all’inizio della prima riga.

2) Anche per la seconda riga possiamo inviare un solo codice utile e cioè “0000.0010” semplicemente clickando sul pulsante “curs. e sch. all’inizio”, ciò comporterà il posizionamento del cursore e dello schermo all’inizio della prima riga, lasciando inalterato il contenuto dello schermo.

3) Esaminando adesso la terza riga, ci accorgiamo che il terzo bit e sempre a livello logico uno, quindi i possibili codici potranno essere soltanto quattro e cioè:

“0000.0110” per spostare il cursore a destra dopo la stampa di un carattere;

“0000.0100” per spostare il cursore a sinistra dopo la stampa di un carattere;

“0000.0101” per spostare lo schermo a destra dopo la stampa di un carattere;

“0000.0111” per spostare lo schermo a sinistra dopo la stampa di un carattere.

Provate ad abilitare a turno le quattro modalità e ad inviare il testo al display per verificarne gli effetti.

4) Anche nella quarta riga notiamo che un bit è sempre ad uno logico, in questo caso il quarto bit. Il terzo bit serve a determinare se lo schermo è attivo cioè visibile oppure spento cioè invisibile. Tale funzione si può facilmente verificare premendo sul pulsante “schermo off”. Gli altri due bits in combinazione tra loro, daranno origine a quattro possibili codici come segue:

“0000.1110” per accendere il cursore;

“0000.1100” per spegnere il cursore;

“0000.1111” per rendere il carattere sotto cursore lampeggiante;

“0000.1101” per rendere il carattere ed il cursore lampeggiante.

Anche in questo caso abilitando a turno le quattro modalità intervenendo sui quattro relativi pulsanti, sarà possibile verificarne immediatamente gli effetti.

5) La quinta riga ormai siamo perfettamente in grado di individuarla, perché il quinto bit è sempre ad uno logico, mentre con gli altri due bits in combinazione tra loro, sarà possibile ottenere quattro possibili codici come segue:

“0001.0100” per spostare il cursore a destra;

“0001.0000” per spostare il cursore a sinistra;

“0001.1100” per spostare lo schermo a destra;

“0001.1000” per spostare lo schermo a sinistra.

Anche in questo caso clickando a turno sui quattro pulsanti, sarà possibile verificare subito l’effetto prodotto.

6) La sesta riga la riconosciamo dal suo sesto bit sempre a livello logico uno.

Il quinto bit indicato con “DL” se posto a LL1, attiverà la comunicazione del display col mondo esterno attraverso un buffer ad otto fili; mentre se posto a LL0 attiverà la comunicazione con un buffer a quattro fili come nel nostro caso.

Il quarto bit indicato con “N” se posto a LL1, attiverà la comunicazione con un display a due righe come nel nostro caso; mentre se posto a LL0 attiverà la comunicazione con un display ad una riga. Il terzo bit indicato con “F” se posto a LL1, attiverà la visualizzazione dei caratteri da 5*10 pixel; mentre se posto a LL0 attiverà la visualizzazione dei caratteri da 5*7 pixel come nel nostro caso.

7) La settima riga riconoscibile per il suo settimo bit sempre a LL1, ci permette di individuare ogni riga di ognuno degli otto caratteri grafici modificabili dall’utente. Dobbiamo prima ricordare che ogni carattere è costituito da otto righe, ed ogni riga è costituita da cinque pixel, come rappresentato nella Tabella n° 2. Ebbene determineremo il numero del carattere inserendo dei bits al posto delle lettere “C” in modo da ottenere un codice binario da zero a sette; e determineremo il numero di riga inserendo dei bits al posto delle lettere “R” in modo da ottenere un codice binario da zero a sette. In questo modo potremo scrivere e quindi modificare una qualsiasi delle otto righe costituenti uno degli otto caratteri definibili dall’utente. Il contenuto della riga e quindi lo stato dei relativi pixel va inviato come dato normale, come vedremo più avanti nella decima riga.

Per semplicità nell’esempio riportato nel programma dimostrativo, ho preferito dare le coordinate iniziali del primo carattere e della prima riga, cioè il codice “0100.0000”; e successivamente uno dietro l’altro il contenuto di tutte le righe, per un totale di sessantaquattro dati (righe). Nell’esempio riportato nella TABELLA n° 2 , si può vedere come dopo aver realizzato una griglia di 5*7, e dopo aver inserito degli uno in corrispondenza dei bits da accendere, si possa facilmente ottenere un carattere grafico che riproduce un diodo zener, ed a destra si possono ricavare i valori decimali da andare ad inserire in memoria per la personalizzazione dei caratteri. Nella TABELLA n° 3 invece, è visibile la griglia per definire il simbolo elettrico del condensatore. A tal proposito provate a clickare sui pulsanti “AGGIORNA (1) ” o “AGGIORNA (2) ” seguiti dal pulsante “EFFETTO”, vedrete dei caratteri in rapida successione sullo schermo, tale da dare un effetto di animazione.


8) L’ottava riga riconoscibile per il suo ottavo bit sempre a LL1, ci permette di posizionare il

cursore su una delle quaranta locazioni della prima o della seconda riga del display, senza modificare il carattere contenuto nella locazione stessa. Ciò è possibile modificando in modo opportuno gli altri sette bits dell’ottava riga; che complessivamente dovrà contenere un codice esadecimale compreso tra 80h e A7h per indirizzare la prima riga del display; e tra C0h e E7h per indirizzare la seconda riga del display.Fin qui abbiamo visto che ogni riga è facilmente individuabile dal suo bit più a sinistra sempre a LL1, lo stesso criterio di riconoscimento è adottato ed implementato nella logica di controllo interna del display.

9) La nona riga non rappresenta un dato da inviare al display, ma un dato proveniente dal display che possiamo quindi leggere come se si trattasse di una memoria. Tale valore se letto, ci consente di conoscere in qualsiasi momento la posizione occupata dal cursore in quell’istante; tenendo presente che nella lettura viene ignorato l’ottavo bit che è di controllo. Inoltre leggendo il bit “BF” possiamo sapere se il display è occupato con operazioni sue interne, cioè quando tale bit è a LL1; nel qual caso dobbiamo attendere che il bit torni a LL0 prima di inviare altri dati al display. FLOW-CHART LETTURA


10) La decima riga serve ad inviare i codici di controllo al display, oppure un carattere da scrivere sul display (DDRAM) o sui caratteri definibili dall’utente (CGRAM). Tenete presente che dopo ogni operazione di scrittura, il contatore della posizione del cursore (Address Counter) sarà incrementato automaticamente di una unità. FLOW-CHART SCRITTURA

11) L’undicesima ed ultima riga, come la nona riga serve a leggere un dato proveniente dal display (DDRAM), relativo al codice del carattere sotto al cursore in quel momento, oppure a leggere il valore binario della riga di uno dei caratteri definiti dall’utente (CGRAM). Anche in questo caso, tenete presente che dopo ogni operazione di lettura, il contatore della posizione del cursore (Address Counter) sarà incrementato automaticamente di una unità.

Quanto fin qui descritto per grandi linee, oltre che verificato col programmino dimostrativo, può essere supportato dai diagrammi di flusso che ci aiuteranno a stilare eventuali software di pilotaggio del display; nel linguaggio da noi scelto.

Prima di concludere ritengo opportuno spendere due paroline anche riguardo ai collegamenti fisici effettuati tra P.C. e display. Iniziamo col ricordare che le linee che si dipartono dai pins della porta parallela, indicati coi numeri 6; 7; 8 e 9; sono solo quattro degli otto fili di input/output, facenti capo al registro 0378h della porta parallela. A stabilire quando le linee sono d’uscita o d’ingresso, provvede il quinto bit del registro 037Ah che se posto a uno impone che linee siano d’input, se posto a zero impone che le linee siano d’output. Sempre al registro 037Ah fanno capo le linee di output dei pins 1; 14 e 17; con le quali come visto precedentemente, si comanda il display in scrittura, lettura od indirizzamento. Per finire il pin n° 20 è il collegamento di riferimento a massa per tutti i fili di input/output della porta parallela.

Spero di non aver tralasciato nulla d’importante e di essere riuscito a rendere più familiare un oggetto molto utile, che per la sua versatilità è presente in molti progetti elettronici. Con questo vi saluto e vi auguro buon divertimento e naturalmente non esitate a contattarmi per eventuali suggerimenti o chiarimenti.

IT9DPX – #135 (Francesco M.)

(Articolo visitato: 7.412)

1 Risposta to “Impariamo ad usare il protocollo HD44780”

  1. francesco Says:

    Ottimo tutorial! Comlimenti
    Si potrebbe avere il programmino in VB?

Lascia un Commento!