Gestione di un display LCDData di pubblicazione: 17-10-2003 | Versione Italiana | (No English Version) Parole chiave: - Display - How-To - PIC - |
Dopo aver realizzato nelle lezioni precedenti dei semplici esperimenti con diodi led e pulsanti,
iniziamo da questa lezione ad interfacciare il nostro PIC16F84A con qualcosa di pi� complesso.
Inizieremo con un display a cristalli liquidi o LCD (dall'inglese Liquid Crystal Display) dotato di 2 linee
di 16 caratteri ciascuna. I display LCD pi� comuni reperibili in commercio, dispongono di una un'interfaccia
ideata da Hitachi che nel tempo � diventata uno standard industriale utilizzato anche da altre case produttrici.
Questo tipo di interfaccia prevede che il display sia collegato al micro tramite un bus dati da 4 o 8
linee pi� 3 linee di controllo e le linee di alimentazione.
Diamo subito un'occhiata allo schema elettrico del circuito che andremo a realizzare per capire meglio
le spiegazioni che seguiranno.
Lo schema elettrico del circuito � riportato di seguito:
Nella tabella seguente vengono descritte le funzioni di ogni singola linea disponibile per
interfacciare il display. Le descrizioni riportate in grassetto indicano le linee effettivamente
utilizzate dalla nostra applicazione d'esempio.
Per ridurre al massimo i collegamenti tra il PIC ed il display LCD, in questa lezione utilizzeremo
la modalit� di collegamento dati a 4 bit utilizzando solo le linee DB4, DB5, DB6 e DB7. Le linee
DB0, DB1, DB2 e DB3 non saranno utilizzate e collegate a massa.
Anche la linea R/W non verr� utilizzata e collegata direttamente a massa. In questo modo verr� selezionata
la modalit� di funzionamento in sola scrittura. In pratica potremo solo inviare dati all'LCD ma non riceverli.
Hello World !
Dopo aver realizzato il circuito d'esempio, compilare il sorgente riportato nel file LCD1.ASM
e quindi programmate il PIC con il file .HEX ottenuto.
All'accensione del circuito, se tutto � andato per il meglio, apparir� sul display la seguente schermata.
ovvero "CIAO MONDO !" che � diventata ormai la frase di iniziazione che tutti gli aspiranti programmatori
devono aver visualizzato almeno una volta in un loro programma. Non potevamo essere di certo noi a
non rispettare questa tradizione. Il risultato non � molto esaltante, ma la sostanza di quello che
siamo riusciti a fare � notevole � va studiata approfonditamente !
Se non riuscite a visualizzare nulla sul display, nonostante siate pi� che sicuri che il circuito
sia stato realizzato correttamente e che il PIC sia stato ben programmato (ricordatevi a proposito
di programmare l'oscillatore in modalit� XT e di disabilitare il Watch Dog Timer), sar� forse necessario
regolare il contrasto del display LCD agendo sul trimmer R2 connesso al pin 3 del display.
Le linee Enable (E) e Register Select (RS) dell'LCD
Per poter visualizzare una scritta sul display, il PIC deve inviare tutta una serie di comandi tramite le linee
del bus dati (linee da DB4 a DB7). Per far questo utilizza due linee di controllo con cui comunica al display
l'operazione di trasferimento che cerca di compiere sul bus.
Le due linee di controllo sono la linea Enable (pin 6 dell'LCD )e Register Select (pin 4 dell'LCD).
Con la linea Register Select (RS) il PIC segnala al display che il dato presente sul bus �
un comando (RS=0) o un dato da visualizzare (RS=1). Tramite i comandi il PIC pu� segnalare
al display il tipo di operazione da compiere, come ad esempio spostare il cursore o pulire
lo schermo. Con i dati il PIC pu� inviare al display direttamente i caratteri ASCII da visualizzare.
La linea Enable abilita il display a leggere il comando o il dato inviato sul bus dal PIC.
Il PIC deve preoccuparsi di aver gi� inviato sul bus dati il comando o il dato giusto prima
di mettere a 1 il segnale di enable.
Multiplex sul bus dati
Sia i comandi che i dati sono rappresentati da numeri a 8 bit, come � possibile inviarli
al display se il bus dati � composto da sole 4 linee ?
Viene fatta in pratica una operazione detta di "multiplex", ovvero ogni byte viene scomposto
in due gruppi di di 4 bit e quindi trasmessi sul bus dati in sequenza. Vengono inviati prima i
quattro bit meno significativi seguiti dai quattro bit pi� significativi.
Nel nostro source di esempio, tutte le operazioni di trasmissione di dati e comandi verso il
display vengono eseguite da una serie di subroutine presenti nel file LCD1.ASM semplificando cos�
al massimo la complessit� del nostro programma.
Prima di addentrarci nello studio delle singole subroutine vediamo come funziona il programma principale.
Analizziamo il sorgente LCD1.ASM
Nella prima parte del nostro source vengono definite alcune costanti:
;LCD Control lines
LCD_RS equ 2 ;Register Select
LCD_E equ 3 ;Enable
;LCD data line bus
LCD_DB4 equ 4 ;LCD data line DB4
LCD_DB5 equ 5 ;LCD data line DB5
LCD_DB6 equ 6 ;LCD data line DB6
LCD_DB7 equ 7 ;LCD data line DB7
Queste costanti definiscono l'associazione tra le linee del PIC (tutte connesse alla PORTA B) e
le linee del display. Le singole definizioni verranno usate all'interno delle subroutine di gestione
dell'LCD al posto dei singoli numeri di identificazione delle linee di I/O.
tmpLcdRegister res 2
msDelayCounter res 2
Di seguito viene allocato spazio per due registri: tmpLcdRegister , usato dalle routine di gestione
dell'LCD e msDelayCounter usato dalla subroutine msDelay che genera dei ritardi software da 1 ms
per il contenuto del registro W. Questa subroutine viene utilizzata sempre dalle subroutine di gestione
dell'LCD per generare le temporizzazioni richieste durante la trasmissione di dati e comandi all'LCD.
Segue una parte di definizione delle linee di connessione tra il PIC ed il display e quindi arriva
la prima chiamata a subroutine che ci interessa.
call LcdInit
LcdInit � una subroutine che deve essere chiamata solo una volta all'inizio del programma e
prima di qualsiasi altra subroutine di gestione del'LCD. Essa si occupa di effettuare tutte
le operazioni necessarie per inizializzare correttamente l'LCD e consentire, alle funzioni
successive, di poter operare correttamente.
Con le istruzioni seguenti:
movlw 00H
call LcdLocate
si posiziona il cursore del display sulla prima riga e prima colonna dello schermo.
I caratteri inviati successivamente verranno visualizzati a partire da questa posizione.
I quattro bit pi� significativi del valore caricato nel registro W con l'istruzione:
movlw 00H
contengono il numero della riga dove si vuole posizionare il cursore, i quattro bit meno
significativi contegono il numero della colonna.
Provando a cambiare il valore nel registro W possiamo otterere posizionamenti diversi.
Con il valore 10H ad esempio otterremo la schermata:
con il valore 12H otterremo:
A questo punto per visualizzare ogni carattere della scritta vengono utilizzate le seguenti istruzioni:
movlw 'H'
call LcdSendData
e cos� via per ogni lettere da visualizzare. L'incremento della posizione del cursore avviene automaticamente.
Subroutine di gestione del display LCD
Vediamo brevemente quali funzioni effettuano le subroutine di gestione del display LCD
fornite con il sorgente LCD1.ASM.
Maggiori informazioni sull'uso dei display LCD possono essere ricavate direttamente dai datasheet
che il fornitore dovrebbe poter essere in grado di fornirvi.
Segnala questo articolo:
Parole chiave: - Display - How-To - PIC -
|