学习的杂记

说明

这里记录一下平时学习中碰到的几个比较值得重点的地方-----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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值