TEMPRORIZADO 24H

General discussion on Libstock website & codes posted on this website.
Post Reply
Author
Message
SERGIO3214
Posts: 1
Joined: 06 Jul 2019 03:46

TEMPRORIZADO 24H

#1 Post by SERGIO3214 » 06 Jul 2019 03:57

ALGUEM PODERIA ME AJUDA NESSE CONDIGO
TODA VEZ QUE INCREMENTO MAS UMA VARIAVEL WHILE O HORARIA SAI DA TELA DO LCD

Code: Select all

// Software I2C connections
sbit Soft_I2C_Scl           at RC3_bit;
sbit Soft_I2C_Sda           at RC4_bit;
sbit Soft_I2C_Scl_Direction at TRISC3_bit;
sbit Soft_I2C_Sda_Direction at TRISC4_bit;
// End Software I2C connections


sbit LCD_RS at RC0_bit;                                   //Connessioni LCD
sbit LCD_EN at RC1_bit;
sbit LCD_D4 at RC2_bit;
sbit LCD_D5 at RC5_bit;
sbit LCD_D6 at RC6_bit;
sbit LCD_D7 at RC7_bit;
sbit LCD_RS_Direction at TRISC0_bit;
sbit LCD_EN_Direction at TRISC1_bit;
sbit LCD_D4_Direction at TRISC2_bit;
sbit LCD_D5_Direction at TRISC5_bit;
sbit LCD_D6_Direction at TRISC6_bit;
sbit LCD_D7_Direction at TRISC7_bit;

unsigned short sec     absolute 0x0020;                  //Variabili necessarie
unsigned short minute  absolute 0x0021;
unsigned short hour    absolute 0x0022;
unsigned short dato    absolute 0x0023;
unsigned short ora_accensione, minuti_accensione;
unsigned short ora_spegnimento, minuti_spegnimento;
unsigned accensione, spegnimento, ora_min;
unsigned char regolazione = 0;                           //Variabile regolazione
unsigned char time[9];                                   //Stringhe di caratteri
char text[4];
const  unsigned char  SECONDS_ADDRES=0x00;               //Indirizzi modulo DS3231
const  unsigned char  MINUTES_ADDRES=0x01;
const  unsigned char  HOURS_ADDRES  =0x02;



void Write_CMD_DS3231(unsigned char address,unsigned char dato){      //Sottoprogramma scrittura comandi
   if(address == 0x0E ||  address == 0x0F){                           //Se l'indirizzo è 0x0E o 0x0F
      Soft_I2C_Start();                                                   //Inizializza I2C Scrivi 0xD0
      Soft_I2C_Write(0xD0);                                                  //Scrivi indirizzo
      Soft_I2C_Write(address);                                               //Scrivi il dato
      Soft_I2C_Write(dato);                                                  //Ferma I2C
      Soft_I2C_Stop();
   }
}

unsigned char Read_TIMER_DS3231(unsigned char address){               //Sottoprogramma lettura data e ora
   unsigned char value;
   if((address>=0x00)&&(address<=0x06)){                              //Se l'indirizzo è compreso
      Soft_I2C_Start();                                                   //tra quelli di data e ora inizializza I2C
      Soft_I2C_Write(0xD0);                                                  //Scrivi 0xD0
      Soft_I2C_Write(address);                                               //Scrivi indirizzo
      Soft_I2C_Start();                                          //Se vi sono problemi ripeti lo start
      Soft_I2C_Write(0xD1);                                                  //Scrivi 0xD1
      value = Soft_I2C_Read(0);                                             //Leggi I2C
      Soft_I2C_Stop();                                                    //Stop I2C
      return(value);
   }
}

unsigned char BCDUpperPart(unsigned char bcd_var){                    //Sottoprogramma BCD to decimale
   return (((bcd_var & 0xF0)>>4));
}

unsigned char BCDLowerPart(unsigned char bcd_var){                    //Sottoprogramma BCD to Decimale
   return ((bcd_var & 0x0F));
}

unsigned char IntToBCD (unsigned char int_var ){                      //Sottoprogramma da decimale a BCD
   return Dec2Bcd(int_var);
}

void Write_TIMER_DS3231(unsigned char address,unsigned char dato){    //Sottoprogramma scrittura data e ora
   if((address>=0x00)&&(address<=0x06)){                              //Se l'indirizzo è quello di data e ora
      Soft_I2C_Start();                                                   //Scrivi indirizzo e dato
      Soft_I2C_Write(0xD0);
      Soft_I2C_Write(address);
      Soft_I2C_Write(dato);
      Soft_I2C_Stop();
    }
}

void Write_RAM_DS3231(unsigned char address,unsigned char dato){     //Sottoprogramma scrittura EEprom
  if((address>=0x14)&&(address<=0xFF)){                              //Se l'indirizzo è quello della EEProm
     Soft_I2C_Start();                                                   //Avvia scrittura
     Soft_I2C_Write(0xD0);
     Soft_I2C_Write(address);
     Soft_I2C_Write(dato);
     Soft_I2C_Stop();
  }
}

