通用软件IIC驱动程序

程序由STM32中移植分离出来,目前在其他类型开发板上测试也能成功

myiic.h

#ifndef __MYIIC_H__
#define __MYIIC_H__
#include "gpio.h"
#include "uart.h"
#include "app_user_api.h"

//#include "stdio.h"
#include <math.h>

//	 
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//宇文工作室编写
//IIC驱动 代码	   
//宇文工作室@haitian
//修改日期:2023/9/9
//All rights reserved									  
//
//#define SCLK 0X04
//#define SDAT 0X05
//extern void Delay_us(int num);
//extern void Delay_ms(int num);
//#define delay_us Delay_us
//#define delay_ms Delay_ms
void iic_delay_us(uint16_t dly_cnt);
void iic_delay_ms(uint16_t dly_cnt);
#define delay_us iic_delay_us
#define delay_ms iic_delay_ms



//下面需更改成为自己使用的开发板类型
//IO方向设置
#define SDA_OUT()	gpio_config(SDAT,OUTPUT,PULL_NONE)//SDA设置为输出
#define SDA_IN()	gpio_config(SDAT,INPUT,PULL_NONE)//SDA设置为输入

//IO操作函数	 
#define SCL0_HIGH()		  gpio_set(SCLK,1)//SCL置高
#define SCL0_LOW()		  gpio_set(SCLK,0)//SCL置低
#define SDA0_HIGH()		  gpio_set(SDAT,1)//SDA置高
#define SDA0_LOW()		  gpio_set(SDAT,0)//SDA置低
#define SDA0_READ()		  gpio_get_input(SDAT)//获取SDA电平状态

//IIC所有操作函数
void IIC_Init(void);                //初始化IIC的IO口				 
void IIC_Start(void);				//发送IIC开始信号
void IIC_Stop(void);	  			//发送IIC停止信号
void IIC_Send_Byte(uint8_t txd);			//IIC发送一个字节
uint8_t IIC_Read_Byte(unsigned char ack);//IIC读取一个字节
uint8_t IIC_Wait_Ack(void); 				//IIC等待ACK信号
void IIC_Ack(void);					//IIC发送ACK信号
void IIC_NAck(void);				//IIC不发送ACK信号

void IIC_Write_One_Byte(uint8_t daddr,uint8_t addr,uint8_t data);
uint8_t IIC_Read_One_Byte(uint8_t daddr,uint8_t addr);	  


#define  Soft_I2C_READY		              0x00
#define  Soft_I2C_BUS_BUSY	            0x01
#define  Soft_I2C_BUS_ERROR	            0x02
#define  I2C_Direction_Transmitter      0x00
#define  I2C_Direction_Receiver         0x01

int Sensors_I2C_ReadRegister(unsigned char Address, unsigned char RegisterAddr, 
                                          unsigned short RegisterLen, unsigned char *RegisterValue);
int Sensors_I2C_WriteRegister(unsigned char Address, unsigned char RegisterAddr, 
                                           unsigned short RegisterLen, const unsigned char *RegisterValue);
#endif
















myiic.c

#include "myiic.h"
//	 
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//宇文工作室编写
//IIC驱动 代码	   
//宇文工作室@haitian
//修改日期:2023/9/9
//All rights reserved									  
//
void iic_delay_us(uint16_t dly_cnt)
{
	while(dly_cnt--)
  {
    __nop();
    __nop();
  }
}
void iic_delay_ms(uint16_t dly_cnt)
{
	while(dly_cnt--)
  {
    iic_delay_us(1000);
  }
} 
 
//初始化IIC
void IIC_Init(void)
{					     
	gpio_config(SCLK,OUTPUT,PULL_HIGH);
  gpio_config(SDAT,OUTPUT,PULL_HIGH);

//	SCL0_HIGH();
//	SDA0_HIGH();
//	delay_ms(100);
}
//产生IIC起始信号
void IIC_Start(void)
{
	SDA_OUT();     //sda线输出
	SDA0_HIGH();	  	  
	SCL0_HIGH();
	delay_us(4);
 	SDA0_LOW();//START:when CLK is high,DATA change form high to low 
	delay_us(4);
	SCL0_LOW();//钳住I2C总线,准备发送或接收数据 
}	  
//产生IIC停止信号
void IIC_Stop(void)
{
	SDA_OUT();//sda线输出
	SCL0_LOW();
	SDA0_LOW();//STOP:when CLK is high DATA change form low to high
 	delay_us(4);
	SCL0_HIGH(); 
	SDA0_HIGH();//发送I2C总线结束信号
	delay_us(4);							   	
}
//等待应答信号到来
//返回值:1,接收应答失败
//        0,接收应答成功
uint8_t IIC_Wait_Ack(void)
{
	uint8_t ucErrTime=0;
	SDA_IN();      //SDA设置为输入  
	SDA0_HIGH();delay_us(1);	   
	SCL0_HIGH();delay_us(1);	 
	while(SDA0_READ())
	{
		ucErrTime++;
		if(ucErrTime>250)
		{
			IIC_Stop();
			return 1;
		}
	}
	SCL0_LOW();//时钟输出0 	   
	return 0;  
} 
//产生ACK应答
void IIC_Ack(void)
{
	SCL0_LOW();
	SDA_OUT();
	SDA0_LOW();
	delay_us(2);
	SCL0_HIGH();
	delay_us(2);
	SCL0_LOW();
}
//不产生ACK应答		    
void IIC_NAck(void)
{
	SCL0_LOW();
	SDA_OUT();
	SDA0_HIGH();
	delay_us(2);
	SCL0_HIGH();
	delay_us(2);
	SCL0_LOW();
}					 				     
//IIC发送一个字节
//返回从机有无应答
//1,有应答
//0,无应答			  
void IIC_Send_Byte(uint8_t txd)
{                        
   uint8_t t;   
	SDA_OUT(); 	    
    SCL0_LOW();//拉低时钟开始数据传输
    for(t=0;t<8;t++)
    {              
//        gpio_set(SDAT,(txd&0x80)>>7);
		if((txd&0x80)>>7)
			SDA0_HIGH();
		else
			SDA0_LOW();
		txd<<=1; 	  
		delay_us(2);   //对TEA5767这三个延时都是必须的
		SCL0_HIGH();
		delay_us(2); 
		SCL0_LOW();	
		delay_us(2);
    }	 
} 	    
//读1个字节,ack=1时,发送ACK,ack=0,发送nACK   
uint8_t IIC_Read_Byte(unsigned char ack)
{
	unsigned char i,receive=0;
	SDA_IN();//SDA设置为输入
    for(i=0;i<8;i++ )
	{
        SCL0_LOW(); 
        delay_us(2);
		SCL0_HIGH();
        receive<<=1;
        if(SDA0_READ())receive++;   
		delay_us(1); 
    }					 
    if (!ack)
        IIC_NAck();//发送nACK
    else
        IIC_Ack(); //发送ACK   
    return receive;
}






static uint8_t Soft_I2C_SendByte(uint8_t soft_i2c_data)//发送一字节,带返回
{
 	uint8_t i;
  SDA_OUT(); 	 
	SCL0_LOW();
 	for(i=0; i<8; i++)
 	{
  		if(soft_i2c_data & 0x80)
            SDA0_HIGH();
   		else
            SDA0_LOW();
  		soft_i2c_data <<= 1;
  		delay_us(10);

  		SCL0_HIGH();
  		delay_us(10);
  		SCL0_LOW();
  		delay_us(10);
 	}
	//return Soft_I2C_Wait_Ack();
  return IIC_Wait_Ack();
}

static uint8_t Soft_I2C_ReceiveByte(void)//接收一字节,带返回
{
	uint8_t i,soft_i2c_data;

 	SDA0_HIGH();
 	SCL0_LOW();
 	soft_i2c_data = 0;
  SDA_IN();      //SDA设置为输入 
 	for(i=0; i<8; i++)
 	{
  		SCL0_HIGH();
  		delay_us(10);
  		soft_i2c_data <<= 1;

  		if(SDA0_READ())
  			soft_i2c_data |= 0x01;

  		SCL0_LOW();
  		delay_us(10);
 	}
//	Soft_I2C_SendNACK();
  IIC_NAck();
 	return soft_i2c_data;
}

static uint8_t Soft_I2C_ReceiveByte_WithACK(void)//接收应答
{
	uint8_t i,soft_i2c_data;

 	SDA0_HIGH();
 	SCL0_LOW();
 	soft_i2c_data = 0;
  SDA_IN();      //SDA设置为输入 
 	for(i=0; i<8; i++)
 	{
  		SCL0_HIGH();
  		delay_us(10);
  		soft_i2c_data <<= 1;

  		if(SDA0_READ())
  			soft_i2c_data |= 0x01;

  		SCL0_LOW();
  		delay_us(10);
 	}
//	Soft_I2C_SendACK();
  IIC_Ack();
 	return soft_i2c_data;
}

static uint8_t Soft_DMP_I2C_Write(uint8_t soft_dev_addr, uint8_t soft_reg_addr, uint8_t soft_i2c_len,unsigned char *soft_i2c_data_buf)
{
    uint8_t i, result = 0;
	//Soft_I2C_START();
  IIC_Start();
	result = Soft_I2C_SendByte(soft_dev_addr << 1 | I2C_Direction_Transmitter);
	if(result != 0) return result;

	result = Soft_I2C_SendByte(soft_reg_addr);
	if(result != 0) return result;

	for (i=0; i<soft_i2c_len; i++)
	{
		result = Soft_I2C_SendByte(soft_i2c_data_buf[i]);
		if (result != 0) return result;
	}
//	Soft_I2C_STOP();
  IIC_Stop();
	return 0x00;
}

static uint8_t Soft_DMP_I2C_Read(uint8_t soft_dev_addr, uint8_t soft_reg_addr, uint8_t soft_i2c_len,unsigned char *soft_i2c_data_buf)
{
	uint8_t result;

//	Soft_I2C_START();
  IIC_Start();
	result  = Soft_I2C_SendByte(soft_dev_addr << 1 | I2C_Direction_Transmitter);
	if(result != 0) return result;

	result = Soft_I2C_SendByte(soft_reg_addr);
   //printf("addr:0x%x\n",result);
	if(result != 0) return result;

//	Soft_I2C_START();
  IIC_Start();
	result = Soft_I2C_SendByte(soft_dev_addr << 1 | I2C_Direction_Receiver);
	if(result != 0) return result;

    while (soft_i2c_len)
	{
		if (soft_i2c_len == 1)
			*soft_i2c_data_buf = Soft_I2C_ReceiveByte();
        else
        	*soft_i2c_data_buf = Soft_I2C_ReceiveByte_WithACK();
        soft_i2c_data_buf ++;
        soft_i2c_len --;
    }
//	Soft_I2C_STOP();
    IIC_Stop();
    return 0x00;
}

/**
  * @brief  向IIC设备的寄存器连续写入数据,带超时重试设置,供mpu接口调用
  * @param  Address: IIC设备地址
  * @param  RegisterAddr: 寄存器地址
  * @param  RegisterLen: 要写入数据的长度
  * @param  RegisterValue: 要指向写入数据的指针
  * @retval 0正常,非0异常
  */
int Sensors_I2C_WriteRegister(unsigned char slave_addr,
                                        unsigned char reg_addr,
                                        unsigned short len,
                                        const unsigned char *data_ptr)
{
    char retries = 0;
    int ret = 0;
    unsigned short retry_in_mlsec = 5;

tryWriteAgain:
    ret = 0;
    ret = Soft_DMP_I2C_Write( slave_addr, reg_addr, len, ( unsigned char *)data_ptr);

    if(ret && retry_in_mlsec)
    {
        if( retries++ > 4 )
            return ret;

        delay_ms(retry_in_mlsec);
        goto tryWriteAgain;
    }
    return ret;
}

/**
  * @brief  向IIC设备的寄存器连续读出数据,带超时重试设置,供mpu接口调用
  * @param  Address: IIC设备地址
  * @param  RegisterAddr: 寄存器地址
  * @param  RegisterLen: 要读取的数据长度
  * @param  RegisterValue: 指向存储读出数据的指针
  * @retval 0正常,非0异常
  */
int Sensors_I2C_ReadRegister(unsigned char slave_addr,
                                       unsigned char reg_addr,
                                       unsigned short len,
                                       unsigned char *data_ptr)
{
    char retries = 0;
    int ret = 0;
    unsigned short retry_in_mlsec = 5;

tryReadAgain:
    ret = 0;
    ret = Soft_DMP_I2C_Read( slave_addr, reg_addr, len, ( unsigned char *)data_ptr);

    if(ret && retry_in_mlsec)
    {
        if( retries++ > 4 )
            return ret;

        delay_ms(retry_in_mlsec);
        goto tryReadAgain;
    }
    return ret;
}


  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
