#include #include #include "delay.h" #define LCD_DEFAULT #include "LCD_44780.h" #pragma config FOSC = HS #pragma config WDT = OFF #pragma config LVP = OFF #pragma config PBADEN = OFF //OSC = HS Impostato per lavorare ad alta frequenza //WDT = OFF Disabilito il watchdog timer //LVP = OFF Disabilito programmazione LVP //PBADEN = OFF Disabilito gli ingressi analogici unsigned int litri_impostati = 0; unsigned int litri_conteggiati = 0; unsigned char i = 0; unsigned char conteggio = 0; #define ON 1 #define OFF 0 //************************************************************ // Dichiarazione Prototipi di funzione //************************************************************ // Prototipo di funzione per bassa priorita' void Low_Int_Event (void); // Prototipo di funzione per alta priorita' void High_Int_Event (void); //************************************************************ // Impostazione e Gestione priorita' alta //************************************************************ #pragma code high_vector = 0x08 void high_interrupt (void) { // Salto per la gestione dell'interrupt ad alta priorita' _asm GOTO High_Int_Event _endasm } #pragma code #pragma interrupt High_Int_Event // Funzione per la gestione dell'interruzione ad alta priorita' void High_Int_Event (void) { // Controllo che l'interrupt sia stato generato da PORTB if (INTCONbits.RBIF == 1 ) { delay_ms(100); // Controllo la pressione di RB4 if (PORTBbits.RB4 == 0) { // Azzero i litri litri_impostati=0x00; i=0; } // Controllo la pressione di RB5 if (PORTBbits.RB5 == 0) { // Aumento i litri litri_impostati++; } // Controllo la pressione di RB7 if (PORTBbits.RB7 == 0) { LATCbits.LATC0 = 0x01 ; //Accendo il rel่ conteggio=ON ; } // Controllo la pressione di RB6 if(PORTBbits.RB6 == 0 && conteggio==ON) { litri_impostati--; // Diminuisco i litri i++; // conto i litri if ( litri_impostati==0 ) { LATCbits.LATC0 = 0x00 ; //Spengo il rel่ conteggio=OFF ; } } OpenLCD(20); BacklightLCD (TURN_ON); WriteStringLCD ("Litri impos.:"); ShiftCursorLCD(RIGHT,1); WriteIntLCD(litri_impostati,2); Line2LCD(); WriteStringLCD ("i :"); //Visualizzo il conteggio del contalitri collegato all'ingresso RB6 ShiftCursorLCD(RIGHT,1); WriteIntLCD(i,2); // Resetto il flag d'interrupt per permettere nuove interruzioni INTCONbits.RBIF = 0; } } //************************************************************ // Impostazione e Gestione priorita' bassa //************************************************************ #pragma code low_vector = 0x18 void low_interrupt (void) { // Salto per la gestione dell'interrupt a bassa priorita' _asm GOTO Low_Int_Event _endasm } #pragma code #pragma interruptlow Low_Int_Event // Funzione per la gestione dell'interruzione ad alta priorita' void Low_Int_Event (void) { // Controllo che l'interrupt sia stato generato da Timer0 if (INTCONbits.TMR0IF == 1 ) { // UTILIZZABILE PER ALTRA FUNZIONE // Resetto il flag d'interrupt per permettere nuove interruzioni INTCONbits.TMR0IF = 0; } } //************************************************************ // Inizio programma principale //************************************************************ void main (void){ // Imposto PORTA tutti ingressi LATA = 0x00; TRISA = 0xFF; // Imposto PORTB tutti ingressi LATB = 0x00; TRISB = 0xFF; //Imposto PORTC tutti ingressi ad RC0 come uscita PORTC = 0x00; LATC = 0; TRISC = 0b11111110; // Imposto PORTD tutte uscite LATD = 0x00; TRISD = 0x00; // Imposto PORTE tutti ingressi LATE = 0x00; TRISE = 0xFF; //************************************************************ // Abilito i pulsanti per le interruzioni ad alta priorita' //************************************************************ // Abilita i resistori di pull-up sulla PORTB EnablePullups(); // Abilito le interruzioni su PORTB INTCONbits.RBIE = 1; // Abilito le interruzioni su PORTB come alta priorita' INTCON2bits.RBIP = 1; //************************************************************ // Abilito il Timer0 per funzionare a bassa priorita' //************************************************************ // Modalita' a 16 bit T0CONbits.T08BIT = 0; // Clock interno T0CONbits.T0CS = 0; // Abilito Prescaler T0CONbits.PSA = 0; // Prescaler 32 T0CONbits.T0PS0 = 0; T0CONbits.T0PS1 = 0; T0CONbits.T0PS2 = 1; // Abilito le interruzioni del Timer0 INTCONbits.TMR0IE = 1; // Abilito le interruzioni del Timer0 come bassa priorita' INTCON2bits.TMR0IP = 0; // Abilito il Timer0 T0CONbits.TMR0ON = 1; //************************************************************ // Abilito le interruzioni //************************************************************ // Abilito modalita' interruzione a due livelli alta e bassa RCONbits.IPEN = 1; // Abilito gli interrupt ad alta priorita' INTCONbits.GIEH = 1; // Abilito gli interrupt a bassa priorita' INTCONbits.GIEL = 1 ; // Ciclo infinito while (1){ } }