Na simulação do proteus ele mostra no display mas nao puxa a data e a hora do ds1307.
Código Mikroc
// LCD module connections
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
// End LCD module connections
// 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
unsigned short horas,minuto,segundo;
unsigned short dia, mes, ano, dia_semana;
unsigned short var1, var2;
char *texto;
// Rotina de conversão de dados para BCD
void BCD(unsigned short lin, unsigned short col,unsigned short var) {
var1= (var >> 4) + 0x30; //converte o primeiro nibble em BCD e após em string
LCD_Chr(lin,col,var1);//escreve caractere no LCD
var2= (var & 0x0F) + 0x30; //converte o segundo nibble em BCD e após isso, em string
LCD_Chr_Cp(var2); //escreve caractere no LCD
}
void leitura_rtc() { //rotina de leitura do DS1307
I2C1_Init(100000);
I2C1_Start(); //inicializa comunicação i2c
I2C1_Wr(0xD0); //end fixo para DS1307: 1101000X, onde x = 0 é para gravação
I2C1_Wr(0); //end onde começa a programação do relógio, end dos segundos.
I2C1_Repeated_Start(); //Issue I2C signal repeated start
I2C1_Wr(0xD1); //end fixo para DS1307: 1101000X, onde x=1 é para leitura
segundo= I2C1_Rd(1); //lê o primeiro byte(segundos),informa que continua lendo
minuto= I2C1_Rd(1); //lê o segundo byte(minutos)
horas= I2C1_Rd(1); //lê o terceiro byte(horas)
dia_semana= I2C1_Rd(1);
dia= I2C1_Rd(1);
mes= I2C1_Rd(1);
ano= I2C1_Rd(0); //lê o sétimo byte(ano),encerra as leituras de dados
I2C1_Stop(); //finaliza comunicação I2C
}
void grava_rtc(){
I2C1_Init(100000);//iniciliza I2C com frequencia de 100KHz
I2C1_Start(); //inicializa a comunicação I2c
I2C1_Wr(0xD0); //end fixo para DS1307: 1101000X, onde x = 0 é para gravação
I2C1_Wr(0); //end onde começa a programação do relógio, end dos segundos.
I2C1_Wr(0x04); //inicializa com 04 segundos.
I2C1_Wr(0x12); //inicializa com 12 minutos.
I2C1_Wr(0x09); //inicializa com 09:00hs (formato 24 horas).
I2C1_Wr(0x03); //inicializa com terça
I2C1_Wr(0x17); //inicializa com dia 17
I2C1_Wr(0x04); //inicializa com mês 04
I2C1_Wr(0x07); //inicializa com ano 07
I2C1_Stop(); //finaliza comunicação I2C
}
void encontra_dia_semana() {
switch (dia_semana) {
case 01: texto= "DOMINGO"; break; //caso dias_semana = 01 então..
case 02: texto= "SEGUNDA"; break; //caso dias_semana = 02 então..
case 03: texto= "TERCA"; break; //caso dias_semana = 03 então..
case 04: texto= "QUARTA"; break; //caso dias_semana = 04 então..
case 05: texto= "QUINTA"; break; //caso dias_semana = 05 então..
case 06: texto= "SEXTA"; break; //caso dias_semana = 06 então..
default: texto= "SABADO"; //se não for nenhum desses então...
}
}
void display_lcd() {
lcd_cmd(_lcd_clear); //apaga lcd
Lcd_Out(1,1,"(Hora)");
BCD(1,7,horas); //conversão da variável horas para BCD
LCD_Chr_Cp(':'); //escreve no display LCD
BCD(1,10,minuto); //conversão da variável minuto para BCD
LCD_Chr_Cp(':'); //escreve no display LCD
BCD(1,13,segundo); //conversão da variável segundo para BCD
Lcd_Out(2,1,"(Data)");
BCD(2,7,dia); //conversão da variável dia para BCD
LCD_Chr_Cp('/'); //escreve no display LCD
BCD(2,10,mes); //conversão da variável mes para BCD
LCD_Chr_Cp('/'); //escreve no display LCD
BCD(2,13,ano); //conversão da variável ano para BCD
encontra_dia_semana();
Lcd_out(3,1,texto); //mostra dia da semana
}
void main(){
PORTE = 0xFF;
TRISE = 0x0F; // PORTE is input
PORTB = 0;
TRISB = 0; // PORTB is output
TRISD=0;
PORTD=0;
TRISC=0;
PORTC=0;
adcon1= 0x06; //torna todos os pinos AD como i/o de uso geral
Lcd_Cmd(_Lcd_CLEAR); //apaga display
Lcd_Cmd(_Lcd_CURSOR_OFF); //desliga cursor
grava_rtc();
while(1){
display_lcd(); //escreve no display lcd o valor
leitura_rtc(); //efetua leitura de segundo, minuto e horas do DS1307
delay_ms(200); //delay de 200 milisegundos
}
}
proteus :