51单片机 驱动16路模块 PWM/ 舵机驱动板 控制器 机器人 IIC PCA9685 部分程序如下 #include <reg52.h> #include <intrins.h> #include <stdio.h> #include <math.h> typedef unsigned char uchar; typedef unsigned int uint; sbit scl=P1^3; //时钟输入线 sbit sda=P1^4; //数据输入/输出端 sbit KEY1=P2^0; sbit KEY2=P2^1; #define PCA9685_adrr 0x80// 1+A5+A4+A3+A2+A1+A0+w/r //片选地址,将焊接点置1可改变地址, // 当IIC总 呱嫌 多片PCA9685或相同地址时才需焊接 // #define PCA9685_SUBADR1 0x2 // #define PCA9685_SUBADR2 0x3 // #define PCA9685_SUBADR3 0x4 #define PCA9685_MODE1 0x0 #define PCA9685_PRESCALE 0xFE #define LED0_ON_L 0x6 #define LED0_ON_H 0x7 #define LED0_OFF_L 0x8 #define LED0_OFF_H 0x9 // #define ALLLED_ON_L 0xFA // #define ALLLED_ON_H 0xFB // #define ALLLED_OFF_L 0xFC // #define ALLLED_OFF_H 0xFD #define SERVOMIN 115 // this is the 'minimum' pulse length count (out of 4096) #define SERVOMAX 590 // this is the 'maximum' pulse length count (out of 4096) #define SERVO000 130 //0度对应4096的脉宽计数值 #define SERVO180 520 //180度对应4096的脉宽计算值,四个值可根据不同舵机修改 /**********************函数的声明*********************************/ /*--------------------------------------------------------------- 毫秒延时函数 ----------------------------------------------------------------*/ void delayms(uint z) { uint x,y; for(x=z;x>0;x--) for(y=148;y>0;y--); } /*--------------------------------------------------------------- IIC总线所需的通用函数 ----------------------------------------------------------------*/ /*--------------------------------------------------------------- 微妙级别延时函数 大于4.7us ----------------------------------------------------------------*/ void delayus() { _nop_(); //在intrins.h文件里 _nop_(); _nop_(); _nop_(); _nop_(); } /*--------------------------------------------------------------- IIC总线初始化函数 ----------------------------------------------------------------*/ void init() { sda=1; //sda scl使用前总是被拉高 delayus(); scl=1; delayus(); } /*--------------------------------------------------------------- IIC总线启动信号函数 ----------------------------------------------------------------*/ void start() { sda=1; delayus(); scl=1; //scl拉高时 sda突然来个低电平 就启动了IIC总线 delayus(); sda=0; delayus(); scl=0; delayus(); } /*--------------------------------------------------------------- IIC总线停止信号函数 ----------------------------------------------------------------*/ void stop() { sda=0; delayus(); scl=1; //scl拉高时 sda突然来个高电平 就停止了IIC总线 delayus(); sda=1; delayus(); } /*--------------------------------------------------------------- IIC总线应答信号函数 ----------------------------------------------------------------*/ void ACK() { uchar i; scl=1; delayus(); while((sda=1)&&(i<255)) i++; scl=0; delayus(); } /*--------------------------------------------------------------- 写一个字节,无返回值,需输入一个字节值 ----------------------------------------------------------------*/ void write_byte(uchar byte) { uchar i,temp; temp=byte; for(i=0;i<8;i++) { temp=temp<<1; scl=0; delayus(); sda=CY; delayus(); scl=1; delayus(); } scl=0; delayus(); sda=1; delayus(); } /*--------------------------------------------------------------- 读一个字节函数,有返回值 ----------------------------------------------------------------*/ uchar read_byte() { uchar i,j,k; scl=0; delayus(); sda=1; delayus(); for(i=0;i<8;i++) { delayus(); scl=1; delayus(); if(sda==1) { j=1; } else j=0; k=(k<< 1)|j; scl=0; } delayus(); return k; } /*--------------------------------------------------------------- 有关PCA9685模块的函数 ----------------------------------------------------------------*/ /*--------------------------------------------------------------- 向PCA9685里写地址,数据 ----------------------------------------------------------------*/ void PCA9685_write(uchar address,uchar date) { start(); write_byte(PCA9685_adrr); //PCA9685的片选地址 ACK(); write_byte(address); //写地址控制字节 ACK(); write_byte(date); //写数据 ACK(); stop(); } /*--------------------------------------------------------------- 从PCA9685里的地址值中读数据(有返回值) ----------------------------------------------------------------*/ uchar PCA9685_read(uchar address) { uchar date; start(); write_byte(PCA9685_adrr); //PCA9685的片选地址 ACK(); write_byte(address); ACK(); start(); write_byte(PCA9685_adrr|0x01); //地址的第八位控制数据流方向,就是写或读 ACK(); date=read_byte(); stop(); return date; }
淘宝上卖的16路PWM舵机驱动模块的51单片机程序 部分程序如下 #include #include #include #include typedef unsigned char uchar; typedef unsigned int uint; sbit scl=P1^3; //时钟输入线 sbit sda=P1^4; //数据输入/输出端 sbit KEY1=P2^0; sbit KEY2=P2^1; #define PCA9685_adrr 0x80// 1+A5+A4+A3+A2+A1+A0+w/r //片选地址,将焊接点置1可改变地址, // 当IIC总 呱嫌 多片PCA9685或相同地址时才需焊接 // #define PCA9685_SUBADR1 0x2 // #define PCA9685_SUBADR2 0x3 // #define PCA9685_SUBADR3 0x4 #define PCA9685_MODE1 0x0 #define PCA9685_PRESCALE 0xFE #define LED0_ON_L 0x6 #define LED0_ON_H 0x7 #define LED0_OFF_L 0x8 #define LED0_OFF_H 0x9 // #define ALLLED_ON_L 0xFA // #define ALLLED_ON_H 0xFB // #define ALLLED_OFF_L 0xFC // #define ALLLED_OFF_H 0xFD #define SERVOMIN 115 // this is the 'minimum' pulse length count (out of 4096) #define SERVOMAX 590 // this is the 'maximum' pulse length count (out of 4096) #define SERVO000 130 //0度对应4096的脉宽计数值 #define SERVO180 520 //180度对应4096的脉宽计算值,四个值可根据不同舵机修改 /**********************函数的声明*********************************/ /*--------------------------------------------------------------- 毫秒延时函数 ----------------------------------------------------------------*/ void delayms(uint z) { uint x,y; for(x=z;x>0;x--) for(y=148;y>0;y--); } /*--------------------------------------------------------------- IIC总线所需的通用函数 ----------------------------------------------------------------*/ /*--------------------------------------------------------------- 微妙级别延时函数 大于4.7us ----------------------------------------------------------------*/ void delayus() { _nop_(); //在intrins.h文件里 _nop_(); _nop_(); _nop_(); _nop_(); } /*--------------------------------------------------------------- IIC总线初始化函数 ----------------------------------------------------------------*/ void init() { sda=1; //sda scl使用前总是被拉高 delayus(); scl=1; delayus(); } /*--------------------------------------------------------------- IIC总线启动信号函数 ----------------------------------------------------------------*/ void start() { sda=1; delayus(); scl=1; //scl拉高时 sda突然来个低电平 就启动了IIC总线 delayus(); sda=0; delayus(); scl=0; delayus(); } /*--------------------------------------------------------------- IIC总线停止信号函数 ----------------------------------------------------------------*/ void stop() { sda=0; delayus(); scl=1; //scl拉高时 sda突然来个高电平 就停止了IIC总线 delayus(); sda=1; delayus(); } /*--------------------------------------------------------------- IIC总线应答信号函数 ----------------------------------------------------------------*/ void ACK() { uchar i; scl=1; delayus(); while((sda=1)&&(i<255)) i++; scl=0; delayus(); } /*--------------------------------------------------------------- 写一个字节,无返回值,需输入一个字节值 ----------------------------------------------------------------*/ void write_byte(uchar byte) { uchar i,temp; temp=byte; for(i=0;i<8;i++) { temp=temp<<1; scl=0; delayus(); sda=CY; delayus(); scl=1; delayus(); } scl=0; delayus(); sda=1; delayus(); } /*--------------------------------------------------------------- 读一个字节函数,有返回值 ----------------------------------------------------------------*/ uchar read_byte() { uchar i,j,k; scl=0; delayus(); sda=1; delayus(); for(i=0;i<8;i++) { delayus(); scl=1; delayus(); if(sda==1) { j=1; } else j=0; k=(k<< 1)|j; scl=0; } delayus(); return k; } /*--------------------------------------------------------------- 有关PCA9685模块的函数 ----------------------------------------------------------------*/ /*--------------------------------------------------------------- 向PCA9685里写地址,数据 ----------------------------------------------------------------*/ void PCA9685_write(uchar address,uchar date) { start(); write_byte(PCA9685_adrr); //PCA9685的片选地址 ACK(); write_byte(address); //写地址控制字节 ACK(); write_byte(date); //写数据 ACK(); stop(); } /*--------------------------------------------------------------- 从PCA9685里的地址值中读数据(有返回值) ----------------------------------------------------------------*/ uchar PCA9685_read(uchar address) { uchar date; start(); write_byte(PCA9685_adrr); //PCA9685的片选地址 ACK(); write_byte(address); ACK(); start(); write_byte(PCA9685_adrr|0x01); //地址的第八位控制数据流方向,就是写或读 ACK(); date=read_byte(); stop(); return date; }
### 回答1: 0.96寸OLED是一种小型的有机发光二极管显示屏。它是一种高亮度、高对比度、高分辨率的显示屏,适用于各种应用场合。IIC驱动程序则是操作系统或电路板与其它设备之间的通信协议,它可以进行数据传输和控制信号的交互。因此,编写0.96寸OLED的IIC驱动程序就是要实现电路板与显示屏之间的通信交互,使显示屏能够正确地显示图像和文字。 在编写0.96寸OLED的IIC驱动程序时,应首先了解其IIC接口的相关规范,包括SCL时钟速率、SDA数据线的电平和传输协议等。其次,需要了解OLED屏幕的显示控制指令,以便能够控制屏幕的显示效果。最后,就是编写具体的IIC驱动程序,主要包括向OLED发送指令和数据信息,以及控制屏幕的显示效果。 在具体的编写过程中,需要注意一些问题。首先,要确保发送的指令和数据信息能够正确地被OLED屏幕接收和解析,以便实现正确的显示效果。其次,要考虑不同操作系统和电路板的兼容性,以确保程序的可移植性和通用性。此外,还需要对程序进行不断测试和优化,以提高程序的稳定性和运行效率。 总之,编写0.96寸OLED的IIC驱动程序需要有一定的电子组装和编程知识,但也是一种具有挑战性和实用性的任务。通过不断地学习和实践,我们可以掌握其编写技巧,为各种应用场合提供高品质的显示屏幕。 ### 回答2: 0.96寸oled是一种小型显示屏,由于其小巧、高清和低功耗特点,被广泛应用于各种便携式电子产品中。而其iic驱动程序则是控制该显示屏的重要部分。 iic驱动程序的主要作用是通过iic总线与显示屏通信,将需要显示的图像或数据发送到oled屏幕上。在编写iic驱动程序时,需要考虑以下几个关键因素: 首先,需要明确o了屏幕的iic地址。通常,该地址为0x3C或0x3D。然后,还需要通过iic总线初始化oled屏幕,并设置其显示模式、亮度和对比度等参数。 其次,需要将设计好的图像或数据转换成oled屏幕能够识别的格式,并通过iic总线发送到屏幕上。这通常需要使用一些特殊的函数和库,例如Adafruit或u8g2等。 最后,需要考虑屏幕的尺寸和分辨率,以保证显示效果清晰和稳定。此外,还需要在程序中加入一些延迟、清屏和休眠等功能,以降低功耗和延长oled屏幕的使用寿命。 总之,编写0.96寸oled的iic驱动程序需要考虑诸多因素,但只要掌握一定的知识和经验,就能轻松完成该任务,让oled屏幕在各种应用场景中发挥出其优异的性能和效果。 ### 回答3: IIC是一种串行通信总线协议,也称为I2C(Inter-Integrated Circuit)。IIC协议可以实现多个设备之间的通信,这些设备可以是不同的芯片或者模块。对于0.96寸OLED显示屏来说,我们需要使用IIC驱动程序来使其正常显示。 IIC协议中传输的数据是通过使用SCL和SDA两个线路进行同步传输的,其中SCL线路用于时钟信号的传输,SDA线路用于数据的传输。在将OLED屏幕连接到单片机或者开发板之后,我们需要根据OLED的型号和接线方式编写相应的IIC驱动程序。 在编写IIC驱动程序之前,需要先确定OLED显示屏的IIC地址,多数情况下该地址为0x3C或者0x3D。然后,我们需要根据OLED屏幕的接口协议编写读取和写入数据的函数。对于写入数据函数,通常的流程如下:首先启动IIC总线,然后发送OLED屏幕的IIC地址,接着发送控制字节和具体的数据,最后释放IIC总线。对于读取数据函数,流程类似,只需要在发送IIC地址之后,向OLED屏幕发送读取命令即可。 需要注意的是,不同厂商的OLED屏幕可能存在接口协议的差异,因此在编写IIC驱动程序时需要了解具体的厂商数据手册和接口定义。同时,在实际使用过程中,还需要根据具体的应用场景对IIC驱动程序进行优化和改进,以实现更高效的数据传输和显示效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值