/***DS1302WRITEBYTE写一个字节***/
void write_byte(uchar dat)
{
uchar i;
for(i=1;i<8;i++)
{
SCK=0;
SDA=dat&0x01;//提取待写入的D0位
dat=dat>>1;//右移移位,高位补0为提取下一位数据准备
SCK=1;//拉高时钟信号,D0位数据写入
}
}
/***DS1302WRITEDATA写数据***/
void write_data(uchar addr,dat)
{
RST=0;//禁止数据传输
delayus(1);
SCK=0;//拉低时钟信号,为写操作准备上升沿
delayus(1);
RST=1;//读写操作时RST必须置高
delayus(1);
write_byte(addr);//先写地址
delayus(1);
write_byte(dat);
RST=0;//禁止数据传输
SCK=1; //释放总线
SDA=1;
}
/***DS1302READDATA读数据***/
uchar read_data(uchar addr)
{
uchar dat1,dat2,i;
RST=0;
delayus(1);
SCK=0;
delayus(1);
RST=1;
delayus(1);
write_byte(addr);
for(i=0;i<8;i++)
{
dat1=dat1>>1;
if(SDA)
dat1=dat1|0x80;
SCK=0;
SCK=1;
}
RST=0;
SCK=1;
SDA=1;
dat2=dat1/16;//BCD转16
dat2=dat2*10+dat1;
return(dat2) ;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>