微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > dat = (dat>>1) | (dat1<<7);是什么意思,什么功能?

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 ?为什么?

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中的。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top