#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/i2c.h"
#define DS_ADDR 0x68 // Endereço do dispositivo I2C
#define SDA_PIN 2
#define SCL_PIN 3
void show_formated_date(int years, int months, int days, int hours, int minutes, int seconds) {
printf("%02d/%02d/%04d - %02d:%02d:%02d\n\n", days, months, years, hours, minutes, seconds);
// 24/09/2024 –13:27:00
}
void ds_write(uint8_t reg, uint8_t value) {
uint8_t data[2] = {reg, value};
i2c_write_blocking(i2c1, DS_ADDR, data, 2, true);
}
uint8_t ds_read(uint8_t reg) {
uint8_t value;
i2c_write_blocking(i2c1, DS_ADDR, ®, 1, true); // Envia o endereço do registro
i2c_read_blocking(i2c1, DS_ADDR, &value, 1, false); // Lê o valor do registro
return value;
}
uint8_t bcd_to_decimal(uint8_t bcd) {
return (bcd >> 4) * 10 + (bcd & 0x0F);
}
uint8_t decimal_to_bcd(uint8_t decimal) {
return ((decimal / 10) << 4) + (decimal % 10);
}
int main() {
stdio_init_all();
// Inicializa o I2C no I2C_PORT com os pinos definidos
i2c_init(i2c1, 100 * 1000);
gpio_pull_up(SDA_PIN);
gpio_pull_up(SCL_PIN);
gpio_set_function(SDA_PIN, GPIO_FUNC_I2C);
gpio_set_function(SCL_PIN, GPIO_FUNC_I2C);
sleep_ms(100);
// Configura o DS1307
ds_write(0x00, decimal_to_bcd(0));
ds_write(0x01, decimal_to_bcd(27)); // Define minutos como 0
ds_write(0x02, decimal_to_bcd(13));
ds_write(0x04, decimal_to_bcd(24));
ds_write(0x05, decimal_to_bcd(9));
ds_write(0x06, decimal_to_bcd(24)); // Define segundos como 24 (0-99)
while (1) {
// Leitura dos valores
uint8_t seconds = bcd_to_decimal(ds_read(0x00));
uint8_t minutes = bcd_to_decimal(ds_read(0x01));
uint8_t hours = bcd_to_decimal(ds_read(0x02));
uint8_t days = bcd_to_decimal(ds_read(0x04));
uint8_t months = bcd_to_decimal(ds_read(0x05));
uint16_t years = 2000 + bcd_to_decimal(ds_read(0x06));
fflush(stdout);
show_formated_date(years, months, days, hours, minutes, seconds);
sleep_ms(5000);
}
}