Ok... aquele código parece correcto para mim.
Quanto ao que pretendes fazer, queres uma função que vá buscar a data e hora para meter no lcd, certo?
Experimenta adicionar isto no inicio:
struct data_hora {
unsigned char minuto;
unsigned char hora;
unsigned char dia;
unsigned char mes;
unsigned int ano;
} agora;
Isto é uma estrutura de dados que cria uma variável com o nome agora.
Depois a tua função printDate, passa a chamar-se updateTime e fica assim:
void updateTime(struct data_hora *dt){
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(zero);
Wire.endTransmission();
Wire.requestFrom(DS1307_ADDRESS, 7);
int dummy = (unsigned char)bcdToDec(Wire.read());
dt->minuto = bcdToDec(Wire.read());
dt->hora = (unsigned char)bcdToDec(Wire.read() & 0b111111);
dummy = bcdToDec(Wire.read());
dt->dia = (unsigned char)bcdToDec(Wire.read());
dt->mes = (unsigned char)bcdToDec(Wire.read());
dt->ano = bcdToDec(Wire.read());
}
Depois tens de fazer update à estrutura agora em todos os ciclos.
void loop() {
updateTime(&agora);
}
E para usares a estrutura agora, fazes assim:
void printLCD(){
lcd.setCursor(0,0);
lcd.print(celsius);
lcd.write(1);
lcd.setCursor(0,1);
lcd.print(agora.hora);
lcd.print(":");
lcd.print(agora.minuto);