PICmicro cult – Gestione di un display LCD

Gestione di un display LCD

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 più
significativi seguiti dai quattro bit meno 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 cosi 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 contengono il numero della colonna. Provando a cambiare il valore nel registro W possiamo ottenere 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 cosi 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.

A titolo di esempio riporto:

Il DataSheet del controller piu comune: HD44780 Hitachi (Renesas)

HD44780

Interessante Application Note Maxim sulla serializzazione del controller HD44780 su bus I2C

Serializing an HD44780 LCD Display

Scarica subito una copia gratis
Tags:,

2 Commenti

  1. Avatar photo Geranio 29 Marzo 2016
    • Avatar photo Emanuele 30 Marzo 2016

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend