本程序只能显示时间,,还不能调节时间
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit rs=P1^0;
sbit rw=P1^1;
sbit E=P1^2;
sbit sclk=P1^3;
sbit data_io=P1^4;
sbit rst=P1^5;
uchar code table1[]=" 20 / / ";
uchar code table2[]=" : : ";
uchar code weektable[]="Mon TuesWeb ThurFri Sat Sun ";
uchar shi,fen,miao,month,day,week,year;
void delay_ms(uint ms)
{
uint a,b;
for(a=0;a<ms;a++)
for(b=0;b<1141;b++);
}
void delay_ds1302(uint ms)
{
uint i,j;
for (i=ms;i>0;i--)
for(j=124;j>0;j--);
}
void write_ds1302 (uchar addr ,uchar shu)
{
uchar temp,t;
rst=0;
sclk=0;
rst=1;
temp=addr;
for(t=0;t<8;t++)
{
if((temp&0x01)==1)
{
data_io=1;
}
else
data_io=0;
sclk=1;
delay_ds1302(1);
sclk=0;
temp=temp>>1;
}
temp=shu;
for(t=0;t<8;t++)
{
if((temp&0x01)==1)
{
data_io=1;
}
else
data_io=0;
sclk=1;
delay_ds1302(1);
sclk=0;
temp=temp>>1;
}
rst=0;
}
uchar read_ds1302(uchar addr)
{
uchar temp ,t;
rst =0;
sclk=0;
rst=1;
temp=addr;
for(t=0;t<8;t++)
{
if (temp&0x01)
data_io=1;
else
data_io=0;
sclk=1;
sclk=0;
temp=temp>>1;
}
temp=0;
for(t=0;t<7;t++)
{
if(data_io==1)
{
temp=temp|0x80;
}
else
temp=temp&0x7f;
sclk=1;
sclk=0;
temp=temp>>1;
}
return temp;
}
void write_com (uchar com)
{
P2=com;
rs=0;
rw=0;
E=1;
delay_ms(1);
E=0;
}
void write_date (uchar date)
{
P2=date;
rs=1;
rw=0;
E=0;
delay_ms(1);
E=1;
delay_ms(1);
E=0;
}
void init()
{
uchar i;
write_com(0x38);
delay_ms(2);
write_com(0x0c);
delay_ms(2);
write_com(0x06);
delay_ms(2);
write_com(0x80);
delay_ms(1);
for(i=0;i<16;i++)
{
write_date (table1[i]);
}
write_com(0xc0);
delay_ms(1);
for(i=0;i<12;i++)
{
write_date (table2[i]);
}
}
void write_sfm(uchar add,uchar date)
{
uchar ten,ge;
ten=date>>4;
ge=date&0x0f;
write_com(0xc0+add);
write_date(0x30+ten);
write_date(0x30+ge);
}
void write_nyr(uchar add,uchar date)
{
uchar ten,ge;
ten=date>>4;
ge=date&0x0f;
write_com(0x80+add);
write_date(0x30+ten);
write_date(0x30+ge);
}
void write_week(uchar add,uchar week)
{
uchar ge,i;
ge=week&0x0f;
write_com(0x80+add);
if(ge==1)
{
for(i=0;i<4;i++)
{
write_date(weektable[i]);
}
}
if(ge==2)
{
for(i=4;i<8;i++)
{
write_date(weektable[i]);
}
}
if(ge==3)
{
for(i=8;i<12;i++)
{
write_date(weektable[i]);
}
}
if(ge==4)
{
for(i=12;i<16;i++)
{
write_date(weektable[i]);
}
}
if(ge==5)
{
for(i=16;i<20;i++)
{
write_date(weektable[i]);
}
}
if(ge==6)
{
for(i=20;i<24;i++)
{
write_date(weektable[i]);
}
}
if(ge==7)
{
for(i=24;i<28;i++)
{
write_date(weektable[i]);
}
}
}
void main ()
{
init ();
write_ds1302(0x8e,0x00);
write_ds1302(0x90,0xa7);
write_ds1302(0x80,0x50);//second
write_ds1302(0x82,0x59);//minute
write_ds1302(0x84,0x23);//hour
write_ds1302(0x8a,0x07);//week
write_ds1302(0x86,0x23);//day
write_ds1302(0x88,0x05);//month
write_ds1302(0x8c,0x10);//year
while(1)
{
shi=read_ds1302(0x85);
fen=read_ds1302(0x83);
miao=read_ds1302(0x81);
day=read_ds1302(0x87);
month=read_ds1302(0x89);
year=read_ds1302(0x8d);
week=read_ds1302(0x8b);
write_sfm(10,miao);
write_sfm(7,fen);
write_sfm(4,shi);
write_nyr(9,day);
write_nyr(6,month);
write_nyr(3,year);
write_week(12,week);
}
}