shendu0032 发表于 2024-4-25 14:34

【N32G430开发板体验】软件IIC驱动OLED

本帖最后由 shendu0032 于 2024-4-25 14:35 编辑

上一篇介绍这款开发板的资料和流水灯实验,这次在上次代码的基础上添加OLED的驱动程序,软件IIC是通过GPIO引脚,软件模拟寄存器的方式来控制管脚的状态,从而模拟IIC通讯的波形,最终达到一个IIC通讯的过程。下面详细介绍IIC软件模拟通讯的4个过程,分别是1、起始信号与停止信号;2、应答信号;3、数据的有效性;4、数据传输。
1、起始信号与停止信号
起始信号:当SCL为高电平期间,SDA由高到低的跳变,起始信号是一种电平跳变的时序信号而不是一个电平信号。
停止信号:当SCL为高电平期间,SDA由低到高的跳变,停止信号也是一种电平跳变的时序信号而不是一个电平信号。起始信号和停止信号一般由主机产生。
//IIC Start
**********************************************/
void OLED_IIC_Start()
{

      OLED_SCLK_Set();
      SysTick_Delay_Us(3);
      OLED_SDIN_Set();
      SysTick_Delay_Us(3);
      OLED_SDIN_Clr();
      SysTick_Delay_Us(3);
      OLED_SCLK_Clr();
      SysTick_Delay_Us(3);
}

/**********************************************
//IIC Stop
**********************************************/
void OLED_IIC_Stop()
{
      OLED_SCLK_Set();
      SysTick_Delay_Us(3);
      OLED_SDIN_Clr();
      SysTick_Delay_Us(3);
      OLED_SDIN_Set();
      SysTick_Delay_Us(3);
      
}
为了更加直观方便的编写代码,在oled.h文件中添加宏定义,下面是oled.h文件的代码,可以看到SCL和SDA引脚分别是PA4和PA5
#ifndef __OLED_H
#define __OLED_H      

#include "n32g430.h"
#include "stdlib.h"      
#include "n32g430_gpio.h"

#define OLED_MODE 0
#define SIZE 8
#define XLevelL                0x00
#define XLevelH                0x10
#define Max_Column      128
#define Max_Row                64
#define      Brightness      0xFF
#define X_WIDTH         128
#define Y_WIDTH         64         

#define OLED_SCLK_Clr() GPIO_Pins_Reset(GPIOA,GPIO_PIN_4)//SCL
#define OLED_SCLK_Set() GPIO_Pins_Set(GPIOA,GPIO_PIN_4)

#define OLED_SDIN_Clr() GPIO_Pins_Reset(GPIOA,GPIO_PIN_5)//SDA
#define OLED_SDIN_Set() GPIO_Pins_Set(GPIOA,GPIO_PIN_5)

//#define OLED_SCLK_Clr() (GPIOA->PBC= GPIO_PIN_4)//SCL
//#define OLED_SCLK_Set() (GPIOA->PBSC = GPIO_PIN_4)

//#define OLED_SDIN_Clr() (GPIOA->PBC= GPIO_PIN_5)//SDA
//#define OLED_SDIN_Set() (GPIOA->PBSC = GPIO_PIN_5)

#define OLED_CMD0      //写命令
#define OLED_DATA 1      //写数据

//OLED控制用函数
void OLED_WR_Byte(unsigned dat,unsigned cmd);
void OLED_Display_On(void);
void OLED_Display_Off(void);                                                                                          
void OLED_Init(void);
void OLED_Clear(void);
void OLED_DrawPoint(uint8_t x,uint8_t y,uint8_t t);
void OLED_Fill(uint8_t x1,uint8_t y1,uint8_t x2,uint8_t y2,uint8_t dot);
void OLED_ShowChar(uint8_t x,uint8_t y,uint8_t chr,uint8_t Char_Size);
void OLED_ShowNumber(uint8_t x,uint8_t y,uint32_t num,uint8_t len,uint8_t size);
void OLED_ShowString(uint8_t x,uint8_t y, uint8_t *p,uint8_t Char_Size);         
void OLED_Set_Pos(unsigned char x, unsigned char y);
void OLED_ShowCHinese(uint8_t x,uint8_t y,uint8_t no);
void OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char BMP[]);
void fill_picture(unsigned char fill_Data);
void Picture(void);
void OLED_IIC_Start(void);
void OLED_IIC_Stop(void);
void OLED_Write_IIC_Command(unsigned char IIC_Command);
void OLED_Write_IIC_Data(unsigned char IIC_Data);
void OLED_Write_IIC_Byte(unsigned char IIC_Byte);
void OLED_IIC_Wait_Ack(void);

