Version:0.9 StartHTML:0000000105 EndHTML:0000017377 StartFragment:0000001499 EndFragment:0000017361 mikroIDE
sbit LCD_RS at RB5_bit;
sbit LCD_EN at RB4_bit;
sbit LCD_D4 at RB3_bit;
sbit LCD_D5 at RB2_bit;
sbit LCD_D6 at RB1_bit;
sbit LCD_D7 at RB0_bit;

sbit LCD_RS_Direction at TRISB5_bit;
sbit LCD_EN_Direction at TRISB4_bit;
sbit LCD_D4_Direction at TRISB3_bit;
sbit LCD_D5_Direction at TRISB2_bit;
sbit LCD_D6_Direction at TRISB1_bit;
sbit LCD_D7_Direction at TRISB0_bit;


unsigned int Temp;                //Variabile temperatura
unsigned short DuCy, Vel;              //Variabile duty cycle
char txt0[7];
char txt1[7];

void main() {                     //Programma principale

  TRISC = 0;                      //PORTC uscite
  PWM1_Init(6250);                //Frequenza PWM 6.25KHz
  PWM1_Set_Duty(0);               //PWM spento
  PWM1_Start();                   //PWM acceso

  ADC_Init();                     //ADC inizializzato
  
  Lcd_Init();                        // Initialize LCD

  Lcd_Cmd(_LCD_CLEAR);               // Clear display
  Lcd_Cmd(_LCD_CURSOR_OFF);

  while(1){                       //Ciclo infinito

    Temp = ADC_Read(1);           //Leggi valore ADC
    Temp = Temp * 0.48828;        //Converti in gradi centigradi

    if(Temp < 30){                //Se la Temp è minore di trenta...
      DuCy = 0;
      PWM1_Set_Duty(DuCy);           //Ventola spenta
    }

    else if(Temp > 80){          //Se la Temp è maggiore di ottanta...
      DuCy = 255;
      PWM1_Set_Duty(DuCy);        //Ventola accesa al massimo
    }

    else{                        //Se Temp è nel range 30-80 gradi allora...
      DuCy = Temp * 3.18;        //Moltiplica Temp per 255/TempMax (255/80=3.18)
      PWM1_Set_Duty(DuCy);       //Imposta il duty cycle calcolato
    }

    Delay_ms(400);               //Aspetta 0.5S prima di ricontrollare la Temp

    Lcd_Cmd(_LCD_CLEAR);
    
    Lcd_Cmd(_LCD_FIRST_ROW);
    Lcd_Out_Cp(" Temp  ");
    IntToStrWithZeros(Temp, txt0);
    Lcd_Out_Cp(txt0);
    Lcd_Out_Cp("^C   ");
    
    Lcd_Cmd(_LCD_SECOND_ROW);
    Lcd_Out_Cp(" Vel   ");
    DuCy = DuCy/2.55;
    IntToStrWithZeros(DuCy, txt1);
    Lcd_Out_Cp(txt1);
    Lcd_Out_Cp("%");
  }
}