fisertek_300
 
Lezione 3 
 
Il primo programma per LCD
 
 
barra rossa2 
 
Ecco la tanto attesa lezione di C per l'uso di display LCD alfanumerici.All'inizio, credevo che gestire un display LCD fosse difficilissimo ma, una volta fatta la routine giusta, la sua gestione sembra essere più facile che accendere i led.Questa pagina serve solo per mettervi in condizioni di usare un display a cristalli liquidi ma, chi vorrà approfondire la cosa, potrà farlo consultando i numerosi siti che si trovano in rete riguardo questo argomento.
 
barra rossa2 
 
lezione_lcd_600
Nella foto a fianco, mostro il modulo lcd collegato alla base 16f84, insieme al modulo pulsanti. Si vede anche la scritta sul display, generata dal programma che andremo a esporre qui sotto.Dovete collegare 2 pulsanti alle porte A0 e A1 del pic. Poi collegate le 4 linee dati alle prime 4 porte B del pic e le linee RS ed E dell'lcd alle porte B4 e B5 del pic.Più sotto, nei settaggi della routine c'è il collegamento in dettaglio.Non dimenticate di collegare i fili di alimentazione dei moduli lcd e pulsanti ai relativi bus di alimentazione.
 
Usiamo l'LCD 
Il signor Andrea (amico di main-list) ha acconsentito, dietro mia richiesta, di pubblicare la sua routine di gestione degli LCD insieme ad un programma d'esempio. 
La routine, chiamata lcd.c và inserita nella cartella include del vostro compilatore e và modificata in funzione del tipo di display che volete usare e degli assegnamenti da fare alle porte del PIC. 
La modifica la potete fare con un semplice editor di testo, come il Notepad di Windows e, all'interno del codice, troverete facilmente dove fare gli opportuni aggiustamenti. 
Inoltre troverete una leggenda dei comandi per gestire gli LCD.  
Comandi che dovrete usare nel vostro sorgente principale. 
Vediamo un attimo quali sono questi comandi, resi disponibili dalla routine: 
 
Comandi per l'LCD 
 
LCD_INIT() -----------> Inizializza l'LCD.Questo comando và usato prima di ogni altra cosa nel vostro programma principale altrimenti il vostro LCD non vorrà saperne di funzionare e vi mostrerà soltanto una riga piena di quadratini neri.. 
 
LCD_CLEAR() ----------> Cancella l'LCD.  
 
LCD_CMD('char') ------> Manda un comando all'LCD. (vedere il datasheet dell'lcd per una lista completa di comandi) 
 
LCD_GOTO(line,pos) ---> Sposta il cursore alla linea e posizione specificatiLa linea può variare da 1 a 4 mentre la posizione può andare da 1 fino alla massima posizione possibile con il vostro LCD 
 
LCD_PUTCH('char') ----> Scrive i caratteri in ASCII. (frasi in genere) 
 
LCD_PUTS("string") ---> Scrive stringhe. 
 
LCD_PUTUN(number) ---> Scrive un numero senza segno. (partire nel programma con INT per i numeri a 16 bit e CHAR per i numeri a 8 bit) 
 