void OLED_fuhao_write(unsigned char x,unsigned char y,unsigned char asc);
void OLED_Num_write(unsigned char x,unsigned char y,unsigned char asc) ;
void OLED_Float(unsigned char Y,unsigned char X,double real,unsigned char N);
void OLED_Float2(unsigned char Y,unsigned char X,double real,unsigned char N1,unsigned char N2);
void OLED_Num2(unsigned char x,unsigned char y, int number);
void OLED_Num3(unsigned char x,unsigned char y,int number);
void OLED_Num4(unsigned char x,unsigned char y, int number);
void OLED_Num5(unsigned char x,unsigned char y,unsigned int number);

void OLED_GPIO_Configuare(void);
#endif
2、从机应答信号
主机每发送一个字节吗,就在时钟脉冲9期间释放数据线,由从机反馈一个应答信号。应答信号为低电平时规定为有效应答位(ACK简称应答位)表示从机已经成功接收到该字节。应答信号为高电平时,规定为非应答位,一般表示从机接收该字节没有成功。对于反馈有效应答位ACK的要求是从机在第9个时钟脉冲之前的低电平期间将SDA线拉低,并且确保在该时钟的高电平期间为稳定的低电平。在图中红色可以看到,SCL为低电平后SDA再升为高电平,再SCL变为高电平,由此可以进行一个软件模拟IIC波形。

void OLED_IIC_Wait_Ack()
{
      OLED_SCLK_Set();
      SysTick_Delay_Us(3);
      OLED_SCLK_Clr();
      SysTick_Delay_Us(3);
}
3、数据有效性
IIC总线进行数据传输时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。SDA数据线在SCL的每个时钟周期传输一位数据。即数据在SCL的上升沿到来之前就需要准备好,并在下降沿到来之前必须稳定。
4、数据传输
在数据有效性中,数据位的传输是边沿触发的,在IIC总线上数据传输,传送的每一位数据都有一个时钟脉冲相对应,SCL为高电平时SDA表示数据有效,即此时的SDA为高电平时表示数据“1”,为低电平时表示数据“0”.即在SCL串行时钟的配合下,SDA上逐位地串行传送每一位数据。传输数据地时候,将SCL置低,然后设置SDA总线对应地引脚电平为高/低,SDA电平确定后再将SCL置高,将8位由高到低依次发送出去。
// IIC Write byte
**********************************************/
void OLED_Write_IIC_Byte(unsigned char IIC_Byte)
{
      unsigned char i;
      unsigned char m,da;
      da=IIC_Byte;
      OLED_SCLK_Clr();
      for(i=0;i<8;i++)               
      {
                m=da;
                //      OLED_SCLK_Clr();
                m=m&0x80;
                if(m==0x80)
                {
                        OLED_SDIN_Set();
                }
                else
                        OLED_SDIN_Clr();
                da=da<<1;
                SysTick_Delay_Us(3);
                OLED_SCLK_Set();
                SysTick_Delay_Us(3);
                OLED_SCLK_Clr();
                SysTick_Delay_Us(3);
      }
}
/**********************************************
// IIC Write Command
**********************************************/
void OLED_Write_IIC_Command(unsigned char IIC_Command)
{
                OLED_IIC_Start();
                OLED_Write_IIC_Byte(0x78);            //Slave address,SA0=0
                OLED_IIC_Wait_Ack();      
                OLED_Write_IIC_Byte(0x00);                        //write command
                OLED_IIC_Wait_Ack();      
                OLED_Write_IIC_Byte(IIC_Command);
                OLED_IIC_Wait_Ack();      
                OLED_IIC_Stop();
}
/**********************************************
// IIC Write Data
**********************************************/
void OLED_Write_IIC_Data(unsigned char IIC_Data)
{
                OLED_IIC_Start();
                OLED_Write_IIC_Byte(0x78);                        //D/C#=0; R/W#=0
                OLED_IIC_Wait_Ack();      
                OLED_Write_IIC_Byte(0x40);                        //write data
                OLED_IIC_Wait_Ack();      
                OLED_Write_IIC_Byte(IIC_Data);
                OLED_IIC_Wait_Ack();      
                OLED_IIC_Stop();
}
void OLED_WR_Byte(unsigned dat,unsigned cmd)
{
      if(cmd)
      {
   OLED_Write_IIC_Data(dat);
      }
      else
      {
   OLED_Write_IIC_Command(dat);
      }
}
本次实验用的是OLED模块(0.96寸4针IIC接口OLED显示屏)SSD1306,电源电压3.3-5.5V,总共四个接口,GND,VCC,SCL(IIC总线时钟信号),SDA(IIC总线数据信号)。SSD1306是一个为映射静态 RAM 保存位模式来显示。该 RAM 的为 128 * 64 bit大小,RAM 分为 8 页,从 PAFE0 到 PAGE7,用于单色 128 * 64 点阵显示。下面是OLED引脚初始化和OLED初始化程序

