普中开源电子分享网

 找回密码
 立即注册
搜索
查看: 3331|回复: 1

dat = (dat>>1) | (dat1<<7);是什么意思,什么功能?

 关闭 [复制链接]

12

主题

46

帖子

160

积分

注册会员

Rank: 2

积分
160
发表于 2017-1-15 21:46:43 | 显示全部楼层 |阅读模式
在下面程序中,
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 ??为什么???
回复

使用道具 举报

20

主题

1344

帖子

8381

积分

论坛元老

Rank: 8Rank: 8

积分
8381
发表于 2017-1-16 08:12:13 | 显示全部楼层
DOSI是一位,接收的是低位,dat1<<7,就是让接收的低位移到最高位,然后和dat或,就让dat获得了此位数据,下一次执行时,dat>>1,就让出了最高位,刚才接收的数据向低位移动,8位循环下来,接收的数据不是正好吗!
注意,此时,通过DSIO接收的一位数据,已经通过dat=(dat>>1)|(dat1<<7)语句,将值赋给dat了,所以,最后要返回dat的8位数据。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

Archiver|手机版|小黑屋|普中开源电子分享网 粤ICP备16123577号-2

GMT+8, 2024-4-27 08:06 , Processed in 0.095035 second(s), 30 queries .

Powered by 论坛搭建 X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表