没有去查I2C的协议,但是读写位是LSB(低位)方向的,而读写位后发,所以可以推测应该是MSB(高位)先发的。
上面两段程序如果只从SDA的赋值情况的话(其他逻辑我没有细看),两段程序有可能都可以:
1. 先把最高位移到CY里面,再赋值,应该很好理解
2. 先由temp&0x80判断的temp的最高位,并把结果赋给SDA:这种赋值法要看编译器支持,因为SDA是一位,temp&0x80的结果是一个byte,也有写成SDA=(temp&0x80 != 0)就是把表达式的结果true or false当成1,0赋值给SDA, 实际上翻译过来就是
if(temp&0x80 != 0)
{
SDA=1;
}
else
{
SDA=0;
}
这些都要看编译器支持,然后才移位。怎么知道你的编译器是否支持这种写法呢?很简单,你要查看编译器生成的汇编文件,看看汇编代码是否正确。
不过强烈建议不要用这种写法,尽量让你的代码比较通用。
SDA=temp&0x80,这个写法是不怎么规范的,但是如果你的编译器能够识别的话,那么结果也还是正确的,因为编译器在赋值的时候只把最高位赋进去,这样子也行。