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;
}