void OLED_GPIO_Configuare(void)
{
    GPIO_InitType GPIO_InitStructure;
          RCC_AHB_Peripheral_Clock_Enable(RCC_AHB_PERIPH_GPIOA);
    GPIO_Structure_Initialize(&GPIO_InitStructure);      
      /* Select the GPIO pin to control */
    GPIO_InitStructure.Pin          = GPIO_PIN_4|GPIO_PIN_5;
      /* Set pin mode to general push-pull output */
    GPIO_InitStructure.GPIO_Mode    = GPIO_MODE_OUT_PP;
                GPIO_InitStructure.GPIO_Pull      = GPIO_PULL_UP;
      /* Set the pin drive current to 4MA*/
    GPIO_InitStructure.GPIO_Current = GPIO_DS_4MA;
      /* Initialize GPIO */
    GPIO_Peripheral_Initialize(GPIOA, &GPIO_InitStructure);
                GPIO_Pins_Set(GPIOA,GPIO_PIN_4|GPIO_PIN_5);
}

//初始化SSD1306                                          
void OLED_Init(void)
{

      OLED_GPIO_Configuare();
      SysTick_Delay_Ms(200);
      OLED_WR_Byte(0xAE,OLED_CMD);//--display off
      OLED_WR_Byte(0x00,OLED_CMD);//---set low column address
      OLED_WR_Byte(0x10,OLED_CMD);//---set high column address
      OLED_WR_Byte(0x40,OLED_CMD);//--set start line address
      OLED_WR_Byte(0xB0,OLED_CMD);//--set page address
      OLED_WR_Byte(0x81,OLED_CMD); // contract control
      OLED_WR_Byte(0xFF,OLED_CMD);//--128   
      OLED_WR_Byte(0xA1,OLED_CMD);//set segment remap
      OLED_WR_Byte(0xA6,OLED_CMD);//--normal / reverse
      OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)
      OLED_WR_Byte(0x3F,OLED_CMD);//--1/32 duty
      OLED_WR_Byte(0xC8,OLED_CMD);//Com scan direction
      OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset
      OLED_WR_Byte(0x00,OLED_CMD);//
      
      OLED_WR_Byte(0xD5,OLED_CMD);//set osc division
      OLED_WR_Byte(0x80,OLED_CMD);//
      
      OLED_WR_Byte(0xD8,OLED_CMD);//set area color mode off
      OLED_WR_Byte(0x05,OLED_CMD);//
      
      OLED_WR_Byte(0xD9,OLED_CMD);//Set Pre-Charge Period
      OLED_WR_Byte(0xF1,OLED_CMD);//
      
      OLED_WR_Byte(0xDA,OLED_CMD);//set com pin configuartion
      OLED_WR_Byte(0x12,OLED_CMD);//
      
      OLED_WR_Byte(0xDB,OLED_CMD);//set Vcomh
      OLED_WR_Byte(0x30,OLED_CMD);//
      
      OLED_WR_Byte(0x8D,OLED_CMD);//set charge pump enable
      OLED_WR_Byte(0x14,OLED_CMD);//
      
      OLED_WR_Byte(0xAF,OLED_CMD);//--turn on oled panel
      OLED_Clear();
      OLED_Set_Pos(0,0);
      
}写入起始坐标
//坐标设置
void OLED_Set_Pos(unsigned char x, unsigned char y)
{         
      OLED_WR_Byte(0xb0+y,OLED_CMD);
      OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD);
      OLED_WR_Byte((x&0x0f),OLED_CMD);
} 清屏函数
//清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!!         
void OLED_Clear(void)
{
      uint8_t i,n;                  
      for(i=0;i<8;i++)
      {
                OLED_WR_Byte (0xb0+i,OLED_CMD);    //设置页地址(0~7)
                OLED_WR_Byte (0x00,OLED_CMD);      //设置显示位置—列低地址
                OLED_WR_Byte (0x10,OLED_CMD);      //设置显示位置—列高地址   
                for(n=0;n<128;n++)OLED_WR_Byte(0,OLED_DATA);
      } //更新显示
}开启&关闭OLED显示
//开启OLED显示   
void OLED_Display_On(void)
{
      OLED_WR_Byte(0X8D,OLED_CMD);//SET DCDC命令
      OLED_WR_Byte(0X14,OLED_CMD);//DCDC ON
      OLED_WR_Byte(0XAF,OLED_CMD);//DISPLAY ON
}
//关闭OLED显示   
void OLED_Display_Off(void)
{
      OLED_WR_Byte(0X8D,OLED_CMD);//SET DCDC命令
      OLED_WR_Byte(0X10,OLED_CMD);//DCDC OFF
      OLED_WR_Byte(0XAE,OLED_CMD);//DISPLAY OFF
}                显示字符,数字,字符串,汉字等函数代码
//在指定位置显示一个字符,包括部分字符
//x:0~127
//y:0~63
//mode:0,反白显示;1,正常显示                                 
//size:选择字体 16/12
void OLED_ShowChar(uint8_t x,uint8_t y,uint8_t chr,uint8_t Char_Size)
{            
      unsigned char c=0,i=0;      
                c=chr-' ';//得到偏移后的值                        
                if(x>Max_Column-1){x=0;y=y+2;}
                if(Char_Size ==16)
                        {
                        OLED_Set_Pos(x,y);      
                        for(i=0;i<8;i++)
                        OLED_WR_Byte(F8X16,OLED_DATA);
                        OLED_Set_Pos(x,y+1);
                        for(i=0;i<8;i++)
                        OLED_WR_Byte(F8X16,OLED_DATA);
                        }
                        else {      
                              OLED_Set_Pos(x,y);
                              for(i=0;i<6;i++)
                              OLED_WR_Byte(F6x8,OLED_DATA);
                              
                        }
}
//m^n函数
uint32_t oled_pow(uint8_t m,uint8_t n)
{
      uint32_t result=1;         
      while(n--)result*=m;   
      return result;
}                                 
//显示2个数字
//x,y :起点坐标         
//len :数字的位数
//size:字体大小
//mode:模式      0,填充模式;1,叠加模式
//num:数值(0~4294967295);                           
void OLED_ShowNumber(uint8_t x,uint8_t y,uint32_t      num,uint8_t len,uint8_t size2)
{               
      uint8_t t,temp;
      uint8_t enshow=0;                                                   
      for(t=0;t<len;t++)
      {
                temp=(num/oled_pow(10,len-t-1))%10;
                if(enshow==0&&t<(len-1))
                {
                        if(temp==0)
                        {
                              OLED_ShowChar(x+(size2/2)*t,y,' ',size2);
                              continue;
                        }else enshow=1;
                        
                }
               OLED_ShowChar(x+(size2/2)*t,y,temp+'0',size2);
      }
}
//显示一个字符号串
void OLED_ShowString(uint8_t x,uint8_t y,uint8_t *chr,uint8_t Char_Size)
{
      while (*chr!='\0')
      {                OLED_ShowChar(x,y,*chr,Char_Size);
                        x+=8;
                if(x>120){x=0;y+=2;}
                        chr++;
      }
}
//显示汉字
void OLED_ShowCHinese(uint8_t x,uint8_t y,uint8_t no)
{                                 
      uint8_t t,adder=0;
      OLED_Set_Pos(x,y);      
    for(t=0;t<16;t++)
                {
                              OLED_WR_Byte(Hzk,OLED_DATA);
                              adder+=1;
   }      
                OLED_Set_Pos(x,y+1);      
    for(t=0;t<16;t++)
                        {      
                              OLED_WR_Byte(Hzk,OLED_DATA);
                              adder+=1;
      }                                       
}
/***********功能描述:显示显示BMP图片128×64起始点坐标(x,y),x的范围0~127,y为页的范围0~7*****************/
void OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char BMP[])
{         
unsigned int j=0;
unsigned char x,y;

if(y1%8==0) y=y1/8;      
else y=y1/8+1;
      for(y=y0;y<y1;y++)
      {
                OLED_Set_Pos(x0,y);
    for(x=x0;x<x1;x++)
            {      
                  OLED_WR_Byte(BMP,OLED_DATA);                  
            }
      }
}
void OLED_Float(unsigned char Y,unsigned char X,double real,unsigned char N)
{
   unsigned char   i_Count=1;
   unsigned char   n={0};
   long   j=1;
   int    real_int=0;
   double decimal=0;
   unsigned int   real_decimal=0;
   if(real<0)
         {
               real_int=(int)(-real);
         }
         else
         {
               real_int=(int)real;
   }
         decimal=real-real_int;
   real_decimal=decimal*1e4;
   while(real_int/10/j!=0)
   {
      j=j*10;i_Count++;
   }
   n=(real_int/10000)%10;
   n=(real_int/1000)%10;
   n=(real_int/100)%10;
   n=(real_int/10)%10;
   n=(real_int/1)%10;
   n='.';
   n=(real_decimal/1000)%10;
   n=(real_decimal/100)%10;
   n=(real_decimal/10)%10;
   n=real_decimal%10;
   n='\0';
   for(j=0;j<10;j++) n=n+16+32;
         if(real<0)
         {               
               i_Count+=1;
               n='-';
         }
   n='.';
   n='\0';   
   OLED_ShowString(X,Y,&n,12);
}

void OLED_Float2(unsigned char Y,unsigned char X,double real,unsigned char N1,unsigned char N2)
{
   unsigned char   i_Count=1;
   unsigned char   n={0};
   long   j=1;
   unsigned int   real_int=0;
   double decimal=0;
   unsigned int   real_decimal=0;
   X=X*8;
   real_int=(int)real;
   //Dis_Num(2,0,real_int,5);
   decimal=real-real_int;
   real_decimal=decimal*1e4;
   //Dis_Num(2,6,real_decimal,4);
   while(real_int/10/j!=0)
   {
      j=j*10;i_Count++;
   }
   n=(real_int/10000)%10;
   n=(real_int/1000)%10;
   n=(real_int/100)%10;
   n=(real_int/10)%10;

   n='.';
   n=(real_decimal/1000)%10;
   n=(real_decimal/100)%10;
   n=(real_decimal/10)%10;
   n=real_decimal%10;
   n='\0';
   for(j=0;j<10;j++) n=n+16+32;
   n='.';
   n='\0';   
   OLED_ShowString(X,Y,&n,12);
}

void OLED_Num2(unsigned char x,unsigned char y, int number)
{
      unsigned char shi,ge;
            int num =number;
      if(num<0)
      {
                num=-num;
                shi=num%100/10;
    ge=num%10;
          OLED_fuhao_write(x,y,13);
    OLED_Num_write(x+1,y,shi);
    OLED_Num_write(x+2,y,ge);
}
else
      {

                shi=num%100/10;
    ge=num%10;
                OLED_fuhao_write(x,y,11);
    OLED_Num_write(x+1,y,shi);
    OLED_Num_write(x+2,y,ge);
}
      
}

void OLED_Num3(unsigned char x,unsigned char y,int number)
{
unsigned char ge,shi,bai;
      int num =number;
      if(num<0)
      {
                  num=-num;
                  OLED_fuhao_write(x,y,13); //显示-号
      ge = num %10;
      shi = num/10%10;
      bai = num/100;
      OLED_Num_write(x+3,y,ge);
      OLED_Num_write(x+2,y,shi);
      OLED_Num_write(x+1,y,bai);
      }
      else
      {
       OLED_fuhao_write(x,y,11);
      ge = num %10;
      shi = num/10 %10;
      bai = num/100;
      OLED_Num_write(x+3,y,ge);
      OLED_Num_write(x+2,y,shi);
      OLED_Num_write(x+1,y,bai);
}
}

void OLED_Num4(unsigned char x,unsigned char y, int number)
{
      unsigned char qian,bai,shi,ge;
      int num =number;
      if(num<0)
      {
                num=-num;
      }
      qian=num/1000;
      bai=num%1000/100;
      shi=num%100/10;
      ge=num%10;

      OLED_Num_write(x,y,qian);
      OLED_Num_write(x+1,y,bai);
      OLED_Num_write(x+2,y,shi);
      OLED_Num_write(x+3,y,ge);
}

void OLED_Num_write(unsigned char x,unsigned char y,unsigned char asc)
{
      int i=0;
      OLED_Set_Pos(x*6,y);
      for(i=0;i<6;i++)
      {
               OLED_WR_Byte(F6x8,OLED_DATA);         
      }
}      
void OLED_fuhao_write(unsigned char x,unsigned char y,unsigned char asc)
{

          int i=0;
    OLED_Set_Pos(x*6,y);
    for(i=0;i<6;i++)
    {
       OLED_WR_Byte(F6x8,OLED_DATA);         
    }

}                        

void OLED_Num5(unsigned char x,unsigned char y,unsigned int number)
{
      unsigned char wan,qian,bai,shi,ge;
      wan=number/10000;
                  qian = number%10000/1000;
      bai=number%1000/100;
      shi=number%100/10;
      ge=number%10;
      OLED_Num_write(x,y,wan);
      OLED_Num_write(x+1,y,qian);
      OLED_Num_write(x+2,y,bai);
      OLED_Num_write(x+3,y,shi);
                  OLED_Num_write(x+4,y,ge);
}这里面要使用取模软件01-PCtoLCD2002完美版,可以实现汉字、图片、英文的取模。首先双击打开软件

点击模式,选择字符模式

点击选项按钮,进行配置,点阵内的数字手动输入999,所有设置完成后点击确定

以生成16*16的汉字为例,字宽和字高选择16,在输入栏输入需要取模的汉字,且只能是汉字,然后点击生成字模按钮

将生成的代码复制到oledfont.h文件的数组中
char Hzk[]={

{0x00,0xFE,0x02,0x12,0x92,0x92,0x92,0xF2,0x92,0x92,0x92,0x12,0x02,0xFE,0x00,0x00},
{0x00,0xFF,0x40,0x48,0x48,0x48,0x48,0x4F,0x48,0x4A,0x4C,0x48,0x40,0xFF,0x00,0x00},/*"国",0*/

{0x00,0x00,0xFE,0x22,0x22,0x22,0x22,0x22,0xE2,0x22,0x22,0x22,0x3E,0x00,0x00,0x00},
{0x00,0x00,0xFF,0x41,0x21,0x11,0x01,0x01,0x03,0x0D,0x11,0x21,0x41,0xF1,0x00,0x00},/*"民",1*/

{0x10,0x10,0x10,0xFF,0x10,0x90,0x08,0x88,0x88,0x88,0xFF,0x88,0x88,0x88,0x08,0x00},
{0x04,0x44,0x82,0x7F,0x01,0x80,0x80,0x40,0x43,0x2C,0x10,0x28,0x46,0x81,0x80,0x00},/*"技",2*/

{0x00,0x10,0x10,0x10,0x10,0xD0,0x30,0xFF,0x30,0xD0,0x12,0x1C,0x10,0x10,0x00,0x00},
{0x10,0x08,0x04,0x02,0x01,0x00,0x00,0xFF,0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x00},/*"术",3*/

{0x00,0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00,0x00},
{0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00},/*"二",4*/

{0x10,0xF0,0x1F,0x10,0xF0,0x04,0xD4,0x54,0x54,0xFF,0x54,0x54,0x74,0x04,0x00,0x00},
{0x41,0x22,0x14,0x0C,0x33,0x80,0x41,0x21,0x19,0x07,0x19,0x25,0x49,0x87,0x80,0x00},/*"姨",5*/

{0x00,0x00,0xF8,0x88,0x88,0x88,0x88,0xFF,0x88,0x88,0x88,0x88,0xF8,0x00,0x00,0x00},
{0x00,0x00,0x1F,0x08,0x08,0x08,0x08,0x7F,0x88,0x88,0x88,0x88,0x9F,0x80,0xF0,0x00},/*"电",6*/

{0x80,0x82,0x82,0x82,0x82,0x82,0x82,0xE2,0xA2,0x92,0x8A,0x86,0x82,0x80,0x80,0x00},
{0x00,0x00,0x00,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"子",7*/

{0x00,0xFE,0x02,0x22,0x42,0x82,0x72,0x02,0x22,0x42,0x82,0x72,0x02,0xFE,0x00,0x00},
{0x00,0xFF,0x10,0x08,0x06,0x01,0x0E,0x10,0x08,0x06,0x01,0x4E,0x80,0x7F,0x00,0x00},/*"网",8*/

{0x10,0x60,0x02,0x8C,0x00,0xFE,0x02,0xF2,0x02,0xFE,0x00,0xF8,0x00,0xFF,0x00,0x00},
{0x04,0x04,0x7E,0x01,0x80,0x47,0x30,0x0F,0x10,0x27,0x00,0x47,0x80,0x7F,0x00,0x00},/*"测",9*/

{0x40,0x40,0x42,0xCC,0x00,0x90,0x90,0x90,0x90,0x90,0xFF,0x10,0x11,0x16,0x10,0x00},
{0x00,0x00,0x00,0x3F,0x10,0x28,0x60,0x3F,0x10,0x10,0x01,0x0E,0x30,0x40,0xF0,0x00},/*"试",10*/

};完成上述过程之后,在main函数添加必要的头文件和初始化代码,可以在while循环中执行以下显示代码OLED_ShowCHinese(15,2,0);
                OLED_ShowCHinese(42,2,1);               
                OLED_ShowCHinese(70,2,2);               
                OLED_ShowCHinese(98,2,3);               
                OLED_ShowCHinese(23,0,4);
                OLED_ShowCHinese(39,0,5);               
                OLED_ShowCHinese(55,0,6);               
                OLED_ShowCHinese(71,0,7);       
                OLED_ShowCHinese(87,0,8);       
                OLED_ShowString(23,4,"N32G430CBL7",16);       
                OLED_ShowString(31,6,"OLED",16);               
                OLED_ShowCHinese(64,6,9);       
                OLED_ShowCHinese(80,6,10);       


慢醇 发表于 2024-8-31 18:22

如果是ACK信号,SDA会被拉低;如果是NACK信号,SDA会保持高电平。
页: [1]
查看完整版本: 【N32G430开发板体验】软件IIC驱动OLED