Moderadores: andre_luis, 51, guest2003, Renie
int A,B,C,D,E,F,Ano,Mes,Dia,Dia_Juliano;
String Dia_Semana[7]={"Segunda-feira","Terça-feira","Quarta-feira",
"Quinta-feira","Sexta-feira","Sábado","Domingo"};
Ano = 2008;
Mes = 05;
Dia = 03;
if( Mes < 3 )
{
Ano = Ano - 1;
Mes = Mes + 12;
}
A = Ano/100;
B = A/4;
C = 2 - A + B;
//Se a data for igual ou anterior a 4/10/1582 (fim do Calendário Juliano):
//C = 0
if(Dia <= 4 && Mes <= 10 && Ano <= 1582)
C=0;
D = 365.25 * (Ano + 4716);
E = 30.6001 * (Mes + 1);
Dia_Juliano = D + E + Dia + C - 1524;
NomeDia = Dia_Semana[Dia_Juliano%7];
char dias_semana [7][4] = "SEG", "TER", "QUA", "QUI", "SEX", "SAB", "DOM";
printf ( "Hoje eh: %s", dia_semana[DAY] );
printf ( "Hoje eh: %s", dia_semana[DAY-1] );
...
...
const char* dsem[] = "Domingo","Segunda","Terca ","Quarta ","Quinta ","Sexta ","Sabado "; //dsem[0...6]=string
...
...
char dias_semana [7][4] = "SEG", "TER", "QUA", "QUI", "SEX", "SAB", "DOM";
printf ( "Hoje eh: %s", dia_semana[DAY-1] );
void programa_i2c(){
I2C_Init(100000); // iniciliza I2C com frequencia de 100KHz
I2C_Start(); //inicializa a comunicação I2c
I2C_Wr(0xD0); //endereço fixo para a categoria do DS1307: 1101000X, onde x = 0 é para gravação, e X = 1 para leitura.
I2C_Wr(0); //endereço onde iremos começar a programação do relógio, neste caso é o endereço dos segundos.
I2C_Wr(0x25); //inicializa a contagem dos segundos apartir de 25.
I2C_Wr(0x44); //inicializa a contagem a partir de 44 minutos.
I2C_Wr(0x08); //inicializa a contagem das 08:00hs (formato 24 horas).
I2C_Wr(0x06); //inicializa a contagem da sexta feira da semana
I2C_Wr(0x14); //inicializa a contagem do dia 14 do mes
I2C_Wr(0x10); //inicializa a contagem do mês de setembro
I2C_Wr(0x07); //inicializa a contagem do ano 07.
I2C_Stop(); //condição de finalização da comunicação I2C
}
void leitura_rtc() { //rotina de leitura do DS1307
I2C_Start(); //inicializa comunicação i2c
I2C_Wr(0xD0); //endereço fixo para a categoria do DS1307: 1101000X, onde x = 0 é para gravação, e X = 1 para leitura.
I2C_Wr(0); //endereço onde iremos começar a programação do relógio, neste caso é o endereço dos segundos.
I2C_Repeated_Start(); // Issue I2C signal repeated start
I2C_Wr(0xD1); //endereço fixo para a categoria do DS1307: 1101000X com o ultimo bit acionado (1) para leitura
segundo = I2C_Rd(1); //lê o primeiro byte segundos e informa que ainda leremos mais dados através do sinalizador (1)
minuto = I2C_Rd(1); //lê o segundo byte minutos e informa que ainda leremos mais dados através do sinalizador (1)
horas = I2C_Rd(1);
dias_semana = I2C_Rd(1);
dia = I2C_Rd(1);
mes = I2C_Rd(1);
anos = I2C_Rd(0); //lê o setimo byte horas e encerra as leituras de dados, graças ao sinalizador (0)
I2C_Stop(); //finaliza comunicação I2C
}
//////////////////////////////////////////////////////////////////
//Biblioteca para uso do DS1307
//Data: 20/02/2007
//Alterações: Buiz
///////////////////////////////////////////////////////////////////
#define RTC_SDA PIN_c4
#define RTC_SCL PIN_c3
#define DS1307_I2C_WRITE_ADDR 0xd0
#define DS1307_I2C_READ_ADDR 0xd1
#use i2c(master, sda=RTC_SDA, scl=RTC_SCL)
BYTE bin2bcd(BYTE binary_value);
BYTE bcd2bin(BYTE bcd_value);
void ds1307_init(void)
{
BYTE seconds = 0;
i2c_start();
i2c_write(0xD0); // WR to RTC
i2c_write(0x00); // REG 0
i2c_start();
i2c_write(0xD1); // RD from RTC
seconds = bcd2bin(i2c_read(0)); // Read current "seconds" in DS1307
i2c_stop();
seconds &= 0x7F;
delay_us(3);
i2c_start();
i2c_write(0xD0); // WR to RTC
i2c_write(0x00); // REG 0
i2c_write(bin2bcd(seconds)); // Start oscillator with current "seconds value
i2c_start();
i2c_write(0xD0); // WR to RTC
i2c_write(0x07); // Control Register
i2c_write(0x80); // Disable squarewave output pin
i2c_stop();
}
//------------------------------------------------------------------------
// Read one byte at the specified address.
// This function is used to access the control byte
// or the NVRAM bytes.
char le_ds1307(char addr)
{
char retval;
disable_interrupts(GLOBAL);
i2c_start();
i2c_write(DS1307_I2C_WRITE_ADDR);
i2c_write(addr);
i2c_start();
i2c_write(DS1307_I2C_READ_ADDR);
retval = i2c_read(0); // Don't ACK the last byte read
i2c_stop();
enable_interrupts(GLOBAL);
return(retval);
}
//----------------------------------------------------------------------
// Write one byte to the DS1307.
// This function is used to access the control byte
// or the NVRAM bytes.
void escreve_ds1307(char addr, char value)
{
disable_interrupts(GLOBAL);
i2c_start();
i2c_write(DS1307_I2C_WRITE_ADDR);
i2c_write(addr);
i2c_write(value);
i2c_stop();
enable_interrupts(GLOBAL);
}
//-------------------------------------------------------------
void ds1307_set_date_time(BYTE day, BYTE mth, BYTE year, BYTE dow, BYTE hr, BYTE min, BYTE sec)
{
sec &= 0x7F;
hr &= 0x3F;
i2c_start();
i2c_write(0xD0); // I2C write address
i2c_write(0x00); // Start at REG 0 - Seconds
i2c_write(bin2bcd(sec)); // REG 0
i2c_write(bin2bcd(min)); // REG 1
i2c_write(bin2bcd(hr)); // REG 2
i2c_write(bin2bcd(dow)); // REG 3
i2c_write(bin2bcd(day)); // REG 4
i2c_write(bin2bcd(mth)); // REG 5
i2c_write(bin2bcd(year)); // REG 6
i2c_write(0x80); // REG 7 - Disable squarewave output pin
i2c_stop();
}
void ds1307_get_date(BYTE &day, BYTE &mth, BYTE &year, BYTE &dow)
{
i2c_start();
i2c_write(0xD0);
i2c_write(0x03); // Start at REG 3 - Day of week
i2c_start();
i2c_write(0xD1);
dow = bcd2bin(i2c_read() & 0x7f); // REG 3
day = bcd2bin(i2c_read() & 0x3f); // REG 4
mth = bcd2bin(i2c_read() & 0x1f); // REG 5
year = bcd2bin(i2c_read(0)); // REG 6
i2c_stop();
}
void ds1307_get_time(BYTE &hr, BYTE &min, BYTE &sec)
{
i2c_start();
i2c_write(0xD0);
i2c_write(0x00); // Start at REG 0 - Seconds
i2c_start();
i2c_write(0xD1);
sec = bcd2bin(i2c_read() & 0x7f);
min = bcd2bin(i2c_read() & 0x7f);
hr = bcd2bin(i2c_read(0) & 0x3f);
i2c_stop();
}
BYTE bin2bcd(BYTE binary_value)
{
BYTE temp;
BYTE retval;
temp = binary_value;
retval = 0;
while(true)
{
// Get the tens digit by doing multiple subtraction
// of 10 from the binary value.
if(temp >= 10)
{
temp -= 10;
retval += 0x10;
}
else // Get the ones digit by adding the remainder.
{
retval += temp;
break;
}
}
return(retval);
}
// Input range - 00 to 99.
BYTE bcd2bin(BYTE bcd_value)
{
BYTE temp;
temp = bcd_value;
// Shifting upper digit right by 1 is same as multiplying by 8.
temp >>= 1;
// Isolate the bits for the upper digit.
temp &= 0x78;
// Now return: (Tens * 8) + (Tens * 2) + Ones
return(temp + (temp >> 2) + (bcd_value & 0x0f));
}
void programa_i2c(){
I2C_Init(100000); // iniciliza I2C com frequencia de 100KHz
I2C_Start(); //inicializa a comunicação I2c
I2C_Wr(0xD0); //endereço fixo para a categoria do DS1307: 1101000X, onde x = 0 é para gravação, e X = 1 para leitura.
I2C_Wr(0x07); //endereço de configuração do DS1307
I2C_Wr(0b00010000);// CONFIGURADO PARA SAIDA SQWE COM A FREQUENCIA DE 1 Hz
I2C_Stop();
delay_ms(1);
I2C_Start(); //inicializa a comunicação I2c
I2C_Wr(0xD0); //endereço fixo para a categoria do DS1307: 1101000X, onde x = 0 é para gravação, e X = 1 para leitura.
I2C_Wr(0x01); //endereço onde iremos começar a programação do relógio, neste caso é o endereço dos minutos.
I2C_Wr(0x44); //inicializa a contagem a partir de 44 minutos.
I2C_Wr(0x08); //inicializa a contagem das 08:00hs (formato 24 horas).
I2C_Wr(0x06); //inicializa a contagem da sexta feira da semana
I2C_Wr(0x14); //inicializa a contagem do dia 14 do mes
I2C_Wr(0x10); //inicializa a contagem do mês de setembro
I2C_Wr(0x07); //inicializa a contagem do ano 07.
I2C_Stop(); //condição de finalização da comunicação I2C
delay_ms(1);
I2C_Start(); //inicializa a comunicação I2c
I2C_Wr(0xD0); //endereço fixo para a categoria do DS1307: 1101000X, onde x = 0 é para gravação, e X = 1 para leitura.
I2C_Wr(0); //endereço onde iremos começar a programação do relógio, neste caso é o endereço dos segundos.
I2C_Wr(0x25); //inicializa a contagem dos segundos apartir de 25 e inicializar o oscilador interno
I2C_Stop(); //condição de finalização da comunicação I2C
}
void leitura_rtc() { //rotina de leitura do DS1307
I2C_Start(); //inicializa comunicação i2c
I2C_Wr(0xD0); //endereço fixo para a categoria do DS1307: 1101000X, onde x = 0 é para gravação, e X = 1 para leitura.
I2C_Wr(0); //endereço onde iremos começar a programação do relógio, neste caso é o endereço dos segundos.
I2C_Repeated_Start(); // Issue I2C signal repeated start
I2C_Wr(0xD1); //endereço fixo para a categoria do DS1307: 1101000X com o ultimo bit acionado (1) para leitura
segundo = I2C_Rd(1); //lê o primeiro byte segundos e informa que ainda leremos mais dados através do sinalizador (1)
minuto = I2C_Rd(1); //lê o segundo byte minutos e informa que ainda leremos mais dados através do sinalizador (1)
horas = I2C_Rd(1);
dias_semana = I2C_Rd(1);
dia = I2C_Rd(1);
mes = I2C_Rd(1);
anos = I2C_Rd(0); //lê o setimo byte horas e encerra as leituras de dados, graças ao sinalizador (0)
I2C_Stop(); //finaliza comunicação I2C
}
Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante