|
|
|
![]() |
Lezione 3
Il primo programma per LCD
|
|
|
|
|
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.
|
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.
|