#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit DS1302_CLK=P1^2;
sbit DS1302_IO=P1^1;
sbit DS1302_RST=P1^0;
sbit lcden=P2^2;
sbit lcdwr=P2^1;
sbit lcdrs=P2^0;
unsigned char second,minute,hour,week,day,month,year;
unsigned char table[]="0123456789";
//unsigned char table1[]=" ";
unsigned char table2[]=" ";
unsigned char table3[]="Time: ";
unsigned char table4[]="Date: ";
unsigned int time[]={
0x09,0x12,0x27,0x03,0x23,0x59,0x40
};
uchar num,count,date,shi;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
//向DS1302送一个字节//
void InputByte(unsigned char byte1)
{
char i;
for(i=8;i>0;i--)
{
DS1302_IO=(bit)(byte1&0x01);
DS1302_CLK=1;
_nop_();
DS1302_CLK=0;
byte1>>=1;
}
return;
}
//读DS1302一个字节//
unsigned char outputbyte(void)
{
unsigned char i;
unsigned char ucdat=0;
for(i=8;i>0;i--)
{
DS1302_IO=1;
ucdat>>=1;
if(DS1302_IO)ucdat|=0x80;
DS1302_CLK=1;
_nop_();
DS1302_CLK=0;
}
return(ucdat);
}
//向DS1302某地址写一个字节数据//
void write_ds1302(unsigned char addr,unsigned char TDat)
{
DS1302_RST=0;
_nop_();
DS1302_CLK=0;
_nop_();
DS1302_RST=1;
InputByte(addr);
_nop_();
InputByte(TDat);
DS1302_CLK=1;
_nop_();
DS1302_RST=0;
}
//读DS1302地址子程序//
unsigned char read_ds1302(unsigned char addr)
{
unsigned char timedata;
DS1302_RST=0;
_nop_();
DS1302_CLK=0;
_nop_();
DS1302_RST=1;
InputByte(addr);
timedata=outputbyte();
DS1302_CLK=1;
_nop_();
DS1302_RST=0;
return(timedata);
}
//DS1302的初始化//
void initial_ds1302()
{
write_ds1302(0x8e,0x00);//写保护寄存器
write_ds1302(0x8c,time[0]);//年
write_ds1302(0x88,time[1]);//月
write_ds1302(0x86,time[2]);//日
write_ds1302(0x8A,time[3]);//星期
write_ds1302(0x84,time[4]);//时
write_ds1302(0x82,time[5]);//分
write_ds1302(0x80,time[6]);//秒
write_ds1302(0x8e,0x80);//写保护寄存器
}
//读DS1302时间//
void read_time()
{
second=read_ds1302(0x81);
minute=read_ds1302(0x83);
hour=read_ds1302(0x85);
week=read_ds1302(0x8B);
day=read_ds1302(0x87);
month=read_ds1302(0x89);
year=read_ds1302(0x8d);
}
//液晶显示程序//
void write_com(uchar com)//写指令//
{
lcdrs=0;
lcdwr=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_data(uchar date) //写数据//
{
lcdrs=1;
lcdwr=0;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init()
{
lcden=0;
write_com(0x38); //置初值//
write_com(0x0c);
write_com(0x06);
write_com(0x81);
}
void Display(void)
{
num=0;
count=0;
for(date=0;date<6;date++)
{
write_data(table3[date]);
}
//write_com(0x81);
write_data(table[hour/16]); //写第1行数据//
write_data(table[hour%16]);
write_data(':');
write_data(table[minute/16]);
write_data(table[minute%16]);
write_data(':');
write_data(table[second/16]);
write_data(table[second%16]);
//write_com(0x01);
write_com(0x80+0x41);
for(shi=0;shi<6;shi++)
{
write_data(table4[shi]);
}
write_data(table[year/16]);
write_data(table[year%16]);
write_data('-');
write_data(table[month/16]);
write_data(table[month%16]);
write_data('-');
write_data(table[day/16]);
write_data(table[day%16]);
write_com(0x80);
for(count=0;count<16;count++);
{
write_data(table2[count]);
}
}
int main(void)
{
initial_ds1302();
init();
for(;;)
{
read_time();
Display();
}
}