> 文档中心 > 【GD32F427开发板试用】06-硬件I2C&软件I2C驱动0.91OLED

【GD32F427开发板试用】06-硬件I2C&软件I2C驱动0.91OLED


本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动,更多开发板试用活动请关注极术社区网站。作者:Stark_GS

I2C 简介及特点

  • 并行总线至 I2C 总线协议的转换及接口;
  • 同一接口既可实现主机功能又可实现从机功能;
  • 主从机之间的双向数据传输;
  • 支持 7 位和 10 位的地址模式和广播寻址;
  • 支持 I2C 多主机模式;
  • 支持标速(最高 100 kHz),快速(最高 400 kHz)
  • 从机模式下可配置的 SCL 主动拉低;
  • 支持 DMA 模式;
  • 兼容 SMBus 2.0 和 PMBus;
  • 两个中断:字节成功发送中断和错误事件中断;
  • 可选择的 PEC (报文错误校验) 生成和校验;
  • 支持 SAM_V 模式。
  • GD32F450 支持数字和模拟噪声滤波器。

I2C (内部集成电路总线) 模块提供了符合工业标准的两线串行制接口,可用于 MCU 和外部 I2C 设备的通讯。 I2C 总线使用两条串行线:串行数据线 SDA 和串行时钟线 SCL。

I2C 接口模块实现了 I2C 协议的标速模式,快速模式,具备 CRC 计算和校验功能、支持 SMBus(系统管理总线) 和 PMBus (电源管理总线) 和 SAM_V(验证安全控制模块)模式,此外还支持多主机 I2C 总线架构。 I2C 接口模块也支持 DMA 模式,可有效减轻 CPU 的负担。

开发环境&参考文档

  • Keil-MDK 5.27.1.0
  • Windows11
  • 固件库-GD32F4xx_Firmware_Library_V3.0.2
  • GD32F427xx_Datasheet_Rev1.2
  • GD32F4xx_User_Manual_Rev2.7_CN
  • GD32F4xx 固件库使用指南_V1.0

代码部分

I2C 初始化配置

I2C.h 文件

#ifndef _IIC_H_#define _IIC_H_#include "gd32f4xx.h"void IIC_Init(void);#endif

I2C.c 文件

#include "iic.h"void IIC_Init(void){    rcu_periph_clock_enable(RCU_GPIOB);//启用外设时钟功能    rcu_periph_clock_enable(RCU_I2C0); gpio_af_set(GPIOB,GPIO_AF_4,GPIO_PIN_6);//端口复用为串口模式    gpio_af_set(GPIOB,GPIO_AF_4,GPIO_PIN_7); gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_6);  //设置IIC_SCL模式        gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_6);    //设置GPIO输出类型和速度 gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_7);  //设置IIC_SDA模式    gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_7);    //设置GPIO输出类型和速度 i2c_deinit(I2C0);//复位I2C0    i2c_clock_config(I2C0, 400000, I2C_DTCY_2);//设置波特率    i2c_mode_addr_config(I2C0, I2C_I2CMODE_ENABLE, I2C_ADDFORMAT_7BITS, 0x78);//设置模式、传输数据长度、主机地址    i2c_enable (I2C0);//使能外设    i2c_ack_config(I2C0,I2C_ACK_ENABLE);}

OLED 初始化函数

oled.h 文件

#ifndef __OLED_H#define __OLED_H    #include "iic.h"#include "stdlib.h"#include "systick.h"#define OLED_MODE 0#define SIZE 8#define XLevelL 0x00#define XLevelH 0x10#define Max_Column    128#define Max_Row 32#define    Brightness    0xFF #define X_WIDTH     128#define Y_WIDTH     32      //-----------------OLED IIC端口定义----------------    #define OLED_SCLK_Clr() gpio_bit_reset(GPIOC, GPIO_PIN_7)//SCL IIC接口的时钟信号#define OLED_SCLK_Set() gpio_bit_set(GPIOC, GPIO_PIN_7)#define OLED_SDIN_Clr() gpio_bit_reset(GPIOC, GPIO_PIN_8)//SCL IIC接口的数据信号#define OLED_SDIN_Set() gpio_bit_set(GPIOC, GPIO_PIN_8)#define OLED_CMD  0    //写命令#define OLED_DATA 1    //写数据#define S_I2C     1//软件IIC或硬件IIC开关#define u8 unsigned char#define u32 unsigned int//OLED控制用函数void fill_picture(unsigned char fill_Data);void IIC_Start(void);void IIC_Stop(void);void IIC_Wait_Ack(void);void Write_IIC_Command(unsigned char IIC_Command);void Write_IIC_Data(unsigned char IIC_Data);void Write_IIC_Byte(unsigned char IIC_Byte);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(u8 x,u8 y,u8 t);void OLED_Fill(u8 x1,u8 y1,u8 x2,u8 y2,u8 dot);void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 Char_Size);void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size);void OLED_ShowString(u8 x,u8 y, u8 *p,u8 Char_Size);     void OLED_Set_Pos(unsigned char x, unsigned char y);void OLED_ShowCHinese(u8 x,u8 y,u8 no);void OLED_DrawBMP(unsigned char x0,   unsigned char y0,  unsigned char x1,   unsigned char y1,  unsigned char BMP[]);#endif

