找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2252|回复: 5
收起左侧

各位大佬,这个代码是i2c总线读取字节,这个移位怎么弄啊?可以具体举个数吗?

[复制链接]
ID:696335 发表于 2020-4-1 09:35 | 显示全部楼层 |阅读模式
unsigned char I2cReadByte()
{
    unsigned char a=0,dat=0;
    SDA=1;
    Delay10us();
    for(a=0;a<8;a++)
    {
       CSL=1;
       Delay10us();
       dat<<1;
       dat|=SDA;
       Delay10us();
       SCL=0;
       Delay10us();

    }
    return dat;
}
回复

使用道具 举报

ID:584814 发表于 2020-4-1 09:55 | 显示全部楼层
从SDA上读数据一次一个字节从高位读起读完返回结果然后玩犊子。
回复

使用道具 举报

ID:720003 发表于 2020-4-1 10:13 | 显示全部楼层
确实,我也一直没搞懂
回复

使用道具 举报

ID:626079 发表于 2020-4-1 11:10 | 显示全部楼层
这时闲着,说下,因为我也曾花了长时间理解这代码,本不想理解,反正套用就是,但后来发现到处都用到这个移位得算法,不理解不得行。不对的地方大伙提出来。
1.DAT初始为0, 先←没影响,反正每一位都是0。但在第二次循环就有用了。这儿一定要清楚。
2.dat|=SDA, 在第一次进循环时,就是吧SDA直接赋值给DAT最低位。“|=”就不解释了,要搞单片机这是基础的基础哦
3.第二次进循环,把上次的DAT最低位←到低二位,再SDA直接赋值给DAT最低位,第一次的SDA就到DAT的第二位啦。
4.以后都类推。。。
5. 传过来的SDA第一次的位是传来的字节的最高位。 循环完了,DAT的最高位就是SDA传过来的第一位。
不晓得我说清楚没得。。
unsigned char I2cReadByte()
{
    unsigned char a=0,dat=0;
    SDA=1;
    Delay10us();
    for(a=0;a<8;a++)
    {
       CSL=1;
       Delay10us();
       dat<<1;
       dat|=SDA;
       Delay10us();
       SCL=0;
       Delay10us();

    }
    return dat;
}
回复

使用道具 举报

ID:696335 发表于 2020-4-1 15:44 | 显示全部楼层
xmfjfhcel 发表于 2020-4-1 11:10
这时闲着,说下,因为我也曾花了长时间理解这代码,本不想理解,反正套用就是,但后来发现到处都用到这个移 ...

第一次循环时,SDA为什么是赋值给dat最低位,SDA初值是1,dat初值是0,应该是0000 0000|1111 1111=1111 1111吧?
回复

使用道具 举报

ID:626079 发表于 2020-4-3 07:43 | 显示全部楼层
臭大死王八羔子 发表于 2020-4-1 15:44
第一次循环时,SDA为什么是赋值给dat最低位,SDA初值是1,dat初值是0,应该是0000 0000|1111 1111=1111 1 ...

SDA是IIC线上SDA线来的高电平或低电平。高1低0,一次过来只有一位吧,只是一位的,不是你说的11111111一下都过来。一次过来只有一位,IIC是一位一位的从SDA线上传过来,不是一次就过来8位。我的理解是这样的吧。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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