if(input & 0x80)在I2C中是怎么样一步步写入数据的?

Posted hjf-log

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了if(input & 0x80)在I2C中是怎么样一步步写入数据的?相关的知识,希望对你有一定的参考价值。

input & 0x80判断真假过程

我们先放一段if(input & 0x80)在I2C写字节的代码

技术图片
 1 /************************************************
 2 *函数名称 : void I2C_WriteByte
 3 *功    能 : I2C写一个字节
 4 *参    数 : dat:传输数据
 5 *返 回 值 : 无
 6 *************************************************/
 7 void I2C_WriteByte(uint8_t  input)
 8 {
 9     uint8_t  i;
10     SDA_OUT();
11     for(i=0; i<8; i++)
12     {
13         IIC_SCL = 0;
14         delay_ms(5);
15 
16         if(input & 0x80)
17         {
18             IIC_SDA = 1;
19             //delaymm(10);
20         }
21         else
22         {
23             IIC_SDA = 0;
24             //delaymm(10);
25         }
26 
27         IIC_SCL = 1;
28         delay_ms(5);
29 
30         input = (input<<1);
31     }
32 
33     IIC_SCL = 0;
34     delay_us(4);
35 
36     SDA_IN();
37     delay_us(4);
38 }    
I2C_WriteByte

下面的讲解会和上面的循环一起讲,注意for循环

 

调用这个函数需要导入一个uint8_t input参数
我们假设我们导入的参数是0x71
下面记录一下I2C_WriteByte写入数据的过程

 

 

0x71 ---> 0111 0001
0x80 ---> 1000 0000

 

i=0时,第一次判断if(input & 0x80)
0111 0001
1000 0000 &
---------------
0000 0000

 

if(input & 0x80)判断为假,IIC_SDA = 0;

 

判断完以后执行下面语句有一个input = (input<<1)
那么0x71要向左移一位
原来: 0111 0001
左移一位: 1110 0010
左移也就是最高位丢掉,其余位向左移一位,最后一位补0

 

左移以后的i=1,我们第二次判断if(input & 0x80)
此时是左移一位后的0x71 & 0x80

 

1110 0010
1000 0000 &
----------------
1000 0000

 

if(input & 0x80)判断为真,IIC_SDA = 1;
之后也按照这种方法左移
这样代码循环8次,左移8次以后我们就可以把我们的0x71发送在SDA线上给从机了

 

最主要的就是上面的过程
在代码中的if(input & 0x80)
也有些代码写的是if(input & 0x80 == 0x80)
我在上面的代码I2C_WriteByte测试过,实际上他们的效果都是一样的
都是判断最高位是不是为1

到这里就结束了,如果有错误或者有更好的补充可以在评论留言

技术图片

 

以上是关于if(input & 0x80)在I2C中是怎么样一步步写入数据的?的主要内容,如果未能解决你的问题,请参考以下文章

STM32 通过 I2C 发送 12 位 ADC

[SPI&I2C]I2C和SPI协议介绍

ARM Cortex-M3 MCU的I2C&DMA操作被频繁的中断打挂了

Python 数据类型&if&while

input框遍历是否为空

input输入只有两位小数