Programmazione di LCD su EasyPic5 Finalità del Progetto : Creare una interfaccia menù sull LCD interattiva tramite i pulsanti del PORTA, con la possibilità di leggere delle stringhe sull LCD che descrivono la funzionalità dei pulsanti. Si tratta di una prova prototipo per una scheda da costruire per la torre di controllo di Venezia; si tratta di promemoria elettronico che descrive lo stato di occupazione della pista per i controllori del traffico aereo.
Scheda EasyPIC5 Elementi della scheda Easy Pic utilizzati: 1) Schermo LCD a 2 righe. 2) PIC16F887. 3) Entrate PORTA PORTB PORTC PORTD PORTE (X8 X8 X8 X8 X4). 4) Uscite PORTA PORTB PORTC PORTD PORTE (X8 X8 X8 X8 X4). 5) Dip-switch per selezione modalità d'uso. 6) Interfaccia di programmazione. 7) Interfaccia di alimentazione esterna Software di programmazione Suite di programmazione Mikroeletronika contenente: 1) Ambiente di sviluppo MikroC 2)Software di programmazione PicFlash. 3)Driver di interfacciamento PC PIC. Attenzione all impostazione corretta dei dip-switch che selezionano le diverse funzionalità sulla scheda.
Il listato del programma /* * Project name: Torre di controllo * Copyright: (c)4at ITIS Max Planck * Description: Un programma per fornire in uscita su LCD un messaggio prestabilito agendo sui pulsanti di una tastiera * Test configuration: MCU: PIC16F887 Dev.Board: EasyPIC5 Oscillator: HS, 08.0000 MHz Ext. Modules: LCD 2x16/3x16 SW: mikroc v8.0 * NOTES: Attenzione all'overmemory della RAM */ char *occupato = "RWY ENGAGED "; //inserimento variabili: char=testo; int=numeri interi char *libero = "Pista Libera"; char *sele = " "; char *A = "Safety"; char *B = "Elettricisti"; char *V = "Tecnosky"; char *O = "Falconiere"; char *E = "Follow-Me"; char *L = "Vigili Fuoco"; char *G = "Polizia"; char *H = "Altro"; int i,x,k,t=0; int Led(int z,int y){ //Funzione per attivare Leds int g=0; // flag g di controllo do{ //ogni 50 ms c'e' un controllo di un'eventuale //attivazione del pulsante numero z.
PORTD=y; //sul PORTD si vede qual è l ingresso attivo PORTD=0; //spegne i led. questa funzione fa: }while(g==0); //un continuo accendi/spegni dei led, e da questo } //ciclo si esce fuori solo cliccando lo stesso pulsante. int Ing(int z, int y, char zy){ //Funzione Ing Delay_ms(100); LCD_Out(1,1, occupato); //in uscita mostra nella riga 1, //colonna 1 la variabile "occupato". LCD_Out(2,1, zy); //idem, ma sulla seconda riga Led(z,y); //chiama la funzione Led, inserendo //con le 2 variabili di ingresso: //z=numero del pulsante, y=led LCD_Cmd(LCD_CLEAR); //Pulisce il display Delay_ms(100); } void main() { TRISC = 255; PORTC = 0; TRISD = 0; //inizio del programma //abilito il PORTC come ingresso //abilito il PORTD come uscita
PORTD = 0; ANSEL = 0; ANSELH = 0; Lcd_Config(&PORTB, 4, 5, 6, 3, 2, 1, 0); // Impostazione del PORTB // come uscita per LCD LCD_Cmd(LCD_CLEAR); // cancella il Display LCD_Out(1,1, libero); LCD_Out(2,1, sele); // Fa comparire nell' LCD la stringa libero // La stringa sele viene visualizzata nell' LCD do{ // Inizio del ciclo Do-While LCD_Out(1,1, libero); LCD_Out(2,1, sele); if (PORTC==1){Ing(1,1,A);} // Da qui inizia il controllo else if (PORTC==2){Ing(2,2,B);} // uno ad uno input attivi else if (PORTC==4){Ing(4,4,V);} // sul PORTC. else if (PORTC==8){Ing(8,8,O);} // se la condizione è vera, chiama else if (PORTC==16){Ing(16,16,E);} // la funzione else if (PORTC==32){Ing(32,32,L);} // Ing(Pulsante, Leds, variabile char) else if (PORTC==64){Ing(64,64,G);} else if (PORTC==128){Ing(128,128,H);} } }while(1); // Impostando cosi' da un ciclo infinito
FLOW CHART Programma INIZIO PROGRAMMA INSERIMENTO EVENTUALI VARIABILI ES: char *testo = Impostazione del PIC16F887: I/O dei quattro PORT DO In programma: do{ If (PORTC=1){Ing(1,1,A);} Else If (PORTC=2){Ing(2,2,B);} Else If (PORTC=4){Ing(4,4,V);} Else If (PORTC=8){Ing(8,8,O);} Else If (PORTC=16){Ing(16,16,E);} Else If (PORTC=32){Ing(32,32,L);} Else If (PORTC=64){Ing(64,64,G);} }while(1); IF in cascata dove si controlla ogni singolo pulsante con utilizzo della funzione Ing( ) per testare gli ingressi del PORTC. END While(1)
FUNZIONE Ing( ) INIZIO END Delay (ritardo) di 100 ms, per sincronizzare l azione sui tasti al prg. Definisco variabili esterne:int z, int y, char x Scrivo sull LCD (prima riga) occupato ; (seconda riga) la x. Chiamo la funzione Led con variabili. Esterne (z,y) Cancello LCD, con il comando: LCD_Cmd(LCD_Clear) Delay (ritardo) da 100 ms per la sincronizzazione Int Ing(int z, int y, char x){ Delay_ms(100); LCD_Out ( 1,1, Occupato ); LCD_Out ( 2,1, x); Led(z,y); //dentro alla funzione Ing( ) c e un altra funzione: Led( ) LCD_Cmd ( LCD_CLEAR); Dealy_ms(100); }
FUNZIONE Led( ) INIZIO Led Definisco variabili locali della funzione Led( ) Definisco la variabile Flag g = 0 DO I led assumono il valore y in binario. Un Delay di 50 ms X4 Delay e IF vengono ripetute per altre 4 volte I led vengono spenti tutti. SI Con if, controllo se viene premuto il pulsante num.z Se viene premuto, g assume valore 1 While (g==0) No END