ds1302当中编辑读地址数据函数的问题
ucharDs1302Read(ucharaddr){ucharn,dat,dat1;RST=0;_nop_();SCLK=0;//先将SCLK置低电平。_nop_();...
uchar Ds1302Read(uchar addr)
{
uchar n,dat,dat1;
RST = 0;
_nop_();
SCLK = 0;//先将SCLK置低电平。
_nop_();
RST = 1;//然后将RST(CE)置高电平。
_nop_();
for(n=0; n<8; n++)//开始传送八位地址命令
{
DSIO = addr & 0x01;//数据从低位开始传送
addr >>= 1;
SCLK = 1;//数据在上升沿时,DS1302读取数据
_nop_();
SCLK = 0;//DS1302下降沿时,放置数据
_nop_();
}
_nop_();
for(n=0; n<8; n++)//读取8位数据
{
dat1 = DSIO;//从最低位开始接收
dat = (dat>>1) | (dat1<<7);
SCLK = 1;
_nop_();
SCLK = 0;//DS1302下降沿时,放置数据
_nop_();
}
RST = 0;
_nop_(); //以下为DS1302复位的稳定时间,必须的。
SCLK = 1;
_nop_();
DSIO = 0;
_nop_();
DSIO = 1;
_nop_();
return dat;
}
请问dat = (dat>>1) | (dat1<<7); dat1不是等于之前输入的地址了么 为什么还要左移7位? 已经是地址了 跟数据有什么联系 还要跟又移以为的dat相或? 没看懂 展开
{
uchar n,dat,dat1;
RST = 0;
_nop_();
SCLK = 0;//先将SCLK置低电平。
_nop_();
RST = 1;//然后将RST(CE)置高电平。
_nop_();
for(n=0; n<8; n++)//开始传送八位地址命令
{
DSIO = addr & 0x01;//数据从低位开始传送
addr >>= 1;
SCLK = 1;//数据在上升沿时,DS1302读取数据
_nop_();
SCLK = 0;//DS1302下降沿时,放置数据
_nop_();
}
_nop_();
for(n=0; n<8; n++)//读取8位数据
{
dat1 = DSIO;//从最低位开始接收
dat = (dat>>1) | (dat1<<7);
SCLK = 1;
_nop_();
SCLK = 0;//DS1302下降沿时,放置数据
_nop_();
}
RST = 0;
_nop_(); //以下为DS1302复位的稳定时间,必须的。
SCLK = 1;
_nop_();
DSIO = 0;
_nop_();
DSIO = 1;
_nop_();
return dat;
}
请问dat = (dat>>1) | (dat1<<7); dat1不是等于之前输入的地址了么 为什么还要左移7位? 已经是地址了 跟数据有什么联系 还要跟又移以为的dat相或? 没看懂 展开
2个回答
展开全部
不懂,过来学习下
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
很简单,先写入地址,然后马上从写入的地址接收数据,数据也是通过DSIO传输的.去看看时序图吧~
追问
大哥,我问的是这么,什么旧很简单啊。请问dat = (dat>>1) | (dat1<<7); dat1不是等于之前输入的地址了么 为什么还要左移7位? 已经是地址了 跟数据有什么联系 还要跟又移以为的dat相或?
追答
dat1=DSIO;dat1只是一位数据,dat>>1后最高位是补0的,然后或上dat1>1)|(1<<7)不就是将dat变成了1000 0000了,如果接下来一个循环读下一位dat1=DSIO还是1,那么dat就是1100 0000了,这样循环8次,移位相当于7次(因为第1次dat=0x00,右移一位后还是0X00),就将一个字节读到了dat里面,很简单啊- -
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询