unsigned char Read_RAM_DS3231(unsigned char address){               //Sottoprogramma lettura EEprom
  unsigned char value;
  if((address>=0x14)&&(address<=0xFF)){                             //Se l'indirizzo è quello della EEProm
    Soft_I2C_Start();                                                   //Avvia lettura
    Soft_I2C_Write(0xD0);
    Soft_I2C_Write(address);
    Soft_I2C_Start();
    Soft_I2C_Write(0xD1);
    value = Soft_I2C_Read(0);
    Soft_I2C_Stop();
    return(value);
  }
}

int Display_Lcd_Time(unsigned char time_vect){                     //Scrittura ora su LCD
  unsigned int or_mi;
  time[0] = BCDUpperPart(hour);                                    //Scrivi ora
  time[1] = BCDLowerPart(hour);
  time[2] = ':';                                                   //scrivi :
  time[3] = BCDUpperPart(minute);                                  //Scrivi minuti
  time[4] = BCDLowerPart(minute);
  time[5] = ':';                                                   //Scrivi :
  time[6] = BCDUpperPart(sec);                                     //Scrivi secondi
  time[7] = BCDLowerPart(sec);
  time[8] = '\0';
  hour = (time[0]*10) + time[1];                                   //Ottieni valore ora e min
  minute = (time[3]*10)+ time[4];
  sec = (time[6]*10)+ time[7];
  time[0] += 48;                                                   //Trasforma in caratteri
  time[1] += 48;
  time[3] += 48;
  time[4] += 48;
  time[6] += 48;
  time[7] += 48;
  Lcd_Out(1,7,time);                                               //Visualizza su LCD
  or_mi = (hour * 100) + minute;
  return or_mi;                                                    //ritorna il valore di ore e minuti
}

void EXT_INT() iv 0x0004 ics ICS_AUTO {                            //Interrupt
  Delay_ms(300);
  regolazione ++;                                                  //Cambia regolazione
  INTCON.INTF = 0;                                               //reset del flag
}

