Toll-Free Customer Support 24/7

PIC Development Board

/*
* Project name:RTC
PIC Development Board
* Copyright
(c) Researchdesignlab.com
* Test configuration:
MCU: PIC16F877A
Dev.Board: PIC
Oscillator: 20.0 MHz
Software: MPLAB IDE v8.92(HI-TECH_C)
*/


#include<stdio.h>

#include<htc.h>

#define _XTAL_FREQ 20000000

#include "string.h"

#define LC01CTRLIN 0xd0

#define LC01CTRLOUT 0xd1

#define I2C_FREG 100

#define FOSC 10000

unsigned char sec,min,hour,day,date,month,year;

unsigned char data[7]={0x45,0x59,0x71,0x01,0x13,0x10,0x13};

int i;

void DS1307Write(unsigned char,unsigned char);

void WaitMSSP();

unsigned char DS1307Read(unsigned char);

void i2c_init(void);

char UART_Init(const long int);

void ds1307_init(void);

void DelayMs(unsigned int);

void main()

{

int count=0;

DelayMs(20); //provide a delay

ds1307_init(); //initialize ds1307

UART_Init(9600); //initialize the UART

for(i=0;i<7;i++)

DS1307Write(i,data[i]);

DelayMs(20); //provide a delay

while(1)

{

sec=DS1307Read(0); // Read second

min=DS1307Read(1); // Read minute

hour=DS1307Read(2); // Read hour

day=DS1307Read(3); // Read day

date=DS1307Read(4); // Read date

month=DS1307Read(5); // Read month

year=DS1307Read(6); // Read year

printf("Time: %x : %x : %x ",(hour&0x1f),min,sec); //Display the Hours, Minutes, Seconds(hours is taken from 5 LSB bits )

printf("Date: %x / %x / %x \r",date,month,year); //Display the Date, Month, Year

DelayMs(150); //provide a delay

}

}

 

void DS1307Write(unsigned char addr, unsigned char data)

{

SEN=1; //Initiate Start condition on SDA & SCL pins

WaitMSSP();

SSPBUF=LC01CTRLIN; // Slave address + Write command

WaitMSSP();

SSPBUF=addr; // Write the location

WaitMSSP();

SSPBUF=data; // Write the Data

WaitMSSP();

PEN=1; // Enable the Stop bit

WaitMSSP();

}

 

unsigned char DS1307Read(unsigned char addr)

{

unsigned char x;

RSEN=1; // Enable the repeated Start Condition

WaitMSSP ();

SSPBUF=LC01CTRLIN; // Slave address + Write command

WaitMSSP ();

SSPBUF=addr; //Write the location (memory address of Hour, minute, etc...)

WaitMSSP ();

RSEN=1; // Enable the repeated Start Condition

WaitMSSP ();

SSPBUF=LC01CTRLOUT; // Slave address + Read command

WaitMSSP ();

RCEN=1; // Enable to receive data

WaitMSSP ();

ACKDT=1; // Acknowledge the operation (Send NACK)

ACKEN=1; // Acknowledge sequence on SDA & SCL pins

PEN=1; // Enable the Stop bit

WaitMSSP ();

x=SSPBUF; // Store the Receive value in a variable

return (x);

}

 

void WaitMSSP()

{

while(!SSPIF); // SSPIF is zero while TXion is progress

SSPIF=0;

}

 

void ds1307_init()

{

TRISC3=1; // RC3,RC4 set to I2C Mode(Input)

TRISC4=1;

SSPCON=0x28; // Enable the SDA,SCL & I2C Master Mode

SSPADD=(FOSC / (4 * I2C_FREG)) – 1;// SSP baud rate 100Khz

SSPSTAT=0x80; // Disable slew Rate control

PORTC=0x18;

DS1307Write(0,0x00);

}

 

void putch(unsigned char byte)//Required for printf statement

{

 

while(!TXIF); // Wait for the Transmit Buffer to be empty

TXREG = byte; // Transmit the Data

}

 

void DelayMs(unsigned int Ms)//Function to provide a delay

{

int delay_cnst;

while(Ms>0)

{

Ms--;

for(delay_cnst = 0;delay_cnst <220;delay_cnst++);

}

}

char UART_Init(const long int baudrate)//function to initialize the UART
{
unsigned int x;
x = (_XTAL_FREQ - baudrate*64)/(baudrate*64);
if(x>255)
{
x = (_XTAL_FREQ - baudrate*16)/(baudrate*16);
BRGH = 1; //High Baud Rate Select bit set to high
}
if(x<256)
{
SPBRG = x; //Writing SPBRG register
SYNC = 0; //Selecting Asynchronous Mode
SPEN = 1; //enables serial port
TRISC7 = 1;
TRISC6 = 1;
CREN = 1; //enables continuous reception
TXEN = 1; //enables continuous transmission
return 1;
}
return 0;
}

 

Back to top