LCD_PUTSN(number) ---> Scrive un numero con segno (per numeri inferiori a zero (fare gli assegnamenti come il comando precedente). 
 
 
Sia io che Andrea, ci siamo trovati d'accordo sul fatto che non è stato implementato il comando per la gestione dei numeri in virgola mobile perchè lo abbiamo ritenuto inutile per i nostri scopi. 
D'altronde colui che vorrà usare numeri in virgola mobile, sarà anche abbastanza esperto da poterselo aggiungere da solo. 
 
Nota bene: 
Questa routine è calibrata per poter funzionare con un quarzo da 4 Mhz. 
Se intendete utilizzare un quarzo diverso, dovete modificare anche i tempi dati dai delay all'interno della routine, altrimenti non vi funzionerà. 
 
Parti della routine da modificare 
Come ho già detto, la routine lcd.c và inserita nella cartella include e poi modificata in base al collegamento con il pic e al tipo di display che avete intenzione di usare.Vediamo qui sotto le parti di codice che dovete modificare (con notepad) 
 
/************************************************************************/ 
/* Use the following defines to set the lines as your hardware requires */ 
/* ...you can use ANY output line of the MCU, even on several ports :)*/ 
/************************************************************************/ 
#define LCD_RS RB4 // Register select 
#define LCD_EN RB5 // Enable 
#define LCD_D4 RB0 // LCD data 4 
#define LCD_D5 RB1 // LCD data 5 
#define LCD_D6 RB2 // LCD data 6 
#define LCD_D7 RB3 // LCD data 7 
 
Qui dovete definire i pin del pic da collegare all'LCD. Ora, a titolo di esempo, trovate assegnate le porte del PIC da RB0 a RB5. Siete liberi di assegnare quello che vi pare, a seconda delle esigenze del circuito.Nel nostro caso la tabella sopra riportata corrisponde al collegamento da fare per seguire il programma di esempio esposto più sotto. 
 
#define LCD_ROWS 2 // valid numbers are: 1,2 
// (set to 2 for 2 or more rows) 
#define LCD_COLS 20 // valid numbers are: 8,16,20  
 
Qui dovete specificare il tipo di LCD che volete collegare.Al parametro ROWS potete dare 1 de il vostro LCD ha una sola riga mentre dovete dare 2 se il vostro LCD ha 2 o più righe.Al secondo parametro potete dare 8,16,20 a seconda dei caratteri per riga del vostro LCD.Non dovrete fare nessun altra modifica e sarete già in grado di far cantare il vostro display. 
 
Il programma di esempio 
/* 
* Programma di prova per LCD 
*/ 
 
#include <pic.h> 
#include <stdio.h> 
#include "delay.c" 
#define valore 250 
#include "lcd.c" 
 
main() 
       TRISB0=0;          //DATA 4 dell'LCD 
       TRISB1=0;          //DATA 5 
       TRISB2=0;          //DATA 6 
       TRISB3=0;          //DATA 7 
       TRISB4=0;          //RS 
       TRISB5=0;          //E 
       TRISA=1;            // setta le porte A del pic come entrate 
       DelayMs(100);    // serve per stabilizzare l'alimentazione dell'lcd (l'lcd è molto lento) 
       LCD_INIT();       // INDISPENSABILE serve ad inizializzare l'LCD 
       DelayMs(250);    // piccolo ritardo per completare l'inizializzazione (facoltativo) 
       LCD_CLEAR();  // Cancella il display  
       DelayUs(200);     // Altra piccola pausa (facoltativo) 
       LCD_CMD(LCD_line1);                               //qui dico che devo cominciare a scrivere dal primo carattere del primo rigo 
       LCD_PUTS("Primo programma LCD");     // ecco come si mette una stringa di caratteri 
       LCD_CMD(LCD_line2);                               //sposta il cursore alla prima posizione della seconda riga 
       LCD_PUTS("valore assegnato:");               // altra stringa 
       LCD_PUTUN(valore);                                   //numero già assegnato con define all'inizio del programma 
       LCD_CMD(LCD_line3);                              // terzo rigo 
       LCD_PUTUN(valore);                                  // di nuovo il numero assegnato 
       LCD_PUTS("x10+13=");                             // stringa di caratteri per far apparire l'operazione sul display 
       LCD_PUTUN((valore*10)+13);                   // fa il calcolo e scrive il risultato 
       while(1) // inizio ciclo 
                { 
                 if(PORTA==0b00000001)                   // verifica se viene premuto il tasto su RA0 
                    
                    LCD_CMD(LCD_line4);                 //quarto rigo 
                    LCD_PUTS("tasto 1 premuto ");    // stringa che appare se viene premuto il tasto su RA0 
                    } 
                 if(PORTA==0b00000010)                   // verifica se viene premuto il tasto su RA1 
                    { 
                    LCD_CMD(LCD_line4);                 // quarto rigo, riposiziona il cursore alla prima posizione del quarto rigo 
                    LCD_PUTS("tasto 2 premuto ");    //stringa per il tasto su RA1 
                    } 
                if(PORTA==0b00000000)                     // verifica che non viene permuto nessun tasto 
                   { 
                   LCD_CMD(LCD_line4);                   //riposiziona il cursore alla prima posizione del quarto rigo 
                   LCD_PUTS("Nessun tasto premuto"); //stringa che appare se non viene premuto nessun tasto 
                   } 
               
 
Semplice vero?Andrea ha fatto un buon lavoro con la sua routine e ha reso estremamente semplice la stesura del codice da parte del programmatore.Spero che questa pagina sia stata abbastanza chiara e vi abbia messo in condizioni di usare i display LCD.Per coloro che vogliano approfondire l'argomento LCD è disponibile un'altra pagine, in questo stesso sito,Dove viene descritta un'altra routine più complessa e completa.
 
barra rossa2 
 
b_home2_baloon 
 
© 2002-2006 by Sergio Fiocco -Tutti i diritti riservati- Vietata la riproduzione, anche parziale del presente sito