oled.c 文件

软件I2C与硬件I2C的选定在 .h 文件中有说明。#define S_I2C 0//软件IIC或硬件IIC开关

具体区别在下列两个函数中
Write_IIC_Command()
Write_IIC_Data()

#include "oled.h"#include "stdlib.h"#include "oledfont.h"      #include "iic.h"//OLED 的显存//[0]0 1 2 3 ... 127    //[1]0 1 2 3 ... 127    //[2]0 1 2 3 ... 127    //[3]0 1 2 3 ... 127    //[4]0 1 2 3 ... 127    //[5]0 1 2 3 ... 127    //[6]0 1 2 3 ... 127    //[7]0 1 2 3 ... 127     /**********************************************//Software IIC Start**********************************************/#define OLED_Dly    5void OLED_Delay(uint32_t Num){    while(Num)    { Num--;    }}void IIC_Start(void){    OLED_SCLK_Set();OLED_Delay(OLED_Dly);    OLED_SDIN_Set();OLED_Delay(OLED_Dly);    OLED_SDIN_Clr();OLED_Delay(OLED_Dly);    OLED_SCLK_Clr();OLED_Delay(OLED_Dly);}/**********************************************//Software IIC Stop**********************************************/void IIC_Stop(void){    OLED_SCLK_Set();OLED_Delay(OLED_Dly);    OLED_SDIN_Clr();OLED_Delay(OLED_Dly);    OLED_SDIN_Set();OLED_Delay(OLED_Dly);}/**********************************************//Software IIC Ack**********************************************/void IIC_Wait_Ack(void){    OLED_SCLK_Set();OLED_Delay(OLED_Dly);    OLED_SCLK_Clr();OLED_Delay(OLED_Dly);}/**********************************************// IIC Write byte**********************************************/void Write_IIC_Byte(unsigned char IIC_Byte){    unsigned char i;    unsigned char m,da;    da=IIC_Byte;    OLED_SCLK_Clr();OLED_Delay(OLED_Dly);    for(i=0;i<8;i++)     { m=da; m=m&0x80; if(m==0x80) {     OLED_SDIN_Set();OLED_Delay(OLED_Dly); } else  OLED_SDIN_Clr();OLED_Delay(OLED_Dly); da=da<<1; OLED_SCLK_Set();OLED_Delay(OLED_Dly); OLED_SCLK_Clr();OLED_Delay(OLED_Dly);    }}/**********************************************// IIC Write Command**********************************************/void Write_IIC_Command(unsigned char IIC_Command){    #if S_I2C    IIC_Start();    Write_IIC_Byte(0x78);     //Slave address,SA0=0    IIC_Wait_Ack(); Write_IIC_Byte(0x00);     //write command    IIC_Wait_Ack(); Write_IIC_Byte(IIC_Command);     IIC_Wait_Ack(); IIC_Stop();    #else    while(i2c_flag_get(I2C0, I2C_FLAG_I2CBSY));    i2c_start_on_bus (I2C0);    while(!i2c_flag_get(I2C0, I2C_FLAG_SBSEND));//进入主机模式    i2c_master_addressing(I2C0, 0x78, I2C_TRANSMITTER);    while(!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND));//判断地址发送出去    i2c_flag_clear (I2C0, I2C_FLAG_ADDSEND);//清除ADDSEND位    while(SET != i2c_flag_get(I2C0, I2C_FLAG_TBE));//进入数据发送状态    i2c_data_transmit (I2C0, 0x00);    while(!i2c_flag_get(I2C0, I2C_FLAG_BTC));    i2c_data_transmit (I2C0, IIC_Command);    while(!i2c_flag_get(I2C0, I2C_FLAG_BTC));    i2c_stop_on_bus (I2C0);    while(I2C_CTL0(I2C0)&0x0200);    #endif}/**********************************************// IIC Write Data**********************************************/void Write_IIC_Data(unsigned char IIC_Data){    #if S_I2C    IIC_Start();    Write_IIC_Byte(0x78);     //Slave address,SA0=0    IIC_Wait_Ack(); Write_IIC_Byte(0x40);     //write data    IIC_Wait_Ack(); Write_IIC_Byte(IIC_Data);    IIC_Wait_Ack(); IIC_Stop();    #else    while(i2c_flag_get(I2C0, I2C_FLAG_I2CBSY));    i2c_start_on_bus (I2C0);    while(!i2c_flag_get(I2C0, I2C_FLAG_SBSEND));//进入主机模式    i2c_master_addressing(I2C0, 0x78, I2C_TRANSMITTER);    while(!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND));//判断地址发送出去    i2c_flag_clear (I2C0, I2C_FLAG_ADDSEND);//清除ADDSEND位    while(SET != i2c_flag_get(I2C0, I2C_FLAG_TBE));//进入数据发送状态    i2c_data_transmit (I2C0, 0x40);    while(!i2c_flag_get(I2C0, I2C_FLAG_BTC));    i2c_data_transmit (I2C0, IIC_Data);    while(!i2c_flag_get(I2C0, I2C_FLAG_BTC));    i2c_stop_on_bus (I2C0);    while(I2C_CTL0(I2C0)&0x0200);    #endif}void OLED_WR_Byte(unsigned dat,unsigned cmd){    if(cmd)    { Write_IIC_Data(dat);    }    else     { Write_IIC_Command(dat); }}/********************************************//Fill Picture********************************************/void fill_picture(unsigned char fill_Data){    unsigned char m,n;    for(m=0;m<8;m++)    { OLED_WR_Byte(0xb0+m,0); //page0-page1 OLED_WR_Byte(0x00,0); //low column start address OLED_WR_Byte(0x10,0); //high column start address for(n=0;n<128;n++) {     OLED_WR_Byte(fill_Data,1); }    }}/**********************************************//Set Position//坐标设置**********************************************/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); }  /**********************************************//Turn on OLED display  //开启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}   /**********************************************//Turn off OLED display//关闭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}    /**********************************************//清屏函数,清完屏,整个屏幕是黑色的!  **********************************************/      void OLED_Clear(void)  {      u8 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);     } //更新显示}/**********************************************//亮屏函数,整个屏幕点亮!  **********************************************/     void OLED_On(void)  {      u8 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(1,OLED_DATA);     } //更新显示}/**********************************************//在指定位置显示一个字符,包括部分字符//x:0~127//y:0~63//mode:0,反白显示;1,正常显示//chr:要显示的字符  //size:选择字体 16/12  **********************************************/      void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 Char_Size){unsigned char c=0,i=0; c=chr-' ';//得到偏移后的值,为什么做偏移可查看 ASCII 表     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[c*16+i],OLED_DATA);     OLED_Set_Pos(x,y+1);     for(i=0;i<8;i++)     OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA); } else  {  OLED_Set_Pos(x,y);     for(i=0;i<6;i++)     OLED_WR_Byte(F6x8[c][i],OLED_DATA);     }}/**********************************************//m^n函数**********************************************/      u32 oled_pow(u8 m,u8 n){    u32 result=1;  while(n--)result*=m; return result;}    /**********************************************//显示2个数字//x:0~127//y:0~63 //num:数值(0~4294967295);//len :数字的位数//size:字体大小**********************************************/void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size2){   u8 t,temp;    u8 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(u8 x,u8 y,u8 *chr,u8 Char_Size){    unsigned char j=0;    while (chr[j]!='\0')    {  OLED_ShowChar(x,y,chr[j],Char_Size); x+=8; if(x>120){x=0;y+=2;} j++;    }}/**********************************************//显示汉字**********************************************/void OLED_ShowCHinese(u8 x,u8 y,u8 no){     u8 t,adder=0;    OLED_Set_Pos(x,y); for(t=0;t<16;t++)    { OLED_WR_Byte(Hzk[2*no][t],OLED_DATA); adder+=1;     } OLED_Set_Pos(x,y+1); for(t=0;t<16;t++)    {     OLED_WR_Byte(Hzk[2*no+1][t],OLED_DATA); adder+=1;    }      }/**********************************************功能描述:显示显示BMP图片//x0:0~127//y0:0~63 128×64起始点坐标(x,y)**********************************************/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[j++],OLED_DATA);      }    }} /**********************************************//初始化SSD1306 **********************************************/ void OLED_Init(void){  OLED_WR_Byte(0xAE,OLED_CMD);//关闭显示        OLED_WR_Byte(0x40,OLED_CMD);//---set low column address    OLED_WR_Byte(0xB0,OLED_CMD);//---set high column address    OLED_WR_Byte(0xC8,OLED_CMD);//-not offset OLED_WR_Byte(0x81,OLED_CMD);//设置对比度    OLED_WR_Byte(0xff,OLED_CMD);    OLED_WR_Byte(0xa1,OLED_CMD);//段重定向设置    OLED_WR_Byte(0xa6,OLED_CMD);// OLED_WR_Byte(0xa8,OLED_CMD);//设置驱动路数    OLED_WR_Byte(0x1f,OLED_CMD); OLED_WR_Byte(0xd3,OLED_CMD);    OLED_WR_Byte(0x00,OLED_CMD); OLED_WR_Byte(0xd5,OLED_CMD);    OLED_WR_Byte(0xf0,OLED_CMD); OLED_WR_Byte(0xd9,OLED_CMD);    OLED_WR_Byte(0x22,OLED_CMD); OLED_WR_Byte(0xda,OLED_CMD);    OLED_WR_Byte(0x02,OLED_CMD); OLED_WR_Byte(0xdb,OLED_CMD);    OLED_WR_Byte(0x49,OLED_CMD); OLED_WR_Byte(0x8d,OLED_CMD);    OLED_WR_Byte(0x14,OLED_CMD); OLED_WR_Byte(0xaf,OLED_CMD);    OLED_Clear();}

