说明
这里记录一下平时学习中碰到的几个比较值得重点的地方-----C语言的与,或在单片机中的使用。
与
//发送字节
void MyI2C_SendByte(uint8_t Byte)
{
uint8_t i;
for (i = 0; i < 8; i ++)
{
MyI2C_W_SDA(Byte & (0x80 >> i));//高位先行 1000 0000与上Byte最高位,1所在的位置数据保持不变 同时1往后面移动一位
MyI2C_W_SCL(1);
MyI2C_W_SCL(0);
}
}
我们知道,与的算法是“全1则1,有0则0”。以上面的代码为例子,这个是IIC通信协议里面发送一个字节的作用。对于IIC通信的具体过程,我们暂且不详细介绍,主要看第一句代码。
MyI2C_W_SDA(Byte & (0x80 >> i));
由于SDA线每次只能放上一位数据进行传输,所以一个字节我们要分成8次来传输.那么如何解决这个问题呢,这就要用到与算法了.0x80即(1000 0000),只有最高位是1,其余的都是0.Byte为任意的字节.此时Byte与上0x80,此时的最高位在与上1后会保持原来的值不变,而其余位数与上0后都变成了0,此时便可以得到最高位的值了,以此类推,只要将0x80右移一位,可得到0x40,再与上Byte,便可以得到第二位的值了,循环8次,便可以得到Byte每一位的值了.
MySPI_W_MOSI(ByteSend & (0x80 >> i));//与最高位 双1才为1 有0则0
SPI通信协议中也有类似操作 .
我们可以通过这种按位与0x80的方式从而得到字节的每一位数据.
或
uint8_t i, ByteReceive = 0x00;
if (MySPI_R_MISO() == 1){ByteReceive |= (0x80 >> i);}
或的算法是"有1则1,全0则0",可以看出,当if里面条件成立时,即该位数据为1,我们可以用0x00按位或上0x80,此时可以获得数据1,这与if里面的条件相同;而if条件不成立时,即该位数据为0。此时不能执行条件成立语句,所以可以获得数据0.
uint8_t i, Byte = 0x00;
if (MyI2C_R_SDA() == 1){Byte |= (0x80 >> i);}// if成立该位为1 if不成立该位为0
IIC中也有类似操作。
关于这两个的用法,一般来说,当我们需要发送字节每一位的数据时,可以通过按位与的方式获取到每一位的数据。
而当我们要接收一个数据的时候,显然一次接收整个字节是不现实的,那么我们只好一个数据位一个数据位地接收了。那么我们可以定义一个数据0x00用来接收数据1,当我们判断数据线上的数据是否等于1,当条件成立时,可以用0x00按位或上0x80.这样子,当条件成立时,便可以得到1,而条件不成立时,数据位仍是0.