理论 
  
 
参考51单片机IIC理论:链接
在起始信号后必须发送一个7位从机地址 + 1位方向位,用“0”表示主机发送数据,“1”表示主机接收数据
 
 
   代码编写 
  
 
 
 
   IIC三个模式配置 
  
 
IIC(阻塞模式)配置
主要方式

IIC(中断模式)配置

IIC(DMA模式)配置

 
 
   阻塞模式 
  
 
mian.c
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();	//75行
MX_I2C1_Init();
/* USER CODE BEGIN Init */
OLED_Init();			//初始化OLED
OLED_Clear();
OLED_ShowCHinese(0,0,0);	//�?
OLED_ShowCHinese(18,0,1);	//�?
OLED_ShowCHinese(36,0,2);	//�?
OLED_ShowCHinese(54,0,3);	//�?
OLED_ShowCHinese(72,0,4);	//�?
OLED_ShowCHinese(90,0,5);	//�?
OLED_ShowCHinese(108,0,6);	//�?
OLED_ShowCHinese(0,2,6);	//�?
/* USER CODE END Init */
olde.c
/**********************************************
// IIC Write Command命令
**********************************************/
void Write_IIC_Command(unsigned char IIC_Command)	//10行
{
//   IIC_Start();
//   IIC_Write_Byte(0x78);            //Slave address,SA0=0
//   IIC_Write_Byte(0x00);			//write command
//   IIC_Write_Byte(IIC_Command);
//   IIC_Stop();
	 uint8_t IIC_Send_Cmd[]={0x00,IIC_Command};	//将两个数据放进数组
	 /* 参数1:指向 I2C_HandleTypeDef 结构的指针,该结构包含指定 I2C 的配置信息
	  * 参数2:设备地址,参数3:
	  * 参数4:要发送的数据量,参数5:超时持续时间
	  */
	 HAL_I2C_Master_Transmit(&hi2c1, 0x78, IIC_Send_Cmd, 2, 100);	//调用库函数阻塞发送IIC
}
/**********************************************
// IIC Write Data数据
**********************************************/
void Write_IIC_Data(unsigned char IIC_Data)
{
//   IIC_Start();
//   IIC_Write_Byte(0x78);			//D/C#=0; R/W#=0
//   IIC_Write_Byte(0x40);			//write data
//   IIC_Write_Byte(IIC_Data);
//   IIC_Stop();
   uint8_t IIC_Send_Data[]={0x40,IIC_Data};	//将两个数据放进数组
   /* 参数1:指向 I2C_HandleTypeDef 结构的指针,该结构包含指定 I2C 的配置信息
	* 参数2:设备地址,参数3:
	* 参数4:要发送的数据量,参数5:超时持续时间
	*/
   HAL_I2C_Master_Transmit(&hi2c1, 0x78, IIC_Send_Data, 2, 100);
}
 
 
   中断模式 
  
 
mian.c与阻塞相同
oled.c
/**********************************************
// IIC Write Command命令
**********************************************/
void Write_IIC_Command(unsigned char IIC_Command)	//10行
{
//   IIC_Start();
//   IIC_Write_Byte(0x78);            //Slave address,SA0=0
//   IIC_Write_Byte(0x00);			//write command
//   IIC_Write_Byte(IIC_Command);
//   IIC_Stop();
	 uint8_t IIC_Send_Cmd[]={0x00,IIC_Command};	//将两个数据放进数组
	 /* 参数1:指向 I2C_HandleTypeDef 结构的指针,该结构包含指定 I2C 的配置信息
	  * 参数2:设备地址,参数3:
	  * 参数4:要发送的数据量
	  */
	 HAL_I2C_Master_Transmit_IT(&hi2c1, 0x78, IIC_Send_Cmd, 2);
	 HAL_Delay(1);	//如果不延时发太快不显示,但OLED显示太慢
}
/**********************************************
// IIC Write Data数据
**********************************************/
void Write_IIC_Data(unsigned char IIC_Data)
{
//   IIC_Start();
//   IIC_Write_Byte(0x78);			//D/C#=0; R/W#=0
//   IIC_Write_Byte(0x40);			//write data
//   IIC_Write_Byte(IIC_Data);
//   IIC_Stop();
   uint8_t IIC_Send_Data[]={0x40,IIC_Data};	//将两个数据放进数组
   /* 参数1:指向 I2C_HandleTypeDef 结构的指针,该结构包含指定 I2C 的配置信息
	* 参数2:设备地址,参数3:
	* 参数4:要发送的数据量
	*/
   HAL_I2C_Master_Transmit_IT(&hi2c1, 0x78, IIC_Send_Data, 2);
   HAL_Delay(1);
}



















