c program real time clock ds1307
Hi,
I just now work with DS1307 on my four 7-segment clock project. Here is code. I write it in Hi-tech C for PIC.
first declare:
unsigned char rtcvalue_bin,rtcvalue_bcd,rtcreg;
unsigned char rtensec,rsec,rtenmin,rmin,rtenhour,rhour,rday,rtendate,rdate,rmonth,rtenmonth,rtenyear,ryear;
void rtc_read(unsigned char *rtc_buffer);
Then:
void read_ds(void)
{
unsigned char rtc[8];
rtc_read(rtc); // rtc read subroutine
rsec=(rtc[0]&0x0f); // seconds
rtensec=(rtc[0]>>4);
rmin=(rtc[1]&0x0f); // minutes
rtenmin=(rtc[1]>>4);
rhour=(rtc[2]&0x0f); // hours
rtenhour=(rtc[2]>>4);
rday=(rtc[3]&0x0f); // weekday
rdate=(rtc[4]&0x0f); // date
rtendate=(rtc[4]>>4);
rmonth=(rtc[5]&0x0f);
rtenmonth=((rtc[5]&0b00010000)>>4);
ryear=(rtc[6]&0x0f); // year
rtenyear=(rtc[6]>>4);
}
void rtc_set(unsigned char rtcreg)
{
SEN = 1; // send start bit START
while(SEN); // and wait for it to clear
ACKDT = 0; // acknowledge bit
SSPIF = 0;
SSPBUF = 0xD0; // set device address 0xd0 // write SLAVE ADDRESS
while(!SSPIF); // wait for interrupt
SSPIF = 0; // then clear it.
SSPBUF = rtcreg; // register select rtc WORD ADDRESS
while(!SSPIF); //
SSPIF = 0; //
SSPBUF = rtcvalue_bcd; // write data to rtc DATA 0
while(!SSPIF); // wait for interrupt
SSPIF = 0; // then clear it.
PEN = 1; // send stop bit STOP
while(PEN);
}
void rtc_read(unsigned char *rtc_buffer) // i2c rtc read 8 bytes
{
SEN = 1; // send start bit START
while(SEN); // and wait for it to clear
ACKDT = 0; // acknowledge bit
SSPIF = 0;
SSPBUF = 0xd0; // set device address 0xd0 // write SLAVE ADDRESS
while(!SSPIF); // wait for interrupt
SSPIF = 0; // then clear it.
SSPBUF = 0; // read from address 0 = register 0, rtc WORD ADDRESS - control 1
while(!SSPIF); // wait for interrupt
SSPIF = 0; // then clear it.
RSEN = 1; // send repeated start bit REPEATED START
while(RSEN); // and wait for it to clear
SSPIF = 0;
SSPBUF = 0xd1; // set device address - read WORD ADDRESS - CONTROL 2
while(!SSPIF); // wait for interrupt
SSPIF = 0; // then clear it.
RCEN = 1; // start receiving READ & ACK buffer 0
while(!STAT_BF); // wait for data
rtc_buffer[0] = SSPBUF; // and get it // buffer
ACKEN = 1; // start acknowledge sequence
while(ACKEN); // wait for ack. sequence to end
RCEN = 1; // start receiving READ & ACK buffer 1
while(!STAT_BF); // wait for data
rtc_buffer[1] = SSPBUF; // and get it // buffer
ACKEN = 1; // start acknowledge sequence
while(ACKEN); // wait for ack. sequence to end
RCEN = 1; // start receiving READ & ACK buffer 2
while(!STAT_BF); // wait for data
rtc_buffer[2] = SSPBUF; // and get it // buffer
ACKEN = 1; // start acknowledge sequence
while(ACKEN); // wait for ack. sequence to end
RCEN = 1; // start receiving READ & ACK buffer 3
while(!STAT_BF); // wait for data
rtc_buffer[3] = SSPBUF; // and get it // buffer
ACKEN = 1; // start acknowledge sequence
while(ACKEN); // wait for ack. sequence to end
RCEN = 1; // start receiving READ & ACK buffer 4
while(!STAT_BF); // wait for data
rtc_buffer[4] = SSPBUF; // and get it // buffer
ACKEN = 1; // start acknowledge sequence
while(ACKEN); // wait for ack. sequence to end
RCEN = 1; // start receiving READ & ACK buffer 5
while(!STAT_BF); // wait for data
rtc_buffer[5] = SSPBUF; // and get it // buffer
ACKEN = 1; // start acknowledge sequence
while(ACKEN); // wait for ack. sequence to end
RCEN = 1; // start receiving READ & ACK buffer 6
while(!STAT_BF); // wait for data
rtc_buffer[6] = SSPBUF; // and get it // buffer
ACKEN = 1; // start acknowledge sequence
while(ACKEN); // wait for ack. sequence to end
RCEN = 1; // start receiving READ LAST & NO ACK buffer 7
while(!STAT_BF); // wait for data
rtc_buffer[7] = SSPBUF; // and get it // buffer7
ACKDT = 1; // not acknowledge for last byte
PEN = 1; // send stop bit STOP
while(PEN);
}
In main program you must set up I2C bus and use this to start DS1307:
void main(void)
{
.
.
rtcreg=0x00;
rtcvalue_bcd=0b00000000;
rtc_set(rtcreg);
DelayMs(10);
while(1)
{
.
.
.
IT MUST WORK