#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/i2c.h"
#define DS1307_ADDR 0x68
uint8_t bcd_to_dec(uint8_t bcd) {
return ((bcd >> 4) * 10) + (bcd & 0x0F);
}
uint8_t dec_to_bcd(uint8_t decimal) {
return ((decimal / 10) << 4) | (decimal % 10);
}
// escreve um byte
void write_byte(uint8_t reg, uint8_t data) {
uint8_t buf[2];
buf[0] = reg;
buf[1] = data;
i2c_write_blocking(i2c_default, DS1307_ADDR, buf, 2, false);
}
// le um byte
uint8_t read_byte(uint8_t reg) {
uint8_t data;
i2c_write_blocking(i2c_default, DS1307_ADDR, ®, 1, true);
i2c_read_blocking(i2c_default, DS1307_ADDR, &data, 1, false);
return data;
}
// configura a data e hora
void set_date_time(uint8_t ano, uint8_t mes, uint8_t dia, uint8_t hora, uint8_t minuto, uint8_t segundo) {
write_byte(0x00, dec_to_bcd(segundo));
write_byte(0x01, dec_to_bcd(minuto));
write_byte(0x02, dec_to_bcd(hora));
write_byte(0x04, dec_to_bcd(dia));
write_byte(0x05, dec_to_bcd(mes));
write_byte(0x06, dec_to_bcd(ano));
}
// le a data e hora
void get_date_time(uint8_t *ano, uint8_t *mes, uint8_t *dia, uint8_t *hora, uint8_t *minuto, uint8_t *segundo) {
*segundo = bcd_to_dec(read_byte(0x00) & 0x7F);
*minuto = bcd_to_dec(read_byte(0x01));
*hora = bcd_to_dec(read_byte(0x02) & 0x3F);
*dia = bcd_to_dec(read_byte(0x04));
*mes = bcd_to_dec(read_byte(0x05));
*ano = bcd_to_dec(read_byte(0x06));
}
int main() {
stdio_init_all();
i2c_init(i2c_default, 100 * 1000); // 100 kHz
gpio_set_function(PICO_DEFAULT_I2C_SDA_PIN, GPIO_FUNC_I2C);
gpio_set_function(PICO_DEFAULT_I2C_SCL_PIN, GPIO_FUNC_I2C);
gpio_pull_up(PICO_DEFAULT_I2C_SDA_PIN);
gpio_pull_up(PICO_DEFAULT_I2C_SCL_PIN);
// data e hora no ds1307
set_date_time(24, 9, 24, 13, 27, 0); // 2024/09/24 - 13:27:00
while (1) {
uint8_t ano, mes, dia, hora, minuto, segundo;
// pega a data e hora do ds1307
get_date_time(&ano, &mes, &dia, &hora, &minuto, &segundo);
printf("Data: %02d/%02d/20%02d - %02d:%02d:%02d\n", dia, mes, ano, hora, minuto, segundo);
sleep_ms(5000);
}
return 0;
}