void main(){                                                     //PORTB0 e 1 Ingressi
  TRISA.F2 = 1;
  TRISA.F1 = 1;                                                  //PORTC uscite
  TRISB.F4 = 0;
  ADCON0   = 0x00;
  ANSEL    = 0;
  ANSELH   = 0;
  C1ON_bit = 0;
  C2ON_bit = 0;
  INTCON.GIE = 1;                                                //attivo gli interrupt
  OPTION_REG.INTEDG = 1;                                           //interrupt sul fronte di salita
  INTCON.INTE = 1;

  Lcd_Init();                                                    //Initializza LCD
  Lcd_Cmd(_LCD_CLEAR);                                           //Pulisci LCD
  Lcd_Cmd(_LCD_CURSOR_OFF);                                      //Spegni cursore
  Delay_ms(1000);

  Soft_I2C_Init();                                             //I2C a 100KHz

  Write_CMD_DS3231(0x0E,0x00);                                   //Configura modulo ds3231
  Write_CMD_DS3231(0x0F,0xF8);

  ora_accensione = EEPROM_Read(0x00);                            //Leggi i valori memorizzati
  minuti_accensione = EEPROM_Read(0x01);                         //Di accensione e spegnimento
  ora_spegnimento = EEPROM_Read(0x02);
  minuti_spegnimento = EEPROM_Read(0x03);

  while(1){                                                      //Ciclo infinito
    while(regolazione == 0){
      Lcd_Cmd(_LCD_CLEAR);                                       //Scrivi data e ora
      Lcd_Out (1, 1, "TIME:");
      sec    = Read_TIMER_DS3231(SECONDS_ADDRES);                //Leggi data e ora e aggiorna
      minute = Read_TIMER_DS3231(MINUTES_ADDRES);
      hour   = Read_TIMER_DS3231(HOURS_ADDRES);
      ora_min = Display_Lcd_Time(time[9]);                       //Visualizza data e ora
      Delay_ms(500);
//Controlla se è il momento di accendere o spegnegnere il dispositivo sull'uscita
      if(accensione <= spegnimento){
        if((ora_min >= accensione) && (ora_min < spegnimento)) PORTB.F4 = 1;
        else PORTB.F4 = 0;
      }
      else {
        if(ora_min >= accensione) PORTB.F4 = 1;
        else if((ora_min >= 0) && (ora_min < spegnimento)) PORTB.F4 = 1;
        else PORTB.F4 = 0;
      }
    }


  while (regolazione == 1){                                    //Se regolazione = 1
    Lcd_Out (1, 1, "ORA:  ");                                  //Regola ora
    ByteToStr(hour, text);
    Lcd_Out_Cp(text);
    Lcd_Out_Cp("   ");
    if(PORTA.F1 == 1){
      Lcd_Cmd(_LCD_CLEAR);
      hour ++;
      if(hour > 23) hour = 0;
      Delay_ms(200);
    }
  }

  while (regolazione == 2){                                   //Regolazione = 2 regola minuti
    Lcd_Out (1, 1, "MINUTI: ");
    ByteToStr(minute, text);
    Lcd_Out_Cp(text);
    Lcd_Out_Cp("   ");
    if(PORTA.F1 == 1){
      Lcd_Cmd(_LCD_CLEAR);
      minute ++;
      if(minute > 59) minute = 0;
      Delay_ms(200);
    }
  }

  while (regolazione == 3){                                  //Regolazione = 3 regola secondi
    Lcd_Out (1, 1, "SECONDI: ");
    ByteToStr(sec, text);
    Lcd_Out_Cp(text);
    Lcd_Out_Cp("   ");
    if(PORTA.F1 == 1){
      Lcd_Cmd(_LCD_CLEAR);
      sec ++;
      if(sec > 59) sec = 0;
      Delay_ms(200);
    }
  }

  if(regolazione == 4){                                     //Se regolazione = 4
    Lcd_Cmd(_LCD_CLEAR);
    sec    = IntToBCD (sec);                                //Converti da decimali a BCD
    minute = IntToBCD (minute);
    hour   = IntToBCD (hour);
    Write_TIMER_DS3231(SECONDS_ADDRES,sec);                 //Inserisci i valori nel modulo DS3231
    Write_TIMER_DS3231(MINUTES_ADDRES,minute);
    Write_TIMER_DS3231(HOURS_ADDRES,hour);
    regolazione ++;
  }
  while (regolazione == 5){                                 //Se regolazione = 5
    Lcd_Out (1, 1, "ORA ON:  ");                            //Regola ora accensione
    ByteToStr(ora_accensione, text);
    Lcd_Out_Cp(text);
    Lcd_Out_Cp("   ");
    if(PORTA.F1 == 1){
      Lcd_Cmd(_LCD_CLEAR);
      ora_accensione ++;
      EEPROM_Write(0x00, ora_accensione);
      if(ora_accensione == 25) ora_accensione = 0;
      Delay_ms(200);
    }
  }

  while (regolazione == 6){                                  //Regolazione = 6
    Lcd_Out (1, 1, "MINUTI ON: ");                           //Regola minuti accensione
    ByteToStr(minuti_accensione, text);
    Lcd_Out_Cp(text);
    Lcd_Out_Cp("   ");
    if(PORTA.F1 == 1){
      Lcd_Cmd(_LCD_CLEAR);
      minuti_accensione ++;
      EEPROM_Write(0x01, minuti_accensione);
      if(minuti_accensione == 60) minuti_accensione = 0;
      Delay_ms(200);
    }
  }
  while (regolazione == 7){                                  //Se regolazione = 7
    Lcd_Out (1, 1, "ORA OFF:  ");                            //Regola ora spegnimento
    ByteToStr(ora_spegnimento, text);
    Lcd_Out_Cp(text);
    Lcd_Out_Cp("   ");
    if(PORTA.F1 == 1){
      Lcd_Cmd(_LCD_CLEAR);
      ora_spegnimento ++;
      EEPROM_Write(0x02, ora_spegnimento);
      if(ora_spegnimento == 25) ora_spegnimento = 0;
      Delay_ms(200);
    }
  }

  while (regolazione == 8){                                   //Regolazione = 8
    Lcd_Out (1, 1, "MINUTI OFF: ");                           //Regola minuti spegnimento
    ByteToStr(minuti_spegnimento, text);
    Lcd_Out_Cp(text);
    Lcd_Out_Cp("   ");
    if(PORTA.F1 == 1){
      Lcd_Cmd(_LCD_CLEAR);
      minuti_spegnimento ++;
      EEPROM_Write(0x03, minuti_spegnimento);
      if(minuti_spegnimento == 60) minuti_spegnimento = 0;
      Delay_ms(200);
    }
  }
  while (regolazione == 9){                                   //Regolazione = 8
    Lcd_Out (1, 1, "ORA OFF: ");                           //Regola minuti spegnimento
    ByteToStr(minuti_spegnimento, text);
    Lcd_Out_Cp(text);
    Lcd_Out_Cp("   ");
    if(PORTA.F1 == 1){
      Lcd_Cmd(_LCD_CLEAR);
      minuti_spegnimento ++;
      //EEPROM_Write(0x03, minuti_spegnimento);
      if(minuti_spegnimento == 60) minuti_spegnimento = 0;
      Delay_ms(200);
    }
  }

  if (regolazione == 10){                                           //se regolazione = 9
    accensione = (ora_accensione * 100) + minuti_accensione;       //Converti in decimale l'ora accensione
    spegnimento = (ora_spegnimento * 100) + minuti_spegnimento;    //Converti in decimale l'ora spegnimento
    Lcd_Out (1, 1, "Tempi impostati");                             //Mostra questa stringa
    Delay_ms(1000);
    regolazione = 0;
  }
 }
}

Post Reply

Return to “Libstock Discussion”