#include<stdio.h>
#include<reg51.h>
#define PCF8583W 0xA0
#define PCF8583R 0xA1
#define lcd_dta P0
sbit RS = P0^0;
sbit RW = P0^1;
sbit EN = P0^2;
sbit lcdBL = P0^3;
sbit RTCSCL=P1^2;
sbit RTCSDA=P1^3;
unsigned char i1,i2;
unsigned char idata SECS _at_ 0x39;
unsigned char idata MINS _at_ 0X3A;
unsigned char idata HRS _at_ 0X3B;
unsigned char idata YDATE _at_ 0X3C;
unsigned char idata DMONTH _at_ 0X3D;
unsigned char idata lastread _at_ 0x3E;
unsigned char idata tp _at_ 0x3F;
unsigned char data1,data7,data8;
unsigned char SECS1,MINS1,HRS1,YDATE1,DMONTH1;
unsigned char x,y;
unsigned char xbyte[]=" ";
/***************A short Delay Function for the LCD delay timimgs****************/
void shortdelay()
{
for(i1=0;i1<4;i1++)
{
}
}
/**************A long delay function for the Processor reset to LCD reset Timing***************/
void longdelay()
{
for (i1=0;i1<44;i1++)
{
for(i2=0;i2<0xFF;i2++)
{
}
}
}
/************** LCD Command Write Function*****************************************************/
void write_command()
{
RW = 0;
RS = 0;
EN = 1;
B = ACC;
ACC= ACC & 0xF0;
ACC = ACC | 0x0C;
P0 = ACC;
shortdelay();
EN = 0;
shortdelay();
EN = 1;
ACC = B;
ACC = ACC & 0X0F;
ACC = ACC<<4;
ACC = ACC | 0x0C;
P0 = ACC;
shortdelay();
EN = 0;
longdelay();
}
/************** LCD Data Write Function*****************************************************/
void write_data()
{
RW = 0;
RS = 1;
EN=1;
B = ACC;
ACC = ACC & 0XF0;
ACC = ACC | 0x0D;
P0 = ACC;
shortdelay();
EN = 0;
shortdelay();
EN = 1;
ACC = B;
ACC = ACC & 0X0F;
ACC = ACC<<4;
ACC = ACC | 0x0D;
P0 = ACC;
shortdelay();
EN=0;
longdelay();
}
/********************** LCD Initialization Functions*********************************/
void init_lcd()
{
lcdBL = 1;
ACC = 0X28;
write_command();
ACC = 0X0C;
write_command();
ACC = 0X06;
write_command();
ACC = 0x01;
write_command();
}
void initialise()
{
longdelay();
longdelay();
longdelay();
longdelay();
init_lcd();
P0 = 0xFF;
P0 = 0x08;
init_lcd();
longdelay();
}
/************** BCD to HEX code conversion ****************/
void bcd_to_hex(unsigned mybyte)
{
x=mybyte&0x0F;
x=(x+0x30);
y=mybyte&0xF0;
y=y>>4;
y=(y+0x30);
}
void sclhigh()
{
hg:
RTCSCL=1;
if (RTCSCL!=1)
{
goto hg;
}
}
void delay()
{
int m;
for (m=0;m<9;m++ )
{
}
}
void init_ser()
{
TI=0;
RI=0;
TMOD=0X20;
TH1=0X0FD;
SCON=0X50;
EA =1;
ET0 =1;
TR1 =1;
}
/**********RTC start***************************/
void start()
{
RTCSDA = 1;
sclhigh();
RTCSDA=0;
delay();
RTCSCL = 0;
}
/**********RTC stop*****************************/
void stop()
{
RTCSDA=0;
sclhigh();
RTCSDA=1;
}
/******************RTC writing byte**************/
void sendbyte()
{
unsigned char data2;
unsigned char i;
for (i=0;i<8;i++ )
{
data2 = (data1 & 0x80);
if (data2 == 0x80)
{
RTCSDA = 1;
}
else
{
RTCSDA = 0;
}
sclhigh();
data1=data1<<1;
RTCSCL=0;
}
RTCSDA = 1;
sclhigh();
if (RTCSDA != 1)
{
goto sb;
}
else
{
goto sa;
}
sa:
sb:
delay();
RTCSCL=0;
delay();
}
/*******************RTC Reading byte*****************/
void readbyte()
{
unsigned char j;
RTCSDA=1;
for (j=0;j<8 ;j++)
{
sclhigh();
tp=RTCSDA;
if (tp==1)
{
data7=(data8 | 0x01);
}
else
{
data7=(data8 & 0xfe);
}
data8=data7<<1;
RTCSCL=0;
delay();
delay();
delay();
}
if(lastread==1)
{
goto ack1;
}
RTCSDA=0;
ack1:
sclhigh();
RTCSCL=0;
ACC=data7;
}
/*************************READ CLOCK***********************/
void rd_clock()
{
lastread = 0; //before read byte set the lastread=0
start();
data1=PCF8583W; //WRITE
sendbyte();
data1=0x02;
sendbyte();
stop();
start();
data1=PCF8583R; //READ//
sendbyte();
readbyte();
SECS1 = ACC;
readbyte();
MINS1 = ACC;
readbyte();
HRS1 = ACC;
readbyte();
YDATE1 = ACC;
lastread = 1; //before the lastread byte,set the lastread=1
readbyte();
DMONTH1 = ACC;
stop();
}
/********************** SET CLOCK ********************/
void set_clock()
{
start();
data1 = PCF8583W;
sendbyte();
data1 = 0X02;
sendbyte();
data1 = SECS;
sendbyte();
data1 = MINS;
sendbyte();
data1 = HRS;
sendbyte();
data1 = YDATE;
sendbyte();
data1 = DMONTH;
sendbyte();
stop();
}
void send (unsigned char dat1)
{
SBUF = dat1;
while(!TI);
TI=0;
}
void send_data(unsigned char data3)
{
unsigned char R;
R = data3 & 0xF0;
R = R >> 4;
R = R + 0x30;
send (R);
R = data3 & 0x0F;
R = R + 0x30;
send (R);
}
void main()
{
SECS = 0x00;
MINS = 0x29;
HRS = 0x18;
YDATE = 0x24;
DMONTH = 0x04;
set_clock();
init_ser();
initialise();
while(1)
{
send('a');
rd_clock();
ACC=0x80;
write_command();
//data1 = SECS;
ACC = HRS1;
send_data(HRS1);
ACC = HRS1;
bcd_to_hex(HRS1);
ACC = y;
write_data();
ACC = x;
write_data();
ACC = ':';
write_data();
ACC = ':';
write_data();
ACC=0x84;
write_command();
ACC = MINS1;
send_data(MINS1);
ACC = MINS1;
bcd_to_hex(MINS1);
ACC = y;
write_data();
ACC = x;
write_data();
ACC = ':';
write_data();
ACC = ':';
write_data();
ACC=0x88;
write_command();
ACC = SECS1;
send_data(SECS1);
ACC = SECS1;
bcd_to_hex(SECS1);
ACC = y;
write_data();
ACC = x;
write_data();
ACC=0xC0;
write_command();
ACC = YDATE;
send_data(YDATE1);
bcd_to_hex(YDATE1);
ACC = x;
write_data();
ACC = y;
write_data();
ACC = DMONTH;
send_data(DMONTH1);
bcd_to_hex(DMONTH1);
ACC = x;
write_data();
ACC = y;
write_data();
}
}