我感觉是ds1302的初始子函数里面写保护的问题啊 啊啊啊 各位帮帮看看啊 啊 啊
#include
#define uchar unsigned char
unsigned int second10,second1,minute10,minute1,hour10,hour1,date10,date1,month10,month1,year10,year1,day;
***it RST=P1^2;
***it SCLK=P1^0;
***it SDA=P1^1;
#define READ_SECOND 0x81
#define READ_MINUTE 0x83
#define READ_HOUR 0x85
#define READ_DATE 0x87 //几号
#define READ_MONTH 0x89
#define READ_DAY 0x8B //星期几
#define READ_YEAR 0x8D
#define WRITE_SECOND 0x80
#define WRITE_MINUTE 0x82
#define WRITE_HOUR 0x84
#define WRITE_DATE 0x86 //几号
#define WRITE_MONTH 0x88
#define WRITE_DAY 0x8A //星期几
#define WRITE_YEAR 0x8C
unsigned char code dispcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf}; //定义共阳极字型码0123456789-
void delayum(int hm)
{
int i,j;
for(i=hm;i>0;i--)
for(j=110;j>0;j--);
}
void ds1302writebyte(uchar dat)
{
uchar i;
SCLK=0;
for(i=0;i<8;i++)
{
SDA=dat&0x01;
SCLK=1;
SCLK=0;
dat>>=1;
}
}
uchar ds1302readbyte() //这里要注意 看是否正常
{
uchar i,dat;
for(i=0;i<8;i++)
{
dat>>=1;
if(SDA==1)
dat|=0x80;
SDA=dat&0x01;
SCLK=1;
SCLK=0;
}
return(dat);
}
uchar ds1302read(uchar cmd)//写进去 地址 读出来数据
{
uchar dat;
RST=0;
SCLK=0;
RST=1;
ds1302writebyte(cmd);
dat=ds1302readbyte();
SCLK=1;
RST=0;
return(dat);
}
void ds1302write(uchar cmd,uchar dat)
{
RST=0;
SCLK=0;
RST=1;
ds1302writebyte(cmd);
ds1302writebyte(dat);
SCLK=1;
RST=0;
}
void display(second10,second1,minute10,minute1,hour10,hour1) //显示子程序
{
P0=0;
P2=0xfe;
P0=dispcode[second10];//显示秒的十位
delayum(1);P0=0;
P2=0xfd;
P0=dispcode[second1]; //显示秒的个位
delayum(1);P0=0;
P2=0xfb;
P0=dispcode[10]; //显示"-"
delayum(1);P0=0;
P2=0xf7;
P0=dispcode[minute10];//显示分的十位
delayum(1);P0=0;
P2=0xef;
P0=dispcode[minute1]; //显示分的个位
delayum(1);P0=0;
P2=0xdf;
P0=dispcode[10]; //显示"-"
delayum(1);P0=0;
P2=0xbf;
P0=dispcode[hour10]; //显示时的十位
delayum(1);P0=0;
P2=0x7f;
P0=dispcode[hour1]; //显示时的个位
delayum(1);
}
void init_ds1302()
{
ds1302write(0x8e,0x00);// 写保护关
ds1302write(WRITE_SECOND ,0x50);// 初始秒值为 0 0 0 0
ds1302write(WRITE_MINUTE,0x59); // 初始分钟值为 0 0 0 0
ds1302write(WRITE_HOUR,0x23);// 初始为 24242424 小时模式 初始时间为
ds1302write(WRITE_DAY,0x07);//2013 年 1 2 月3 1 日 星期 7
ds1302write(WRITE_MONTH,0x12);
ds1302write(WRITE_YEAR,0x13);
ds1302write(WRITE_DATE,0x31);
ds1302write(0x90,0x01);// 充电
ds1302write(0xc0,0xf0); // 初始化一次标示
ds1302write(0x8e,0x80);//开写保护
}
void init_dat()
{
second10=ds1302read(READ_SECOND)/16;
second1=ds1302read(READ_SECOND)%16;
minute10=ds1302read(READ_MINUTE)/16;
minute1=ds1302read(READ_MINUTE)%16;
hour10=ds1302read(READ_HOUR)/16;
hour1=ds1302read(READ_HOUR)%16;
date10=ds1302read(READ_DATE)/16;
date1=ds1302read(READ_DATE)%16;
month10=ds1302read(READ_MONTH)/16;
month1=ds1302read(READ_MONTH)%16;
year10=ds1302read(READ_YEAR)/16;
year1=ds1302read(READ_YEAR)%16;
day=ds1302read(READ_DAY);
}
main()
{
init_ds1302();
while(1)
{
init_dat();
display(year10,year1,hour10,hour1,day,second1);
}
}
|