#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/i2c.h"
#define DS1307_ADDRESS 0x68
#define SDA_PIN 4
#define SCL_PIN 5
void i2c_write(uint8_t address, uint8_t *data, size_t length)
{
i2c_write_blocking(i2c_default, address, data, length, false);
}
void i2c_read(uint8_t address, uint8_t *data, size_t length)
{
i2c_read_blocking(i2c_default, address, data, length, false);
}
// Conversão de BCD para Decimal
uint8_t bcd_to_decimal(uint8_t bcd)
{
return (bcd / 16 * 10) + (bcd % 16);
}
// Conversão de Decimal para BCD
uint8_t decimal_to_bcd(uint8_t decimal)
{
return (decimal / 10 << 4) | (decimal % 10);
}
void initialize_ds1307()
{
i2c_init(i2c_default, 100000);
gpio_set_function(SDA_PIN, GPIO_FUNC_I2C);
gpio_set_function(SCL_PIN, GPIO_FUNC_I2C);
gpio_pull_up(SDA_PIN);
gpio_pull_up(SCL_PIN);
uint8_t data[2] = {0x00, 0x00};
i2c_write(DS1307_ADDRESS, data, 2);
}
void set_ds1307_time(uint8_t hour, uint8_t minute, uint8_t second, uint8_t date, uint8_t month, uint8_t year)
{
uint8_t time_data[8];
time_data[0] = 0x00;
time_data[1] = decimal_to_bcd(second);
time_data[2] = decimal_to_bcd(minute);
time_data[3] = decimal_to_bcd(hour);
time_data[5] = decimal_to_bcd(date);
time_data[6] = decimal_to_bcd(month);
time_data[7] = decimal_to_bcd(year);
i2c_write(DS1307_ADDRESS, time_data, 8);
}
void get_ds1307_time(uint8_t *hour, uint8_t *minute, uint8_t *second, uint8_t *date, uint8_t *month, uint8_t *year)
{
uint8_t time_data[7];
uint8_t reg = 0x00;
// Solicita leitura a partir do registrador 0x00
i2c_write(DS1307_ADDRESS, ®, 1);
i2c_read(DS1307_ADDRESS, time_data, 7);
// Converte BCD para decimal
*second = bcd_to_decimal(time_data[0]);
*minute = bcd_to_decimal(time_data[1]);
*hour = bcd_to_decimal(time_data[2]);
*date = bcd_to_decimal(time_data[4]);
*month = bcd_to_decimal(time_data[5]);
*year = bcd_to_decimal(time_data[6]);
}
int main()
{
stdio_init_all();
printf("Iniciando DS1307...\n");
initialize_ds1307();
printf("Configurando horário...\n");
set_ds1307_time(13, 27, 00, 24, 9, 24);
while (true)
{
uint8_t hour, minute, second, date, month, year;
get_ds1307_time(&hour, &minute, &second, &date, &month, &year);
printf("Hora: %02d:%02d:%02d, Data: %02d/%02d/20%02d\n",
hour, minute, second, date, month, year);
sleep_ms(5000);
}
return 0;
}