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

input & 0x80判断真假过程

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

/************************************************
*函数名称 : void I2C_WriteByte
*功    能 : I2C写一个字节
*参    数 : dat:传输数据
*返 回 值 : 无
*************************************************/
void I2C_WriteByte(uint8_t  input)
{
	uint8_t  i;
	SDA_OUT();
	for(i=0; i<8; i++)
	{
		IIC_SCL = 0;
		delay_ms(5);

		if(input & 0x80)
		{
			IIC_SDA = 1;
			//delaymm(10);
		}
		else
		{
			IIC_SDA = 0;
			//delaymm(10);
		}

		IIC_SCL = 1;
		delay_ms(5);

		input = (input<<1);
	}

	IIC_SCL = 0;
	delay_us(4);

	SDA_IN();
	delay_us(4);
}	

调用这个函数需要导入一个uint8_t input参数
我们假设我们导入的参数是0x71
下面记录一下I2C_WriteByte写入数据的过程
在这里插入图片描述
最主要的就是上面的过程
在代码中的if(input & 0x80)
也有些代码写的是if(input & 0x80 == 0x80)
我在上面的代码I2C_WriteByte测试过,实际上他们的效果都是一样的
都是判断最高位是不是为1

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

  • 12
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是使用软件模拟I2C总线进行读写数据的示例代码,假设要读写的设备地址为0x50,要读取的寄存器地址为0x10,要写入数据为0xAB: ``` #include <stdio.h> #include <stdlib.h> #include <wiringPi.h> #define SDA_PIN 0 // SDA引脚 #define SCL_PIN 1 // SCL引脚 #define I2C_ADDR 0x50 // 设备地址 // I2C总线初始化 void i2c_init() { pinMode(SDA_PIN, OUTPUT); pinMode(SCL_PIN, OUTPUT); digitalWrite(SDA_PIN, HIGH); digitalWrite(SCL_PIN, HIGH); } // I2C总线起始信号 void i2c_start() { digitalWrite(SDA_PIN, HIGH); digitalWrite(SCL_PIN, HIGH); delayMicroseconds(10); digitalWrite(SDA_PIN, LOW); delayMicroseconds(10); digitalWrite(SCL_PIN, LOW); delayMicroseconds(10); } // I2C总线停止信号 void i2c_stop() { digitalWrite(SDA_PIN, LOW); digitalWrite(SCL_PIN, HIGH); delayMicroseconds(10); digitalWrite(SDA_PIN, HIGH); delayMicroseconds(10); } // I2C总线写入一个字节数据并等待ACK信号 int i2c_write_byte(unsigned char data) { int i, ack; for (i = 0; i < 8; i++) { digitalWrite(SDA_PIN, (data & 0x80) ? HIGH : LOW); data <<= 1; digitalWrite(SCL_PIN, HIGH); delayMicroseconds(10); digitalWrite(SCL_PIN, LOW); } // 等待ACK信号 pinMode(SDA_PIN, INPUT); digitalWrite(SCL_PIN, HIGH); delayMicroseconds(10); ack = digitalRead(SDA_PIN); digitalWrite(SCL_PIN, LOW); pinMode(SDA_PIN, OUTPUT); return (ack == 0); } // I2C总线读取一个字节数据并发送ACK信号 unsigned char i2c_read_byte(int ack) { int i; unsigned char data = 0; pinMode(SDA_PIN, INPUT); for (i = 0; i < 8; i++) { data <<= 1; digitalWrite(SCL_PIN, HIGH); delayMicroseconds(10); if (digitalRead(SDA_PIN)) data |= 0x01; digitalWrite(SCL_PIN, LOW); } pinMode(SDA_PIN, OUTPUT); digitalWrite(SDA_PIN, (ack == 0) ? LOW : HIGH); digitalWrite(SCL_PIN, HIGH); delayMicroseconds(10); digitalWrite(SCL_PIN, LOW); digitalWrite(SDA_PIN, LOW); return data; } // I2C总线写入一个字节数据 int i2c_write(unsigned char reg, unsigned char data) { i2c_start(); if (!i2c_write_byte(I2C_ADDR << 1)) return 0; if (!i2c_write_byte(reg)) return 0; if (!i2c_write_byte(data)) return 0; i2c_stop(); return 1; } // I2C总线读取一个字节数据 unsigned char i2c_read(unsigned char reg) { unsigned char data; i2c_start(); if (!i2c_write_byte(I2C_ADDR << 1)) return 0; if (!i2c_write_byte(reg)) return 0; i2c_start(); if (!i2c_write_byte((I2C_ADDR << 1) | 0x01)) return 0; data = i2c_read_byte(0); i2c_stop(); return data; } int main() { wiringPiSetup(); i2c_init(); // 写入数据 i2c_write(0x10, 0xAB); // 读取数据 unsigned char data = i2c_read(0x10); printf("Read data: 0x%X\n", data); return 0; } ``` 注意,这段代码仅作为示例,实际使用时需要根据具体的设备协议进行修改。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值