#include <regx52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit RS=P2^4;
sbit RW=P2^5;
sbit E=P2^6;
sbit io=P3^4;
sbit rst=P3^5;
sbit sclk=P3^6;
uchar bdata ds,dt;
sbit ds0=ds^0;
sbit dt7=dt^7;
uchar idata lcddate[]={" 2011-07-25 1"};
uchar idata lcdtime[]={" 00:00:00"};
uchar table[]={"0123456789"};
uchar m,ms,mg; // 秒
uchar f,fs,fg; //分
uchar s,ss,sg; //时
uchar r,rs,rg; //日
uchar x,xs,xg; //星期
uchar y,ys,yg; //月
uchar n,ns,ng; //年
uchar temp;
void delay(uint z);
void w1602_data(uchar dt1602);
void w1602_com(uchar com);
void dis_lcd(uchar adr,uchar *temp,uint length) ;
void init_1602(); //初始化1602
void busy();
void lcd_reset();
void w1302_data(uchar adr,uchar dt1302) ;
uchar r1302_data(uchar adr);
void init_1302();
void read_1302();
void main()
{
init_1602(); //1602初始化
lcd_reset(); //1602复位
init_1302(); //1302初始化
dis_lcd(0x80+0x01,lcddate,13);
dis_lcd(0x80+0x43,lcdtime,9);
while(1)
{
read_1302();
dis_lcd(0x80+0x01,lcddate,13);
dis_lcd(0x80+0x43,lcdtime,9);
}
}
void delay(uint z)
{
uint x;
for(;z>2;z--)
for(x=175;x>0;x--);
}
/************************************************************************
1602
*************************************************************************/
void w1602_data(uchar dt1602) //向1602中写数据
{
RS=1;
RW=0;
P0=dt1602;
E=1;
E=0;
}
void w1602_com(uchar com) //向1602中写命令
{
RS=0;
RW=0;
P0=com;
E=1;
E=0;
}
void dis_lcd(uchar adr,uchar *temp,uint length) //1602显示
{
uint i;
w1602_com(adr);
delay(10);
for(i=0;i<length;i++)
{
w1602_data(temp[i]);
delay(10);
}
}
void init_1602() //初始化1602
{
uint num;
delay(15);
for(num=0;num<2;num++)
{
w1602_com(0x38);
delay(5);
}
busy();
w1602_com(0x38);
busy();
w1602_com(0x08);
busy();
w1602_com(0x01);
busy();
w1602_com(0x06);
busy();
w1602_com(0x0c);
}
void busy() //1602忙检测
{
{
temp=0xff;
RS=0;
RW=1;
E=1;
E=0;
temp=P0;
}while((temp&0x80)==0x80);
}
void lcd_reset()
{
w1602_com(0x01);
delay(5);
w1602_com(0x06);
delay(5);
w1602_com(0x0c);
delay(5);
}
/****************************************************************
DS1302
*****************************************************************/
void w1302_data(uchar adr,uchar dt1302) //向DS1302中写入数据
{
uint i;
ds=adr;
sclk=0;
rst=0;
rst=1;
for(i=0;i<8;i++) //写入控制字节
{
io=ds0;
sclk=1;
ds>>=1;
sclk=0;
}
ds=dt1302;
for(i=0;i<8;i++) //写入数据
{
io=ds0;
sclk=1;
ds>>=1;
sclk=0;
}
sclk=0;
rst=0;
}
uchar r1302_data(uchar adr) //读取DS1302中的数据
{
uint i;
ds=adr;
rst=0;
sclk=0;
rst=1;
for(i=0;i<8;i++) //写入控制字节
{
io=ds0;
sclk=1;
ds>>=1;
sclk=0;
}
for(i=0;i<8;i++) //读取数据
{
dt>>=1;
dt7=io;
sclk=1;
sclk=0;
}
sclk=0;
rst=0;
return dt;
}
void init_1302()
{
w1302_data(0x8e,0x00); //关闭写保护
w1302_data(0x90,0xaa); //供电方式
w1302_data(0x80,0x00); //时钟运行 秒
w1302_data(0x83,0x00);//分
w1302_data(0x84,0x00);// 24小时
w1302_data(0x86,0x25);// 日
w1302_data(0x88,0x07);// 月
w1302_data(0x8a,0x01);// 星期
w1302_data(0x8c,0x11); // 年
}
void read_1302()
{
m=r1302_data(0x81);
ms=(m>>4);
mg=m&0x0f;
f=r1302_data(0x83);
fs=(f>>4);
fg=f&0x0f;
s=r1302_data(0x85);
ss=(s>>4);
sg=s&0x0f;
r=r1302_data(0x87);
rs=(r>>4);
rg=r&0x0f;
y=r1302_data(0x89);
ys=(y>>4);
yg=y&0x0f;
x=r1302_data(0x8b);
n=r1302_data(0x8d);
ns=(n>>4);
ng=n&0x0f;
lcddate[3]=table[ns];
lcddate[4]=table[ng];
lcddate[6]=table[ys];
lcddate[7]=table[yg];
lcddate[9]=table[rs];
lcddate[10]=table[rg];
lcddate[12]=table[x];
lcdtime[1]=table[ss];
lcdtime[2]=table[sg];
lcdtime[4]=table[fs];
lcdtime[5]=table[fg];
lcdtime[7]=table[ms];
lcdtime[8]=table[mg];
}
程序调好了 是向DS1302中初始化和LCDtime/date矛盾了 粗心了
|