#include
#include
#define uint unsigned int
#define uchar unsigned char
***it yma=P2^2; //138译码器控制口
***it ymb=P2^3;
***it ymc=P2^4;
***it sclk=P3^6;//ds1302控制
***it ce=P3^5;
***it io=P3^4;
***it rs=P2^6;//lcd1602控制
***it rw=P2^5;
***it sn=P2^7;
char code dsread[]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d,};//ds1302读数组
char code dswrite[]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c,};//写数组
char time[]={0,0,0x12,0x01, 0x01, 0x02, 0x13};//存放时间数组
void delay(uint x)//延时
{
uint i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
void ds1302write(uchar add, uchar dat)//数据和地址的写入
{
char n;
ce=0;
_nop_();
sclk=0;
_nop_();
ce=1;
_nop_();
for(n=0;n<8;n++)
{
io=add&0x01;
add>>=1;
sclk=1;
_nop_();
sclk=0;
_nop_();
}
for(n=0;n<8;n++)
{
io=dat&0x01;
dat>>=1;
sclk=1;
_nop_();
sclk=0;
_nop_();
}
ce=0;
_nop_();
}
char ds1302read(char add)//读取数据
{
char n,dat,dat1;
ce=0;
_nop_();
sclk=0;
_nop_();
ce=1;
_nop_();
for(n=0;n<8;n++)
{
io=add&0x01;
add>>=1;
sclk=1;
_nop_();
sclk=0;
_nop_();
}
_nop_();
for(n=0;n<8;n++)
{
dat1=io;
dat=(dat>>1) | (dat1<<7);
sclk=1;
_nop_();
sclk=0;
_nop_();
}
ce = 0;
_nop_();
sclk = 1;
_nop_();
io = 0;
_nop_();
io = 1;
_nop_();
return dat;
}
void ds1302init()//初始化
{
char n;
ds1302write(0x8e,0x00);
for(n=0;n<7;n++)
{
ds1302write(dswrite[n],time[n]);
}
ds1302write(0x8e,0x80);
}
void dsreadtime()//读取时间
{
char n;
for(n=0;n<7;n++)
{
time[n] = ds1302read(dsread[n]);
}
}
void writecom(char com)
{
rs=0;
sn=0;
rw=0;
P0=com;
delay(5);
sn=1;
delay(5);
sn=0;
}
void writedate(char date)
{
rs=1;
sn=0;
rw=0;
P0=date;
delay(5);
sn=1;
delay(5);
sn=0;
}
void init()
{
writecom(0x38);
writecom(0x0c);
writecom(0x06);
writecom(0x01);
writecom(0x80);
}
void display()
{
writecom(0x80+0x40);
writedate('0'+time[2]/16);
writedate('0'+time[2]&0x0f);
writedate('-');
writedate('0'+time[1]/16);
writedate('0'+time[1]&0x0f);
writedate('-');
writedate('0'+time[0]/16);
writedate('0'+time[0]&0x0f);
}
void main()
{
init();
ds1302init();
while(1)
{
dsreadtime();
display();
}
}
1602显示部分测试过,是没问题的。主要是时间读不出来,求大神,帮帮忙,不胜感激
|