// Define DS1307 I2C address
#define DS1307_ADDRESS 0x68
// Function to initialize I2C without using Wire library
void i2c_init() {
// Set SDA and SCL as input
pinMode(A4, INPUT_PULLUP); // SDA
pinMode(A5, INPUT_PULLUP); // SCL
// Enable I2C
TWSR = 0; // no prescaler
TWBR = ((F_CPU / 100000) - 16) / 2; // Set to 100kHz
TWCR = _BV(TWEN); // Enable TWI
}
// Function to start I2C transmission
void i2c_start() {
TWCR = _BV(TWINT) | _BV(TWSTA) | _BV(TWEN);
while (!(TWCR & _BV(TWINT)));
}
// Function to stop I2C transmission
void i2c_stop() {
TWCR = _BV(TWINT) | _BV(TWSTO) | _BV(TWEN);
while (TWCR & _BV(TWSTO));
}
// Function to write byte to I2C bus
void i2c_write(byte data) {
TWDR = data;
TWCR = _BV(TWINT) | _BV(TWEN);
while (!(TWCR & _BV(TWINT)));
}
// Function to read byte from I2C bus
byte i2c_read(bool ack) {
TWCR = _BV(TWINT) | _BV(TWEN) | (ack ? _BV(TWEA) : 0);
while (!(TWCR & _BV(TWINT)));
return TWDR;
}
// Function to read minutes from DS1307
byte readMinutesFig6() {
i2c_start();
i2c_write(DS1307_ADDRESS << 1); // Address + Write bit
i2c_write(0x01); // Register to read (minutes register)
i2c_start();
i2c_write((DS1307_ADDRESS << 1) | 0x01); // Address + Read bit
byte minutes = i2c_read(false);
i2c_stop();
// Convert BCD to decimal
byte tens = (minutes >> 4) & 0x07;
byte ones = minutes & 0x0F;
return tens * 10 + ones;
}
// Function to read minutes from DS1307
byte readMinutesFig5() {
i2c_start();
i2c_write(DS1307_ADDRESS << 1|0x00); // Address + Write bit
i2c_write(0x01); // Register to read (minutes register)
i2c_stop();
i2c_start();
i2c_write((DS1307_ADDRESS << 1) | 0x01); // Address + Read bit
byte minutes = i2c_read(false);
i2c_stop();
// Convert BCD to decimal
byte tens = (minutes >> 4) & 0x07;
byte ones = minutes & 0x0F;
return tens * 10 + ones;
}
// Function to read minutes from DS1307
void writeMinutes() {
i2c_start();
i2c_write(DS1307_ADDRESS << 1); // Address + Write bit
i2c_write(0x01); // Register to read (minutes register)
i2c_write(0x30);
i2c_stop();
return;
}
void setup() {
Serial.begin(9600);
i2c_init();
writeMinutes();
}
void loop() {
byte minutes = readMinutesFig6();
Serial.print("Minutes: ");
Serial.println(minutes);
delay(1000);
}