51单片机I2C总线读一个字节k=(k<<1)|SDA;是什么意思?

ucharreadbyte(){uchari,k;SCL=0;delay();SDA=1;for(i=0;i<8;i++){SCL=1;delay();k=(k<<1)|... uchar readbyte()
{
uchar i,k;

SCL=0;

delay();

SDA=1;

for(i=0;i<8;i++)

{
SCL=1;

delay();

k=(k<<1)|SDA;

SCL=0;

delay();

}
delay();

return k;

}
展开
 我来答
做而论道
高能答主

2014-02-17 · 把复杂的事情简单说给你听
知道大有可为答主
回答量:3万
采纳率:80%
帮助的人:1.1亿
展开全部
k 是八位的变量。

k=(k<<1),左移一位。
在右边,腾出一个空位,自动补上0。

|SDA,把 SDA (可能是1,也可能是0),加入到空位中。

循环八次,就把 SDA 读出了八遍,依次写到 K 的八个位中。
ghost4063
2014-02-17 · TA获得超过6519个赞
知道大有可为答主
回答量:2940
采纳率:75%
帮助的人:2742万
展开全部
因为I2C是串行传输的,只能一位一位传输,并且是高位在前,所以k=(k<<1)|SDA;表示将当前数据线的内容放到待接收字节的最低位,原字节内容先左移1位。这样循环8次后就能收到完整的字节了。
追问
就是k左移一位后与SDA进行或运算这一点看不懂
追答
左移以后,最低位是0,这时候做或运算,就是把SDA的值赋到最低位去
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
fangjun1113
2014-02-17 · TA获得超过164个赞
知道小有建树答主
回答量:225
采纳率:0%
帮助的人:135万
展开全部
K左移一位和SDA状态相与
for(i=0;i<8;i++)

{
SCL=1; // 将SCL位置高

delay(); // 等待SDA位状态的更新

k=(k<<1)|SDA; //将K的值左移一位,然后把SDA位的状态放到K的最后一位

SCL=0; // 将SCL位置低
delay();

}

SDA为上是传输着一个8bit的数据,每一个循环为一个时钟周期,每一个时钟周期SDA将数据由高到低依次传输着其中一位,而K的值每个周期向左移一位,腾出最低位用来存放SDA上传输的当前的状态,这样循环8次后就将数据读到K中了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
苍涛封晓燕
2019-02-21 · TA获得超过3768个赞
知道大有可为答主
回答量:3162
采纳率:28%
帮助的人:163万
展开全部
k
是八位的变量。
k=(k<<1),左移一位。
在右边,腾出一个空位,自动补上0。
|SDA,把
SDA
(可能是1,也可能是0),加入到空位中。
循环八次,就把
SDA
读出了八遍,依次写到
K
的八个位中。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式