字库文件
oledfont.h 文件
c o l o r r e d 注意:不要遗漏该文件,或者自己制作字库!!! \\color{red}{注意:不要遗漏该文件,或者自己制作字库!!!} colorred注意:不要遗漏该文件,或者自己制作字库!!!

#ifndef __OLEDFONT_H#define __OLEDFONT_H //常用ASCII表//偏移量32//ASCII字符集//偏移量32//大小:12*6/************************************6*8的点阵************************************/const unsigned char F6x8[][6] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00,// sp0x00, 0x00, 0x00, 0x2f, 0x00, 0x00,// !0x00, 0x00, 0x07, 0x00, 0x07, 0x00,// "0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14,// #0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12,// $0x00, 0x62, 0x64, 0x08, 0x13, 0x23,// %0x00, 0x36, 0x49, 0x55, 0x22, 0x50,// &0x00, 0x00, 0x05, 0x03, 0x00, 0x00,// '0x00, 0x00, 0x1c, 0x22, 0x41, 0x00,// (0x00, 0x00, 0x41, 0x22, 0x1c, 0x00,// )0x00, 0x14, 0x08, 0x3E, 0x08, 0x14,// *0x00, 0x08, 0x08, 0x3E, 0x08, 0x08,// +0x00, 0x00, 0x00, 0xA0, 0x60, 0x00,// ,0x00, 0x08, 0x08, 0x08, 0x08, 0x08,// -0x00, 0x00, 0x60, 0x60, 0x00, 0x00,// .0x00, 0x20, 0x10, 0x08, 0x04, 0x02,// /0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E,// 00x00, 0x00, 0x42, 0x7F, 0x40, 0x00,// 10x00, 0x42, 0x61, 0x51, 0x49, 0x46,// 20x00, 0x21, 0x41, 0x45, 0x4B, 0x31,// 30x00, 0x18, 0x14, 0x12, 0x7F, 0x10,// 40x00, 0x27, 0x45, 0x45, 0x45, 0x39,// 50x00, 0x3C, 0x4A, 0x49, 0x49, 0x30,// 60x00, 0x01, 0x71, 0x09, 0x05, 0x03,// 70x00, 0x36, 0x49, 0x49, 0x49, 0x36,// 80x00, 0x06, 0x49, 0x49, 0x29, 0x1E,// 90x00, 0x00, 0x36, 0x36, 0x00, 0x00,// :0x00, 0x00, 0x56, 0x36, 0x00, 0x00,// ;0x00, 0x08, 0x14, 0x22, 0x41, 0x00,// <0x00, 0x14, 0x14, 0x14, 0x14, 0x14,// =0x00, 0x00, 0x41, 0x22, 0x14, 0x08,// >0x00, 0x02, 0x01, 0x51, 0x09, 0x06,// ?0x00, 0x32, 0x49, 0x59, 0x51, 0x3E,// @0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C,// A0x00, 0x7F, 0x49, 0x49, 0x49, 0x36,// B0x00, 0x3E, 0x41, 0x41, 0x41, 0x22,// C0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C,// D0x00, 0x7F, 0x49, 0x49, 0x49, 0x41,// E0x00, 0x7F, 0x09, 0x09, 0x09, 0x01,// F0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A,// G0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F,// H0x00, 0x00, 0x41, 0x7F, 0x41, 0x00,// I0x00, 0x20, 0x40, 0x41, 0x3F, 0x01,// J0x00, 0x7F, 0x08, 0x14, 0x22, 0x41,// K0x00, 0x7F, 0x40, 0x40, 0x40, 0x40,// L0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F,// M0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F,// N0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E,// O0x00, 0x7F, 0x09, 0x09, 0x09, 0x06,// P0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E,// Q0x00, 0x7F, 0x09, 0x19, 0x29, 0x46,// R0x00, 0x46, 0x49, 0x49, 0x49, 0x31,// S0x00, 0x01, 0x01, 0x7F, 0x01, 0x01,// T0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F,// U0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F,// V0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F,// W0x00, 0x63, 0x14, 0x08, 0x14, 0x63,// X0x00, 0x07, 0x08, 0x70, 0x08, 0x07,// Y0x00, 0x61, 0x51, 0x49, 0x45, 0x43,// Z0x00, 0x00, 0x7F, 0x41, 0x41, 0x00,// [0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55,// 550x00, 0x00, 0x41, 0x41, 0x7F, 0x00,// ]0x00, 0x04, 0x02, 0x01, 0x02, 0x04,// ^0x00, 0x40, 0x40, 0x40, 0x40, 0x40,// _0x00, 0x00, 0x01, 0x02, 0x04, 0x00,// '0x00, 0x20, 0x54, 0x54, 0x54, 0x78,// a0x00, 0x7F, 0x48, 0x44, 0x44, 0x38,// b0x00, 0x38, 0x44, 0x44, 0x44, 0x20,// c0x00, 0x38, 0x44, 0x44, 0x48, 0x7F,// d0x00, 0x38, 0x54, 0x54, 0x54, 0x18,// e0x00, 0x08, 0x7E, 0x09, 0x01, 0x02,// f0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C,// g0x00, 0x7F, 0x08, 0x04, 0x04, 0x78,// h0x00, 0x00, 0x44, 0x7D, 0x40, 0x00,// i0x00, 0x40, 0x80, 0x84, 0x7D, 0x00,// j0x00, 0x7F, 0x10, 0x28, 0x44, 0x00,// k0x00, 0x00, 0x41, 0x7F, 0x40, 0x00,// l0x00, 0x7C, 0x04, 0x18, 0x04, 0x78,// m0x00, 0x7C, 0x08, 0x04, 0x04, 0x78,// n0x00, 0x38, 0x44, 0x44, 0x44, 0x38,// o0x00, 0xFC, 0x24, 0x24, 0x24, 0x18,// p0x00, 0x18, 0x24, 0x24, 0x18, 0xFC,// q0x00, 0x7C, 0x08, 0x04, 0x04, 0x08,// r0x00, 0x48, 0x54, 0x54, 0x54, 0x20,// s0x00, 0x04, 0x3F, 0x44, 0x40, 0x20,// t0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C,// u0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C,// v0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C,// w0x00, 0x44, 0x28, 0x10, 0x28, 0x44,// x0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C,// y0x00, 0x44, 0x64, 0x54, 0x4C, 0x44,// z0x14, 0x14, 0x14, 0x14, 0x14, 0x14,// horiz lines};/****************************************8*16的点阵************************************/const unsigned char F8X16[]=      {  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,// 0  0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x30,0x00,0x00,0x00,//! 1  0x00,0x10,0x0C,0x06,0x10,0x0C,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//" 2  0x40,0xC0,0x78,0x40,0xC0,0x78,0x40,0x00,0x04,0x3F,0x04,0x04,0x3F,0x04,0x04,0x00,//# 3  0x00,0x70,0x88,0xFC,0x08,0x30,0x00,0x00,0x00,0x18,0x20,0xFF,0x21,0x1E,0x00,0x00,//$ 4  0xF0,0x08,0xF0,0x00,0xE0,0x18,0x00,0x00,0x00,0x21,0x1C,0x03,0x1E,0x21,0x1E,0x00,//% 5  0x00,0xF0,0x08,0x88,0x70,0x00,0x00,0x00,0x1E,0x21,0x23,0x24,0x19,0x27,0x21,0x10,//& 6  0x10,0x16,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//' 7  0x00,0x00,0x00,0xE0,0x18,0x04,0x02,0x00,0x00,0x00,0x00,0x07,0x18,0x20,0x40,0x00,//( 8  0x00,0x02,0x04,0x18,0xE0,0x00,0x00,0x00,0x00,0x40,0x20,0x18,0x07,0x00,0x00,0x00,//) 9  0x40,0x40,0x80,0xF0,0x80,0x40,0x40,0x00,0x02,0x02,0x01,0x0F,0x01,0x02,0x02,0x00,//* 10  0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x1F,0x01,0x01,0x01,0x00,//+ 11  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xB0,0x70,0x00,0x00,0x00,0x00,0x00,//, 12  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,//- 13  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,//. 14  0x00,0x00,0x00,0x00,0x80,0x60,0x18,0x04,0x00,0x60,0x18,0x06,0x01,0x00,0x00,0x00,/// 15  0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,//0 16  0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//1 17  0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,//2 18  0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,//3 19  0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,//4 20  0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,//5 21  0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,//6 22  0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,//7 23  0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,//8 24  0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,//9 25  0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,//: 26  0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x60,0x00,0x00,0x00,0x00,//; 27  0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x00,//< 28  0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,//= 29  0x00,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x20,0x10,0x08,0x04,0x02,0x01,0x00,//> 30  0x00,0x70,0x48,0x08,0x08,0x08,0xF0,0x00,0x00,0x00,0x00,0x30,0x36,0x01,0x00,0x00,//? 31  0xC0,0x30,0xC8,0x28,0xE8,0x10,0xE0,0x00,0x07,0x18,0x27,0x24,0x23,0x14,0x0B,0x00,//@ 32  0x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00,0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20,//A 33  0x08,0xF8,0x88,0x88,0x88,0x70,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x11,0x0E,0x00,//B 34  0xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00,0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00,//C 35  0x08,0xF8,0x08,0x08,0x08,0x10,0xE0,0x00,0x20,0x3F,0x20,0x20,0x20,0x10,0x0F,0x00,//D 36  0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x20,0x23,0x20,0x18,0x00,//E 37  0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x00,0x03,0x00,0x00,0x00,//F 38  0xC0,0x30,0x08,0x08,0x08,0x38,0x00,0x00,0x07,0x18,0x20,0x20,0x22,0x1E,0x02,0x00,//G 39  0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x20,0x3F,0x21,0x01,0x01,0x21,0x3F,0x20,//H 40  0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//I 41  0x00,0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,0x00,//J 42  0x08,0xF8,0x88,0xC0,0x28,0x18,0x08,0x00,0x20,0x3F,0x20,0x01,0x26,0x38,0x20,0x00,//K 43  0x08,0xF8,0x08,0x00,0x00,0x00,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x20,0x30,0x00,//L 44  0x08,0xF8,0xF8,0x00,0xF8,0xF8,0x08,0x00,0x20,0x3F,0x00,0x3F,0x00,0x3F,0x20,0x00,//M 45  0x08,0xF8,0x30,0xC0,0x00,0x08,0xF8,0x08,0x20,0x3F,0x20,0x00,0x07,0x18,0x3F,0x00,//N 46  0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x10,0x20,0x20,0x20,0x10,0x0F,0x00,//O 47  0x08,0xF8,0x08,0x08,0x08,0x08,0xF0,0x00,0x20,0x3F,0x21,0x01,0x01,0x01,0x00,0x00,//P 48  0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x18,0x24,0x24,0x38,0x50,0x4F,0x00,//Q 49  0x08,0xF8,0x88,0x88,0x88,0x88,0x70,0x00,0x20,0x3F,0x20,0x00,0x03,0x0C,0x30,0x20,//R 50  0x00,0x70,0x88,0x08,0x08,0x08,0x38,0x00,0x00,0x38,0x20,0x21,0x21,0x22,0x1C,0x00,//S 51  0x18,0x08,0x08,0xF8,0x08,0x08,0x18,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,//T 52  0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,//U 53  0x08,0x78,0x88,0x00,0x00,0xC8,0x38,0x08,0x00,0x00,0x07,0x38,0x0E,0x01,0x00,0x00,//V 54  0xF8,0x08,0x00,0xF8,0x00,0x08,0xF8,0x00,0x03,0x3C,0x07,0x00,0x07,0x3C,0x03,0x00,//W 55  0x08,0x18,0x68,0x80,0x80,0x68,0x18,0x08,0x20,0x30,0x2C,0x03,0x03,0x2C,0x30,0x20,//X 56  0x08,0x38,0xC8,0x00,0xC8,0x38,0x08,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,//Y 57  0x10,0x08,0x08,0x08,0xC8,0x38,0x08,0x00,0x20,0x38,0x26,0x21,0x20,0x20,0x18,0x00,//Z 58  0x00,0x00,0x00,0xFE,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x7F,0x40,0x40,0x40,0x00,//[ 59  0x00,0x0C,0x30,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x06,0x38,0xC0,0x00,//\ 60  0x00,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x7F,0x00,0x00,0x00,//] 61  0x00,0x00,0x04,0x02,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//^ 62  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,//_ 63  0x00,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//` 64  0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x19,0x24,0x22,0x22,0x22,0x3F,0x20,//a 65  0x08,0xF8,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x3F,0x11,0x20,0x20,0x11,0x0E,0x00,//b 66  0x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x00,0x0E,0x11,0x20,0x20,0x20,0x11,0x00,//c 67  0x00,0x00,0x00,0x80,0x80,0x88,0xF8,0x00,0x00,0x0E,0x11,0x20,0x20,0x10,0x3F,0x20,//d 68  0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x22,0x22,0x22,0x22,0x13,0x00,//e 69  0x00,0x80,0x80,0xF0,0x88,0x88,0x88,0x18,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//f 70  0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x6B,0x94,0x94,0x94,0x93,0x60,0x00,//g 71  0x08,0xF8,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,//h 72  0x00,0x80,0x98,0x98,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//i 73  0x00,0x00,0x00,0x80,0x98,0x98,0x00,0x00,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,//j 74  0x08,0xF8,0x00,0x00,0x80,0x80,0x80,0x00,0x20,0x3F,0x24,0x02,0x2D,0x30,0x20,0x00,//k 75  0x00,0x08,0x08,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//l 76  0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x20,0x3F,0x20,0x00,0x3F,0x20,0x00,0x3F,//m 77  0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,//n 78  0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,//o 79  0x80,0x80,0x00,0x80,0x80,0x00,0x00,0x00,0x80,0xFF,0xA1,0x20,0x20,0x11,0x0E,0x00,//p 80  0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x0E,0x11,0x20,0x20,0xA0,0xFF,0x80,//q 81  0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x20,0x20,0x3F,0x21,0x20,0x00,0x01,0x00,//r 82  0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x33,0x24,0x24,0x24,0x24,0x19,0x00,//s 83  0x00,0x80,0x80,0xE0,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x1F,0x20,0x20,0x00,0x00,//t 84  0x80,0x80,0x00,0x00,0x00,0x80,0x80,0x00,0x00,0x1F,0x20,0x20,0x20,0x10,0x3F,0x20,//u 85  0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x00,0x01,0x0E,0x30,0x08,0x06,0x01,0x00,//v 86  0x80,0x80,0x00,0x80,0x00,0x80,0x80,0x80,0x0F,0x30,0x0C,0x03,0x0C,0x30,0x0F,0x00,//w 87  0x00,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x31,0x2E,0x0E,0x31,0x20,0x00,//x 88  0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x80,0x81,0x8E,0x70,0x18,0x06,0x01,0x00,//y 89  0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x21,0x30,0x2C,0x22,0x21,0x30,0x00,//z 90  0x00,0x00,0x00,0x00,0x80,0x7C,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x3F,0x40,0x40,//{ 91  0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,//| 92  0x00,0x02,0x02,0x7C,0x80,0x00,0x00,0x00,0x00,0x40,0x40,0x3F,0x00,0x00,0x00,0x00,//} 93  0x00,0x06,0x01,0x01,0x02,0x02,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//~ 94};char Hzk[][32]={{0x00,0x00,0xF0,0x10,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x10,0xF0,0x00,0x00,0x00},{0x00,0x00,0x0F,0x04,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x0F,0x00,0x00,0x00},/*"中",0*/{0x40,0x40,0x40,0x5F,0x55,0x55,0x55,0x75,0x55,0x55,0x55,0x5F,0x40,0x40,0x40,0x00},{0x00,0x40,0x20,0x0F,0x09,0x49,0x89,0x79,0x09,0x09,0x09,0x0F,0x20,0x40,0x00,0x00},/*"景",1*/{0x00,0xFE,0x02,0x42,0x4A,0xCA,0x4A,0x4A,0xCA,0x4A,0x4A,0x42,0x02,0xFE,0x00,0x00},{0x00,0xFF,0x40,0x50,0x4C,0x43,0x40,0x40,0x4F,0x50,0x50,0x5C,0x40,0xFF,0x00,0x00},/*"园",2*/{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},/*"电",3*/{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},/*"子",4*/{0x24,0x24,0xA4,0xFE,0xA3,0x22,0x00,0x22,0xCC,0x00,0x00,0xFF,0x00,0x00,0x00,0x00},{0x08,0x06,0x01,0xFF,0x00,0x01,0x04,0x04,0x04,0x04,0x04,0xFF,0x02,0x02,0x02,0x00},/*"科",5*/{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},/*"?",0*/{0x40,0x40,0x48,0x48,0x48,0xC8,0x78,0x4F,0x48,0x48,0x48,0x48,0x48,0x40,0x40,0x00},{0x00,0x00,0x00,0x00,0x03,0x12,0x12,0x22,0x22,0x52,0x8A,0x06,0x00,0x00,0x00,0x00},/*"专",0*/{0x00,0x10,0x60,0x80,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0xC0,0x30,0x00,0x00},{0x40,0x40,0x40,0x43,0x40,0x7F,0x40,0x40,0x40,0x7F,0x42,0x41,0x40,0x40,0x40,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,0xFE,0x22,0x22,0x22,0xFE,0x00,0xFE,0x82,0x82,0x92,0xA2,0x9E,0x00,0x00},{0x80,0x60,0x1F,0x02,0x42,0x82,0x7F,0x00,0xFF,0x40,0x2F,0x10,0x2C,0x43,0x80,0x00},/*"服",4*/{0x00,0x00,0x90,0x88,0x4C,0x57,0xA4,0x24,0x54,0x54,0x8C,0x84,0x00,0x00,0x00,0x00},{0x01,0x01,0x80,0x42,0x22,0x1A,0x07,0x02,0x42,0x82,0x42,0x3E,0x01,0x01,0x01,0x00},/*"务",5*/{0x00,0x04,0xE4,0x24,0x2C,0xB4,0x25,0x26,0x24,0xB4,0x2C,0x24,0xE4,0x04,0x00,0x00},{0x00,0x00,0xFF,0x02,0x01,0x1E,0x12,0x12,0x12,0x1E,0x41,0x82,0x7F,0x00,0x00,0x00},/*"商",6*/};#endif

主函数 main.c

#include "gd32f4xx.h"#include "systick.h"#include #include "gpio.h"#include "uart.h"#include "iic.h"#include "oled.h"#include "bmp.h"int main(void){    systick_config();    //配置系统时钟 GPIO_Init();    USART_Init();    IIC_Init();    OLED_Init();    while(1)     { gpio_bit_toggle(GPIOC, GPIO_PIN_6);    //反转PC6 delay_1ms(200);  USART_TransmitString("这是一个串口测试\r\n");  printf("串口重定向测试\r\n");  OLED_Clear(); OLED_Clear(); OLED_ShowString(0,0,"Stark",16); OLED_ShowString(0,2,"Stark-RISCV",16); delay_1ms(500); OLED_Clear();    }}

硬件软件的驱动方式都有,具体内容详看代码部分,软件和硬件IIC的选择在 oled.h 文件中配置,

#define S_I2C     1//1:软件IIC模式    0:硬件IIC模式

显示效果

【GD32F427开发板试用】06-硬件I2C&软件I2C驱动0.91OLED