dat = (dat>>1) | (dat1<<7);是什么意思,什么功能?
时间:10-02
整理:3721RD
点击:
在下面程序中,
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;
}
问题1: dat = (dat>>1) | (dat1<<7);是什么意思,什么功能?
问题2:dat1 = DSIO;//从最低位开始接收,数据明明是给了dat1,但是最后return 的数据 却是 dat ?为什么?
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;
}
问题1: dat = (dat>>1) | (dat1<<7);是什么意思,什么功能?
问题2:dat1 = DSIO;//从最低位开始接收,数据明明是给了dat1,但是最后return 的数据 却是 dat ?为什么?
D 76543210 变成 D07654321
就是实现流水灯
这应该是循环移位吧,因为向左向右移位都会会补0,将左右移位的结果做 或 运算,可以实现循环移位。例如10000001>>1=01000000,10000001<<7=10000000,再做 或 运算就变成11000000,相当于原数向右循环移一位
这是位操作吧,只对比特尾有效吧,
把dat1的最低位放到dat的最高位
问题1:通过 8次dat = (dat>>1) | (dat1<<7)可以将dat1中接收的最低位移到dat中的最低位,以此类推,能够完整的将dat1从最低位开始接收的数放在dat中从高位到低位不变的存储。
问题2:同问题1一样dat1仅仅作为缓存容器,最后的完整的复制发送的数值是放在dat中的。