显示STM32F407霸天虎HAL库:I2C驱动OLED显示学习笔记

STM32F407霸天虎HAL库学习笔记——通过I2C驱动OLED

  • I2C知识概述
  • 一、软件准备
  • 二、硬件准备
  • 三、CubeMX配置
  • 四、Keil
  • oled.h
  • oled.c
  • font.h
  • main.c
  • I2C知识概述

    本次实验是使用I2C驱动0.9寸OLED屏幕,这里补充一下I2C通信的一些基础知识,先看一下物理层面上,I2C使用了两条总线SCL(串行时钟线)SDA(串行数据线)来进行通信,且I2C有三种传输模式:标准传输模式(100kbit/s)快速传输模式(400kbit/s)高速传输模式(3.4M/s),但是多数设备不支持高速传输模式,本次我使用到了快速传输模式。

    在上面的图中可以看出在一个 I2C 通讯总线中,可连接多个 I2C 通讯设备,支持多个通讯主机及多个通讯从机。

    起始信号与停止信号,当 SCL 线是高电平时 SDA线从高电平向低电平切换,这个情况表示通讯的起始。当 SCL 是高电平时 SDA 线由低电平向高电平切换,表示通讯的停止。

    SDA 数据线在SCL 的每个时钟周期传输一位数据。传输时,SCL 为高电平的时候 SDA 表示的数据有效,即此时的 SDA 为高电平时表示数据“1”,为低电平时表示数据“0”。当 SCL 为低电平时,SDA 的数
    据无效,一般在这个时候 SDA 进行电平切换,为下一次表示数据做好准备。

    I2C分有软件模拟I2C和硬件I2C:

    软件模拟I2C:软件IIC通信指的是用单片机的两个I/O端口模拟出来的IIC,用软件控制管脚状态以模拟I2C通信波形,软件模拟寄存器的工作方式。
    硬件I2C:一块硬件电路,硬件I2C对应芯片上的I2C外设,有相应I2C驱动电路,其所使用的I2C管脚也是专用的,硬件I2C是直接调用内部寄存器。

    所以选择硬件I2C效率更高,本次实验用的是硬件I2C

    一、软件准备

    软件准备

    二、硬件准备

    STM32F407霸天虎
    DAP高速下载器
    USB转串口线
    0.9寸OLED屏幕

    三、CubeMX配置

    STM32F407霸天虎用的是STM32F407ZGT6

    选择外部高速时钟


    I2C选择I2C1,将OLED屏幕的SDA、SCL通过杜邦线连接到开发板对应的I2C引脚上

    时钟树选择168MHz,具体配置方法见上篇的时钟树配置

    而后根据自己的喜好编辑工程的名称,存放位置,IDE选择ARM-MDKV5

    四、Keil

    由于我们的Debug用的是DAP,如图下选择Debug和下载配置

    接下来在工程列表里新建一个工程文件夹,以及新建OLED.c文件、OLED.h和font.h文件,并将oled.c文件添加进工程文件夹中。

    oled.h

    #ifndef __OLED_H
    #define __OLED_H
    
    #include "main.h"
    
    //根据I2C所在引脚进行宏定义,方便后续操作
    #define   GPIOx_OLED_PORT               GPIOB
    #define   OLED_SCK_PIN                  GPIO_PIN_6
    #define   OLED_SCK_ON()                 HAL_GPIO_WritePin(GPIOx_OLED_PORT, OLED_SCK_PIN, GPIO_PIN_SET)
    #define   OLED_SCK_OFF()                HAL_GPIO_WritePin(GPIOx_OLED_PORT, OLED_SCK_PIN, GPIO_PIN_RESET)
    #define   OLED_SCK_TOGGLE()             HAL_GPIO_TogglePin(GPIOx_OLED_PORT, OLED_SCK_PIN)
    #define   OLED_SDA_PIN                  GPIO_PIN_7
    #define   OLED_SDA_ON()                 HAL_GPIO_WritePin(GPIOx_OLED_PORT, OLED_SDA_PIN, GPIO_PIN_SET)
    #define   OLED_SDA_OFF()                HAL_GPIO_WritePin(GPIOx_OLED_PORT, OLED_SDA_PIN, GPIO_PIN_RESET)
    #define   OLED_SDA_TOGGLE()             HAL_GPIO_TogglePin(GPIOx_OLED_PORT, OLED_SDA_PIN)
    ///
    
    void WriteCmd(void);
    void OLED_WR_CMD(uint8_t cmd);
    void OLED_WR_DATA(uint8_t data);
    void OLED_Init(void);
    void OLED_Clear(void);
    void OLED_Display_On(void);
    void OLED_Display_Off(void);
    void OLED_Set_Pos(uint8_t x, uint8_t y);
    void OLED_On(void);
    void OLED_ShowNum(uint8_t x,uint8_t y,unsigned int num,uint8_t len,uint8_t size2);
    void OLED_ShowChar(uint8_t x,uint8_t y,uint8_t chr,uint8_t Char_Size);
    void OLED_ShowString(uint8_t x,uint8_t y,uint8_t *chr,uint8_t Char_Size);
    void OLED_ShowCHinese(uint8_t x,uint8_t y,uint8_t no);
    
    
    #endif
    
    

    oled.c

    #include "oled.h"
    #include "font.h"    
    #include "i2c.h"
    
    uint8_t CMD_Data[]={
    0xAE, 0x00, 0x10, 0x40, 0xB0, 0x81, 0xFF, 0xA1, 0xA6, 0xA8, 0x3F,
    					
    0xC8, 0xD3, 0x00, 0xD5, 0x80, 0xD8, 0x05, 0xD9, 0xF1, 0xDA, 0x12,
    					
    0xD8, 0x30, 0x8D, 0x14, 0xAF};      //初始化命令
    //显示浮点数
    //x,y :起点坐标
    //num:数值	 
    //a:整数的位数
    //b:小数的位数
    //size:字体大小
    void OLED_SHowfloat(uint8_t x,uint8_t y,float num,uint8_t a,uint8_t b,uint8_t size)
    {
        if(num<0)
        {
            OLED_ShowChar(x,y,'-',size);
            x+=size/2;
            num=-num;
            
        OLED_ShowNum(x,y,num,a,16);
        OLED_ShowChar(x+a*(size/2),y,'.',16);
        for(int i=1;i<=b;i++)
            {
                OLED_ShowNum(x+(a+i)*(size/2),y,(uint16_t)(num*10)%10,1,size);
                num*=10;
            }
        }
        
        else
        {
        OLED_ShowNum(x,y,num,a,16);
        OLED_ShowChar(x+a*(size/2),y,'.',16);
        for(int i=1;i<=b;i++)
            {
                OLED_ShowNum(x+(a+i)*(size/2),y,(uint16_t)(num*10)%10,1,size);
                num*=10;
            }
        }
    }
    //通过I2C写入命令    
    void WriteCmd(void)
    {
    	uint8_t i = 0;
    	for(i=0; i<27; i++)
    	{
    		HAL_I2C_Mem_Write(&hi2c1 ,0x78,0x00,I2C_MEMADD_SIZE_8BIT,CMD_Data+i,1,0x100);
    	}
    }
    //向设备写控制命令
    void OLED_WR_CMD(uint8_t cmd)
    {
    	HAL_I2C_Mem_Write(&hi2c1 ,0x78,0x00,I2C_MEMADD_SIZE_8BIT,&cmd,1,0x100);    
    }
    //向设备写数据
    void OLED_WR_DATA(uint8_t data)
    {
    	HAL_I2C_Mem_Write(&hi2c1 ,0x78,0x40,I2C_MEMADD_SIZE_8BIT,&data,1,0x100);
    }
    //初始化oled屏幕
    void OLED_Init(void)
    { 	
    	HAL_Delay(200);
     
    	WriteCmd();
    }
    //清屏
    void OLED_Clear(void)
    {
    	uint8_t i,n;		    
    	for(i=0;i<8;i++)  
    	{  
    		OLED_WR_CMD(0xb0+i);
    		OLED_WR_CMD (0x00); 
    		OLED_WR_CMD (0x10); 
    		for(n=0;n<128;n++)
    			OLED_WR_DATA(0);
    	} 
    }
    //开启OLED显示    
    void OLED_Display_On(void)
    {
    	OLED_WR_CMD(0X8D);  //SET DCDC命令
    	OLED_WR_CMD(0X14);  //DCDC ON
    	OLED_WR_CMD(0XAF);  //DISPLAY ON
    }
    //关闭OLED显示     
    void OLED_Display_Off(void)
    {
    	OLED_WR_CMD(0X8D);  //SET DCDC命令
    	OLED_WR_CMD(0X10);  //DCDC OFF
    	OLED_WR_CMD(0XAE);  //DISPLAY OFF
    }		   			 
    void OLED_Set_Pos(uint8_t x, uint8_t y) 
    { 	
    	OLED_WR_CMD(0xb0+y);
    	OLED_WR_CMD(((x&0xf0)>>4)|0x10);
    	OLED_WR_CMD(x&0x0f);
    } 
     
    void OLED_On(void)  
    {  
    	uint8_t i,n;		    
    	for(i=0;i<8;i++)  
    	{  
    		OLED_WR_CMD(0xb0+i);    //设置页地址(0~7)
    		OLED_WR_CMD(0x00);      //设置显示位置—列低地址
    		OLED_WR_CMD(0x10);      //设置显示位置—列高地址   
    		for(n=0;n<128;n++)
    			OLED_WR_DATA(1); 
    	} //更新显示
    }
    unsigned int oled_pow(uint8_t m,uint8_t n)
    {
    	unsigned int result=1;	 
    	while(n--)result*=m;    
    	return result;
    }
    //显示2个数字
    //x,y :起点坐标	 
    //len :数字的位数
    //size:字体大小
    //mode:模式	0,填充模式;1,叠加模式
    //num:数值(0~4294967295);	 		  
    void OLED_ShowNum(uint8_t x,uint8_t y,unsigned int 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); 
    	}
    } 
    //在指定位置显示一个字符,包括部分字符
    //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>128-1){x=0;y=y+2;}
    		if(Char_Size ==16)
    			{
    			OLED_Set_Pos(x,y);	
    			for(i=0;i<8;i++)
    			OLED_WR_DATA(F8X16[c*16+i]);
    			OLED_Set_Pos(x,y+1);
    			for(i=0;i<8;i++)
    			OLED_WR_DATA(F8X16[c*16+i+8]);
    			}
    			else {	
    				OLED_Set_Pos(x,y);
    				for(i=0;i<6;i++)
    				OLED_WR_DATA(F6x8[c][i]);
    				
    			}
    }
     
    //显示一个字符号串
    void OLED_ShowString(uint8_t x,uint8_t y,uint8_t *chr,uint8_t 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++;
    	}
    }
    //显示汉字
    //hzk 用取模软件得出的数组
    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_DATA(Hzk[2*no][t]);
    				adder+=1;
         }	
    		OLED_Set_Pos(x,y+1);	
        for(t=0;t<16;t++)
    			{	
    				OLED_WR_DATA(Hzk[2*no+1][t]);
    				adder+=1;
          }					
    }
    
    

    通过取字模软件生成字模,设置如下


    接下来就可以编写font.h了

    font.h

    #ifndef __FONT_H
    #define __FONT_H
     
    #include "stm32f4xx_hal.h"
    
    //8*6 ASCII字符集点阵
    const unsigned char F6x8[][6] =		
    {
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00,// sp
    	0x00, 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,// 0
    	0x00, 0x00, 0x42, 0x7F, 0x40, 0x00,// 1
    	0x00, 0x42, 0x61, 0x51, 0x49, 0x46,// 2
    	0x00, 0x21, 0x41, 0x45, 0x4B, 0x31,// 3
    	0x00, 0x18, 0x14, 0x12, 0x7F, 0x10,// 4
    	0x00, 0x27, 0x45, 0x45, 0x45, 0x39,// 5
    	0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30,// 6
    	0x00, 0x01, 0x71, 0x09, 0x05, 0x03,// 7
    	0x00, 0x36, 0x49, 0x49, 0x49, 0x36,// 8
    	0x00, 0x06, 0x49, 0x49, 0x29, 0x1E,// 9
    	0x00, 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,// A
    	0x00, 0x7F, 0x49, 0x49, 0x49, 0x36,// B
    	0x00, 0x3E, 0x41, 0x41, 0x41, 0x22,// C
    	0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C,// D
    	0x00, 0x7F, 0x49, 0x49, 0x49, 0x41,// E
    	0x00, 0x7F, 0x09, 0x09, 0x09, 0x01,// F
    	0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A,// G
    	0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F,// H
    	0x00, 0x00, 0x41, 0x7F, 0x41, 0x00,// I
    	0x00, 0x20, 0x40, 0x41, 0x3F, 0x01,// J
    	0x00, 0x7F, 0x08, 0x14, 0x22, 0x41,// K
    	0x00, 0x7F, 0x40, 0x40, 0x40, 0x40,// L
    	0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F,// M
    	0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F,// N
    	0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E,// O
    	0x00, 0x7F, 0x09, 0x09, 0x09, 0x06,// P
    	0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E,// Q
    	0x00, 0x7F, 0x09, 0x19, 0x29, 0x46,// R
    	0x00, 0x46, 0x49, 0x49, 0x49, 0x31,// S
    	0x00, 0x01, 0x01, 0x7F, 0x01, 0x01,// T
    	0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F,// U
    	0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F,// V
    	0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F,// W
    	0x00, 0x63, 0x14, 0x08, 0x14, 0x63,// X
    	0x00, 0x07, 0x08, 0x70, 0x08, 0x07,// Y
    	0x00, 0x61, 0x51, 0x49, 0x45, 0x43,// Z
    	0x00, 0x00, 0x7F, 0x41, 0x41, 0x00,// [
    	0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55,// 55
    	0x00, 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,// a
    	0x00, 0x7F, 0x48, 0x44, 0x44, 0x38,// b
    	0x00, 0x38, 0x44, 0x44, 0x44, 0x20,// c
    	0x00, 0x38, 0x44, 0x44, 0x48, 0x7F,// d
    	0x00, 0x38, 0x54, 0x54, 0x54, 0x18,// e
    	0x00, 0x08, 0x7E, 0x09, 0x01, 0x02,// f
    	0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C,// g
    	0x00, 0x7F, 0x08, 0x04, 0x04, 0x78,// h
    	0x00, 0x00, 0x44, 0x7D, 0x40, 0x00,// i
    	0x00, 0x40, 0x80, 0x84, 0x7D, 0x00,// j
    	0x00, 0x7F, 0x10, 0x28, 0x44, 0x00,// k
    	0x00, 0x00, 0x41, 0x7F, 0x40, 0x00,// l
    	0x00, 0x7C, 0x04, 0x18, 0x04, 0x78,// m
    	0x00, 0x7C, 0x08, 0x04, 0x04, 0x78,// n
    	0x00, 0x38, 0x44, 0x44, 0x44, 0x38,// o
    	0x00, 0xFC, 0x24, 0x24, 0x24, 0x18,// p
    	0x00, 0x18, 0x24, 0x24, 0x18, 0xFC,// q
    	0x00, 0x7C, 0x08, 0x04, 0x04, 0x08,// r
    	0x00, 0x48, 0x54, 0x54, 0x54, 0x20,// s
    	0x00, 0x04, 0x3F, 0x44, 0x40, 0x20,// t
    	0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C,// u
    	0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C,// v
    	0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C,// w
    	0x00, 0x44, 0x28, 0x10, 0x28, 0x44,// x
    	0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C,// y
    	0x00, 0x44, 0x64, 0x54, 0x4C, 0x44,// z
    	0x14, 0x14, 0x14, 0x14, 0x14, 0x14,// horiz lines
    };
    
    //16*8 ASCII字符集点阵
    const unsigned char F8X16[]=
    {
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//sp /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,0x02,0x02,0x7C,0x80,0x00,0x00,0x00,0x00,0x40,0x40,0x3F,0x00,0x00,0x00,0x00,//}  /92
     0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00};//|  /93
    
    //部分汉字
    const unsigned char Hzk[][32]=
    {
     // 物(0) 联(1) 网(2) 小(3) 白(4)
    
    {0x40,0x3C,0x10,0xFF,0x10,0x10,0x20,0x10,0x8F,0x78,0x08,0xF8,0x08,0xF8,0x00,0x00},
    {0x02,0x06,0x02,0xFF,0x01,0x01,0x04,0x42,0x21,0x18,0x46,0x81,0x40,0x3F,0x00,0x00},/*"物",0*/
    /* (16 X 16 , 宋体 )*/
    
    {0x02,0xFE,0x92,0x92,0xFE,0x02,0x00,0x10,0x11,0x16,0xF0,0x14,0x13,0x10,0x00,0x00},
    {0x10,0x1F,0x08,0x08,0xFF,0x04,0x81,0x41,0x31,0x0D,0x03,0x0D,0x31,0x41,0x81,0x00},/*"联",1*/
    /* (16 X 16 , 宋体 )*/
    
    {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},/*"网",2*/
    /* (16 X 16 , 宋体 )*/
    
    {0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x20,0x40,0x80,0x00,0x00},
    {0x08,0x04,0x03,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,0x01,0x0E,0x00},/*"小",3*/
    /* (16 X 16 , 宋体 )*/
    
    {0x00,0x00,0xF8,0x08,0x08,0x0C,0x0A,0x09,0x08,0x08,0x08,0x08,0xF8,0x00,0x00,0x00},
    {0x00,0x00,0xFF,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0xFF,0x00,0x00,0x00},/*"白",4*/
    /* (16 X 16 , 宋体 )*/
    
    
    
    };
    
    #endif
    
    

    上述驱动软件完成后,在main.c里调用一下相关函数就可以在OLED上输出想要的字符了。

    main.c

    这里是我的main函数

    int main(void)
    {
      /* USER CODE BEGIN 1 */
    
      /* USER CODE END 1 */
    
      /* MCU Configuration--------------------------------------------------------*/
    
      /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
      HAL_Init();
    
      /* USER CODE BEGIN Init */
    
      /* USER CODE END Init */
    
      /* Configure the system clock */
      SystemClock_Config();
    
      /* USER CODE BEGIN SysInit */
    
      /* USER CODE END SysInit */
    
      /* Initialize all configured peripherals */
      MX_GPIO_Init();
      MX_I2C1_Init();
      MX_USART1_UART_Init();
      /* USER CODE BEGIN 2 */
    	OLED_Init();
      OLED_Clear();
      /* USER CODE END 2 */
    
      /* Infinite loop */
      /* USER CODE BEGIN WHILE */
      while (1)
      {
        /* USER CODE END WHILE */
    		OLED_ShowString(0,0,"Hello",8);
    		OLED_ShowCHinese(0,2,0);  //物
    		OLED_ShowCHinese(16,2,1);	//联
    		OLED_ShowCHinese(32,2,2);	//网
    		OLED_ShowCHinese(48,2,3);	//小
    		OLED_ShowCHinese(64,2,4);	//白
    		OLED_ShowString(80,2,"Jayce",16);
        /* USER CODE BEGIN 3 */
      }
      /* USER CODE END 3 */
    }
    
    

    最后编译下载,实验结果如下:
    请添加图片描述
    作者能力有限,有出错的地方希望大家指出纠正,谢谢!

    物联沃分享整理
    物联沃-IOTWORD物联网 » 显示STM32F407霸天虎HAL库:I2C驱动OLED显示学习笔记

    发表评论