| Display LCD Hitachi HD44780 con pic in assembler |
|
|
|
|
There are no translations available. La guida propone delle librerie assembler per controllare un display LCD HD44780 con un PIC della famiglia 16F.
Uno schermo a cristalli liquidi LCD, dall'inglese Liquid Cristal Display, è un dispositivo capace di sfruttare le proprietà elettriche dei cristalli liquidi, intrappolati tra due superfici trasparenti, di cambiare la polarizzazione della luce che li attraversa in presenza di un campo elettrico, ottenendo come risultato zone d'ombra e di luce, modellando opportunamente questi puntini o pixel si possono ottenere delle immagini anche complesse. Spesso si pensa che un display LCD sia capace di emettere luce, in realtà l'LCD ha funzionalità opposta, cioè ostruisce opportunamente il passaggio della luce di una sorgente retrostante, infatti i display LCD necessitano di una retroilluminazione permanente, tale da illuminare tutto lo schermo, o in casi particolari specchi capaci di riflettere la luce presente nell'ambiente circostante come nel caso dei classici display delle calcolatrici. Un display LCD è composto da una matrice di punti o pixel, per ricreare un disegno la logica di controllo provvede ad "accendere" o "spegnere" i pixel secondo delle mappe prestabilite spesso memorizzate in EEPROM in questo modo si possono definire immagine anche complesse. L'evoluzione tecnologica ha permesso di creare display che differiscono per innumerevoli caratteristiche dalla forma fisica o alla forma degli oggetti rappresentabili. Spesso vengono distinti in monocromatici e a colori, il principio di funzionamento rimane lo stesso, ciò che cambia è il dettaglio di costruzione, nel caso dei display colorati dove bisogna generare milioni di colori si ricorre ad un numero elevato di filtri polarizzanti opportunamnente controllati con il campo elettrico. L'LCD si presenta come una soluzione ottimale per le sue caratteristiche embedded in quanto non dovendo generare luce, il consumo di corrente è estremamente basso. Questa nota positiva diventa una nota dolente nel caso si voglia usare la tecnologia LCD per schermi di grandi dimensioni in continuo funzionamento come ad esempio un televosore o il monitor del computer, in questi casi la presenza della retroilluminazione diventa obbligatoria, e come sappiamo ciò comporta diversi problemi nel caso si voglia ricreare un nero perfetto. Altra nota rigurada i consumi elettrici che rimangno invairati anche quando l'LCD sta riproducendo solo il colore nero, sostanziale differenza con il funzionamento del veccio tubo catodico. Fortunatamente sul mercato sono presenti numerose tecnologie conccorrenti alcuni esempi riguradano gli OLED o POLED, rispettivamente Organig LED e POlimer LED, queste sono due tecnologia maggiormente rilevanti, ma ne esistono altre. Questo tipo di approccio è mirato alla possibilità di eliminare la retroilluminazione conferendo capacità luminescenti ai singoli pixel come tante lampadine, in sostanza un pò come accade con i pannelli pubblicitari gicanti illuminati a led tricolore. Sulle differenze e sul funzionamento si potrebbero scrivere pagine e pagine, ovviamente vogliamo dedicare l'attenzione al pilotaggio di un particolare display LCD estremamente semplice ma ottimo per applicazioni embedded. Come si è letto poco sopra il pannello LCD necessita di una logica di controllo per funzionare. Per molti anni si è affermata come logica di controllo l'HD44780 della Hitachi oggi con meno evidenza a favore dei nuovi display GCLCD Grafic Color LCD, in molte applicazioni rimane ancora valido l'uso dei dispaly Hitachi è il caso di applicazioni con micro PIC dove le potenze di calcolo della CPU sono limitate.
I modelli HD44780 sono display alpha-numerici ovvero sono capaci di riprodurre solo caratteri e numeri associati ai codici ASCII, più alcuni simboli caratteristici dell'alfabeto orientale. Per poter disegnare simboli particolari si può sfruttare la capacità di associare 8 simboli ad 8 codici ASCII non utilizzati, ogni simbolo sarà grande 5*8 pixel. Al canto stesso il microcontrollore deve inviare solo il codice ASCII e non preoccuparsi della generazione dei caratteri o come questi vengono implementati.
In commercio ci sono molti modelli differenti per dimensione e per colorazione dello sfondo i modleli più diffusi sono: (Inserire Foto)2*16 = 2 righe con massimo 16 caratteri per riga; (Inserire Foto)4*16 = come il precedente ma con 4 righe; (Inserire Foto)4*20 = 4 righe da 20 caratteri caduna, questa è la massima capacità della logica; (Inserire Foto)2*8 = piccoli e versatili.
Funzionamento display
I display con logica di controllo HD44780 sono caratterizzati da un bus parallelo ad 8 bit per l'invio dei dati, questo bus può funzionare anche a 4 bit serializzando l'invio dei bit più significativi a quelli meno significativi, ed ulteriori 3 pin di controllo necessari per l'abilitazione delle diverse aree di memoria o per inviare il segnale di enable.
Descrizione dei PIN La tabella seguente riassume il funzionamento dei 16 pin del display.
Vss e Vdd servono per alimentare il display e funzionano a 5V, Vo è un ingresso analogico necessario per variare il contrasto può essere connesso ad un trimmer connesso a sua volta tra GND e 5 V. La linea RS o Register Select, permette di alternare la modalità dati alla modalità comandi. Similmente R/W Read/Write permette di passare dalla modalità scrittura alla modalità lettura. La linea E serve all'abilitazione, si comporta come una linea di clock quando il segnale passa da 1 a 0 quindi si ha un fronte di discesa si abilita la lettura del dato in ingresso. DB0 - DB7 sono le 8 linee di bus ad 8 bit, come detto in precedenza il display può funzionare anche in modalità 4 bit collegando a massa i 4 bit meno significativi ed inviando i dati in due fasi sui 4 bit più significativi. Infine BL- e BL+ sono l'alimentazione della retroilluminazione generalmente costruita con LED.
Caratteristiche del display LCD Hitachi HD44780
Generatori di caratteri Il dislay presentato ha la capacità di associare simboli matriciali 5*8 a codici alfa-numerici di tipo ASCII, questo permette di inviare al display solo il rispettivo codice ASCII e non preoccuparsi di dover implementare la costruzione del simbolo come accade nei display grafici, alleggerendo di molto i compiti del microcontrollore. Questa possibilità è offerta sfruttando due memorie associative presenti all'interno della logica di controllo, il principio di funzionamento è quello di ricevere un codice ad 8 bit e restituire l'implementazione ASCII su matrice 5*8 secondo quanto riportato da questa tabella:
Le memorie che si occupano dell'associazione sono dette CGROM e CGRAM, CG sta per Caracter Generetor, le associazioni presentate in tabella risiedono nella CGROM e sono stabilite al momento della costruzione essendo una memoria ROM, differenziandosi in caratteri occidentali ed orientali. Con la CGRAM l'utente può definire 8 simboli sempre con formato 5*8 pixel ed indirizzarli tramite codici ad 8 bit.
Area dati La logica ha anche un'altra area di memoria di tipo RAM detta DDRAM, grande 80 byte nella quale vengono memorizzati i byte ricevuti in ingresso che poi verrano codificati con gli opportuni simboli in base alla CGROM o CGRAM, la DDRAM è sempre di 80 byte in tutti i diversi modelli di display presenti sul mercato ciò che cambiano sono solo le capacità di visualizzazione limitate alla grandezza fisica del display esempi 2*16, 4*20 ecc. Questo è un altro punto di forza nella generalità di tale logica permette di sfruttare sempre tutta l'area di memoria scrivendo anche oltre la capacità visualizzativa del display e lasciando i byte in DDRAM la visualizzazione di questi ulteriori byte può essere avviata facendo scorrere il display, ottenendo un'effetto simile ai cartelloni pubblicitari. Il display può funzionare in due modalità: singola linea e doppia liena ottenedo questi risultati: 1 linea, tutte le 80 locazioni vengono concatenate in modo da rendere adiacenti gli indirizzi 00 e 4F; 2 linee, le 80 locazioni sono divise in 2 aree 40 per la prima riga con continuità tra gli indirizzi 00 - 27, e 40 per la seconda riga con continuità tra gli indirizzi 40 - 67 .
Registri IR e DR L'IR ed il DR sono due registri specializzati rispettivamente nella memorizzazione delle istruzioni di controllo ricevute tramite il bus Istruction Register, e nella memorizzazione dei dati ricevuti che poi verrano trasferiti in DDRAM Data Register.
IL BF Busy flag La logica di controllo dell'LCD richiede del tempo per eseguire le istruzioni inviate, il funzionamente è ciclico quando riceve un byte partono le routine operative interne che elaborano la richiesta. Durante questo tempo il controller è occupato e non è in grado di ricevere altri comandi. Quindi diventa necessario attendere un tempo T prima di inviare altre richieste. A priori è impossibile conoscere il tempo necessario che sarà dipendente dal tipo di controller, dal tipo di operazione, dalla frequenza di clock del controller. In genere la soluzione costruttiva più rapida è l'attesa di un tempo sicuramente maggiore al T massimo. La logica di controllo offre una soluzione più funzionale annunciando lo stato interno con un bit, chiamato Busy Flag che può essere letto 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.
Istruzioni di controllo
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.
Descrizione comandi
0 0 0 0 0 0 0 1 - Clear Display Azzera il contatore AC della DDRAM riportando il cursore nella prima posizione alla prima riga ed inserisce il codice ASCII 20H corrispondente allo spazio bianco in tutta la DDRAM per cancellare ogni dato presente.
0 0 0 0 0 0 1 X - Cursore a capo Azzera il contatore AC della DRAM riportando il cursore nella prima posizione alla prima riga lasciando inalterato il contenuto della DDRAM
0 0 0 0 0 1 I S - 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 saranno lette o scritte in locazioni con indirizzo crescente o decrescente, (cioè incrementando o decrementando l'indirizzo contenuto in AC). 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.
0 0 0 0 1 D C B - Controllo display Questa istruzione permette di ottenere tre diversi effetti visivi sul display. La prima operazione associata al bit D permette di abilitare o disabilitare la visualizzazione del contenuto della DDRAM, creando un effetto accendi spegni del display, si parla di effetto perchè quando si spegne il display tutte le operazioni possono continuare è solo la visualizzazione ad essere spenta, quindi si può continuare a scrivere sul display senza avere gli effetti alla riaccensione il display viene aggiornato con il contenuto della DDRAM. La restanti due operazioni servono per abilitare o disabilitare la visualizzazione del cursore che può avere due forme rispettivamente per C e B si ha la forma underscore o di trattino sottolineando il carattere o la forma lampeggio alternando il simbolo con una matrice 5*8 nera. Essendo due bit separati si possono ottenre anche effeti misti con cursore lampeggiante unito ad undescore o eliminare qualsiasi segna posto.
0 0 0 1 S/C R/L X X 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. 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 effetto simile si può ottenre leggendo lo stato corrente di AC ed aggiornandolo con un nuovo valore. 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 indicati con X del comando non sono coinvolti nella definizione delle istruzioni.
0 0 1 DL N F X X - Impostazioni funzioni Istruzione necessaria in fase di inizializzazione per specificare il comportamento dell'interfaccia e le caratteristiche del display. Le possibilità sono la scelta del numero di bit dell'interfaccia impiegati nella comunicazione 8 o 4, ruolo svolto dal bit DL; Scelta tra modalità di singola linea o di doppia linea ottenendo effetti particolari non sempre necessari, compito del bit N ed infine la modalità di visualizzazione del display scegliendo tra matrici di 5*8 o 5*10 quest'ultime non sempre sono disponibili in quanto richiedono display particolare per funzionare. Gli ulteriori due bit meno significativi non vengono conivolti.
0 1 ACG ACG ACG ACG ACG ACG - 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'accesso a questa area di memoria in lettura o scrittura avviene solo dopo aver specificato l'indirizzo all'interno della GCRAM tramite questa istruzione, tutte le altre operazioni di lettura e scrittura se non diversamente specificato interessano esclusivamente la DDRAM.
1 ADD ADD ADD ADD ADD ADD ADD - 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.
Librerie software per PIC micro
Alla luce del funzionamento del display è possibile analizzare il software di controllo da inserire in un PIC per poter comandare correttamente il display. Spesso ogni progetto ha una propria implementazione delle modalità di controllo tecnica utile in quanto modella opportunamente i codice alle esigenze specifiche dell'applicazione, quello che viene fornito di seguito sono delle librerie con una portata standard capaci di alleggerire il compito allo sviluppatore. In generale un software ottimizzato alla sola gestione di una perifericha viene anche chiamato driver, in quanto offre la possibilità di trascurare il funzionamento di basso livello della logica e focalizzare l'attenzione a "funzioni di alto livello" più semplici anche pagando qualcosa in prestazioni. Come vedremo il codice presentato è già un ottimo compromesso tra prestazioni e semplicità d'uso quindi può essere largamente incluso ed utilizzato in progetti che richiedono display LCD. Le librerie proposte di seguito sono delle possibili implementazioni assembler utili per gestire un display da un micro PIC della famiglia 16F. Le funzioni sono state ideate per semplificare l'accesso alle risorse ricreando l'illusione di disporre di codici di alto livello, le funzioni possono essere facilmente modellate sui micro PIC16F ridefinendo di volta in volta solo gli 8 parametri di configurazione tra i PIN del PIC e quelli dell'LCD, tutto il resto è svolto dalle librerie.
Questa serie di define permette di definire indipendentemente dallo schema di connessioni la corrispondenza tra i PIN con la sola necessità di avere PIN del PIC capaci di I/O. #DEFINE EN PORTC,4
Come ogni periferica prima di poterla utilizzare necessiata di un'inizializzazione per far questo basta semplicemente invocare la funzione InitLCD:
call InitLCD
La funzione provvede ad impostare i corretti settaggi di ingresso/uscita e ad inizializzare l'LCD secondo le procedure e le temporizzazoni descritte dal manuale. Come modalità di default sceglie la gestione del display a 2 righe con cursore lampeggiante e matrice 5*8. L'operazione più frequente è quella di scrivere codici ASCII e visualizzarli sul display, questo è implementato tramite la funzione WriteData che provvede a stampare sul display il contenuto dell'accumulatore W:
movlw 'L' call WriteData
L'esempio precedente scriverà la lettera L Operazioni semplici altrettanto frequenti, ma sensibili ad errori di distrazione sono la possibilità di cancellare l'intero contenuto del displaye riportare il cursore nella prima posizione sulla prima riga (Home), queste operazioni che corrispondo a due codici binari sono implementate in maniere mnmonica con queste due funzioni:
call ClearAndHome call CursorHome
Altre volte se il display è utilizzato dinamicamente dall'utente può essere necessario cancellare i caratteri alla sinistra del cursore similmente alla funzione svolta dal tasto Backspace così:
call Backspace
cancellerà ricorsivamente l'ultimo carattere inserito. Similmente al caso precedente quando si offre all'utente la possibilità di gestire dinamicamente il display può esserci la necessità di spostarsi all'interno del display come quando si usano le "freccette" per muoversi all'interno di un documento di testo:
call CursorUp call CursorDown call CursorRight call CursorLeft
Il risultato ottenuto dall'invocazione di ciascuna delle singole funzioni è quello di spostare il cursore all'interno dell'area di memoria. Delle utilità necessarie per gestire il display in situazioni dinamiche sono la possibilità di accendere e spegnere il display il cursore ed il cursore lampeggiante, senza doversi tutte le volte preoccuaprsi di ricordare il rispettivo codici binario ed inviare il comando, semplicemente tutto è svolto da queste 6 funzioni:
call CursorOn call CursorOff call CursorBlinkOn call CursorBlinkOff call DisplayOn call DisplayOff
Infine in casi particolari può essere necessario leggere cosa è scritto in una determinata posizione, questo può essere agevolmente svolto dalla funzione ReadData che legge il dato presente nella posizione del cursore:
call ReadData
Il dato letto sarà ritornato come nuovo valore dell'accumulatore W. Per conoscere la posizione del cursore si può usare la funzione ReadAddress con ritorno in W dell'indirizzo
call ReadAddress
Come ultima possibilità per necessità particolari si offre la possibilità di poter inviare direttamente codici di istruzioni preformattate caricandole in W ed invocando la funzione WriteCommand
call WriteCommand
Le intere librerie possono essere scaricate con un progetto di esempio da questo link.
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||


