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;
}
}
}