使用U8G库实现基于I2C协议的OLED显示【STM32】

【stm32】基于I2C协议的OLED显示(利用U82G库)

  • 一、实验目的
  • 二、探究任务
  • 三、原理探究
  • 3.1 I2C接口
  • 3.1.1 概述
  • 3.1.2 主要特点
  • 3.1.3 功能描述
  • 3.1.4 从模式
  • 3.1.5 主模式
  • 3.1.6 时序协议
  • 3.2 OLED屏
  • 3.2.1 工作原理
  • 3.2.2 汉字点阵显示原理
  • 3.2.3 汉字点阵取模
  • 四、探究过程
  • 4.1 实验一
  • 4.1.1 编写移植函数
  • 4.1.2 关键代码
  • main函数
  • test.h
  • test.c
  • 4.1.3 效果演示
  • 五、探究总结
  • 一、实验目的

    1、了解I2C协议的基本原理和时序协议;

    2、掌握0.96寸OLED屏的工作原理,汉字点阵显示原理;

    3、掌握开源GUI库U82G在stm32上的移植编译方法,以及图形界面可视化技术。

    二、探究任务

    1、利用stm32f103的GPIO管脚、VCC和GND连接 OLED屏的I2C接口,采用cubemx设计一个HAL库程序框架,然后下载U82G源码,针对stm32f103和 0.96寸的I2C接口OLED屏,进行代码裁剪,然后移植到HAL程序程序中,完成OLED的各种显示,包括:

    1)U82G的demo例程;
    2)显示你自己的学号和名字(或网名昵称);
    3)掌握上下、左右滑动显示方法;
    4)显示一个图案(比如你的头像肖像),最好有动态效果。
    
    1. 如果使用Keil的虚拟逻辑分析仪去采集 I2C 引脚SDA的波形,是什么样子的? 如果无法采集到真实的I2C协议,你觉得可改用什么方法?

    三、原理探究

    3.1 I2C接口

    3.1.1 概述

    I2C总线是一种多主机总线,连接在 I2C总线上的器件分为主机从机

    I2C 总线接口连接微控制器和串行 I2C 总线。它提供多主机功能,控制所有 I2C 总线特定的时序、协议、仲裁和定时。支持标准和快速两种模式,同时与 SMBus 2.0 兼容。

    I2C 接口接收和发送数据,并将数据从串行转换成并行,或并行转换成串行。可以开启或禁止中断。接口通过数据引脚(SDA)和时钟引脚(SCL)连接到 I2C 总线。允许连接到标准(高至 100 kHz)或快速(高至 400 kHz)I2C 总线。

    3.1.2 主要特点

    ● 多主机功能:同一接口既可做主设备也可做从设备

    ●I2C 主设备功能
    − 产生时钟
    − 产生起始和停止信号

    ● I2C 从设备功能
    − 可编程的 I2C 地址检测
    − 可响应 2 个从地址的双地址能力
    − 停止位检测

    ● 状态标志:
    − 发送器/接收器模式标志
    − 字节发送结束标志
    − I2C 总线忙标志

    ●2 个中断向量
    − 1 个中断用于地址/数据通讯成功
    − 1 个中断用于出错

    ● 可选的拉长时钟功能

    ● 具单字节缓冲器的 DMA

    ● 可配置的 PEC(信息包错误检测)的产生或校验:
    − 发送模式中 PEC 值可以作为最后一个字节传输
    − 用于最后一个接收字节的 PEC 错误校验

    3.1.3 功能描述

    接口可以下述 4 种模式中的一种运行:
    ● 从发送器模式
    ● 从接收器模式
    ● 主发送器模式
    ● 主接收器模式

    默认情况下,I2C 接口总是工作在从模式。从默认的从模式切换到主模式,需要产生一个起始条件。

    3.1.4 从模式




    3.1.5 主模式



    3.1.6 时序协议

    当处于从模式时,I2C的从发送器和从接收器的传送序列图如下。


    当处于主模式时,I2C的主发送器和主接收器的传送序列图如下。

    3.2 OLED屏

    本次实验使用的是0.96寸OLED(有机发光二极管, Organic Light Emitting Diode )屏幕,型号为SSD1306(四针)。

    主要引脚为GND(接地)、VCC(电源)。

    3.2.1 工作原理

    SSD1306用到了图像显示RAM(GDDRAM)。
    GDDRAM位映射静态RAM,大小为 128×64位。

    GDDRAM分为8页(PAGE0~PAGE7),每页内 1个SEG对应1Byte数据,一页由 128 Byte 组成。一帧显示数据为1024Byte(1KB)。即屏幕每8行像素点(8PIXEL)记为一页(PAGE),64行即为8页,则屏幕变为128列(ROW)8页(PAGE),若要显示整个屏幕,则需要1288个1字节数。

    3.2.2 汉字点阵显示原理

    取字模的原理很简单,以“我”为例。

    一行有16个像素,第一行左8个为P0-P7,右8个为P20-P27(+20H)。
    点阵扫描一般从右往左扫完一行,然后再从下一行的最右边向左扫描。

    因此,它扫描取得的十六进制数也是如此,从右往左,它先扫描到0000(十进制0),再扫描到0010(十进制2),因此其十六进制数为0x02。

    同理,左8位先扫到0110(十进制6),再扫到0000(十进制0),对应十六进制数0x60。

    取得"我"的字模为:
    0x02,0x60,0x0A,0x1C,0x12,0x10,0x12,0x10,
    0x02,0x10,0x7F,0xFF,0x02,0x10,0x12,0x10,
    0x14,0x70,0x0C,0x1C,0x04,0x13,0x0A,0x10,
    0x49,0x90,0x50,0x10,0x60,0x14,0x40,0x08

    3.2.3 汉字点阵取模

    从左往右阴极,从上往下阳极
    我们的显示屏分辨率为128*64。

    在UCDOS中文宋体字库中,每一个字由16行16列的点阵组成显示,即国标汉字库中的每一个字均由256点阵来表示。

    因此,对于SSD1306,每行最多可以输入8个汉字,整块屏幕最多只能使用4行。

    汉字是由多个像素组成的一个字块。因此我们需要用到取字模软件,本次实验使用的是PCtoLCD2002完美版。

    链接: https://pan.baidu.com/s/1542q14FRzCawo8WNp8J-Kg
    提取码: jdzg

    源自
    博客

    四、探究过程

    4.1 实验一

    1)U82G的demo例程;
    2)显示你自己的学号和名字(或网名昵称);
    3)掌握上下、左右滑动显示方法;
    4)显示一个图案(比如你的头像肖像),最好有动态效果。
    

    4.1.1 编写移植函数

    下载u8g2包,然后将其放在生成的工程文件夹下。
    后续可以参考博客
    https://blog.csdn.net/black_sneak/article/details/126312657

    4.1.2 关键代码

    main函数

      while (1)
      {
    		u8g2_FirstPage(&u8g2);
        do
        {
    			draw(&u8g2);
    			u8g2DrawTest(&u8g2);
        } while (u8g2_NextPage(&u8g2));
        /* USER CODE END WHILE */
    
        /* USER CODE BEGIN 3 */
      }
    

    test.h

    #ifndef __TEST_H
    #define __TEST_H

    #include “main.h”
    #include “u8g2.h”

    void testDrawProcess(u8g2_t *u8g2);
    void testShowFont(u8g2_t *u8g2);
    void testDrawFrame(u8g2_t *u8g2);
    void testDrawRBox(u8g2_t *u8g2);
    void testDrawCircle(u8g2_t *u8g2);
    void testDrawFilledEllipse(u8g2_t *u8g2);
    void testDrawMulti(u8g2_t *u8g2);
    void testDrawXBM(u8g2_t *u8g2);

    void u8g2DrawTest(u8g2_t *u8g2);

    #endif

    test.c

    #include "test.h"
    
    //---------------U8g2测试函数
    
    #define SEND_BUFFER_DISPLAY_MS(u8g2, ms)\
      do {\
        u8g2_SendBuffer(u8g2); \
        HAL_Delay(ms);\
      }while(0);
    
    
    //进度条显示
    void testDrawProcess(u8g2_t *u8g2)
    {
    	for(int i=10;i<=80;i=i+2)
    	{
    		u8g2_ClearBuffer(u8g2); 
    			
    		char buff[20];
    		sprintf(buff,"%d%%",(int)(i/80.0*100));
    		
    		u8g2_SetFont(u8g2,u8g2_font_ncenB12_tf);
    		u8g2_DrawStr(u8g2,16,32,"STM32 U8g2");//字符显示
    		
    		u8g2_SetFont(u8g2,u8g2_font_ncenB08_tf);
    		u8g2_DrawStr(u8g2,100,49,buff);//当前进度显示
    		
    		u8g2_DrawRBox(u8g2,16,40,i,10,4);//圆角填充框矩形框
    		u8g2_DrawRFrame(u8g2,16,40,80,10,4);//圆角矩形
    		
    		u8g2_SendBuffer(u8g2);
    	}
    	HAL_Delay(500);
    }
    
    
    //字体测试 数字英文可选用 u8g2_font_ncenB..(粗) 系列字体
    //u8g2_font_unifont_t_symbols/u8g2_font_unifont_h_symbols(细 圆润)
    void testShowFont(u8g2_t *u8g2)
    {
    	int t = 1000;
    	char testStr[14] = "STM32F103C8T6";
    	
    	u8g2_ClearBuffer(u8g2);
    	
    	u8g2_SetFont(u8g2,u8g2_font_u8glib_4_tf);
    	u8g2_DrawStr(u8g2,0,5,testStr);
    	SEND_BUFFER_DISPLAY_MS(u8g2,t);
    	
    	u8g2_SetFont(u8g2,u8g2_font_ncenB08_tf);
    	u8g2_DrawStr(u8g2,0,30,testStr);
    	SEND_BUFFER_DISPLAY_MS(u8g2,t);
    	
        u8g2_SetFont(u8g2,u8g2_font_ncenB10_tr);
    	u8g2_DrawStr(u8g2,0,60,testStr);
    	SEND_BUFFER_DISPLAY_MS(u8g2,t);
    }
    
    //画空心矩形
    void testDrawFrame(u8g2_t *u8g2)
    {
    	int t = 1000;
    	int x = 16;
    	int y = 32;
    	int w = 50;
    	int h = 20;
    	u8g2_ClearBuffer(u8g2);
    	u8g2_DrawStr(u8g2,0, 15, "DrawFrame");
    
    	u8g2_DrawFrame(u8g2, x, y, w, h);
    	SEND_BUFFER_DISPLAY_MS(u8g2,t);
    	u8g2_DrawFrame(u8g2, x+w+5, y-10, w-20, h+20);
    	SEND_BUFFER_DISPLAY_MS(u8g2,t);
    }
    
    //画实心圆角矩形
    void testDrawRBox(u8g2_t *u8g2)
    {
    	int t = 1000;
    	int x = 16;
    	int y = 32;
    	int w = 50;
    	int h = 20;
    	int r = 3;
    	u8g2_ClearBuffer(u8g2);
    	u8g2_DrawStr(u8g2,0, 15, "DrawRBox");
    
    	u8g2_DrawRBox(u8g2, x, y, w, h, r);
    	SEND_BUFFER_DISPLAY_MS(u8g2,t);
    	u8g2_DrawRBox(u8g2, x+w+5, y-10, w-20, h+20, r);
    	SEND_BUFFER_DISPLAY_MS(u8g2,t);
    }
    
    //画空心圆
    void testDrawCircle(u8g2_t *u8g2)
    {
    	int t = 600;
    	int stx = 0;  //画图起始x
    	int sty = 16; //画图起始y
    	int with = 16;//一个图块的间隔
    	int r = 15;   //圆的半径
    	u8g2_ClearBuffer(u8g2);
    	u8g2_DrawStr(u8g2, 0, 15, "DrawCircle");
    
    	u8g2_DrawCircle(u8g2, stx, sty - 1 + with, r, U8G2_DRAW_UPPER_RIGHT); //右上
    	SEND_BUFFER_DISPLAY_MS(u8g2,t);
    	u8g2_DrawCircle(u8g2, stx + with, sty, r, U8G2_DRAW_LOWER_RIGHT); //右下
    	SEND_BUFFER_DISPLAY_MS(u8g2,t);
    	u8g2_DrawCircle(u8g2, stx - 1 + with * 3, sty - 1 + with, r, U8G2_DRAW_UPPER_LEFT); //左上
    	SEND_BUFFER_DISPLAY_MS(u8g2,t);
    	u8g2_DrawCircle(u8g2, stx - 1 + with * 4, sty, r, U8G2_DRAW_LOWER_LEFT); //左下
    	SEND_BUFFER_DISPLAY_MS(u8g2,t);
    	u8g2_DrawCircle(u8g2, stx - 1 + with * 2, sty - 1 + with * 2, r, U8G2_DRAW_ALL);//整个圆
    	SEND_BUFFER_DISPLAY_MS(u8g2,t);
    	
        u8g2_DrawCircle(u8g2, 32*3, 32, 31, U8G2_DRAW_ALL);//右侧整个圆
    	SEND_BUFFER_DISPLAY_MS(u8g2,t);
    }
    
    //画实心椭圆
    void testDrawFilledEllipse(u8g2_t *u8g2)
    {
    	int t = 800;
    	int with = 16;//一个图块的间隔
    	int rx = 27;  //椭圆x方向的半径
    	int ry = 22;  //椭圆y方向的半径
    	u8g2_ClearBuffer(u8g2);
    	u8g2_DrawStr(u8g2,0, 14, "DrawFilledEllipse");
    
    	SEND_BUFFER_DISPLAY_MS(u8g2,t);
    	u8g2_DrawFilledEllipse(u8g2, 0, with, rx, ry, U8G2_DRAW_LOWER_RIGHT);//右下
    	SEND_BUFFER_DISPLAY_MS(u8g2,t);
    	u8g2_DrawFilledEllipse(u8g2, with * 4 - 1, with, rx, ry, U8G2_DRAW_LOWER_LEFT); //左下
    	SEND_BUFFER_DISPLAY_MS(u8g2,t);
    	u8g2_DrawFilledEllipse(u8g2, 0, with * 4 - 1, rx, ry, U8G2_DRAW_UPPER_RIGHT); //右上
    	SEND_BUFFER_DISPLAY_MS(u8g2,t);
    	u8g2_DrawFilledEllipse(u8g2, with * 4 - 1, with * 4 - 1, rx, ry, U8G2_DRAW_UPPER_LEFT); //左上
    	SEND_BUFFER_DISPLAY_MS(u8g2,t);
    	u8g2_DrawFilledEllipse(u8g2, with * 6, with * 2.5, rx, ry, U8G2_DRAW_ALL);//整个椭圆
    	SEND_BUFFER_DISPLAY_MS(u8g2,t);
    }
    
    //环形测试
    void testDrawMulti(u8g2_t *u8g2)
    {
    	u8g2_ClearBuffer(u8g2);
    	for (int j = 0; j < 64; j+=16)
    	{
    		for (int i = 0; i < 128; i+=16)
    		{
    			u8g2_DrawPixel(u8g2, i, j);
    			u8g2_SendBuffer(u8g2);
    		}
    	}
      
    	//实心矩形逐渐变大
        u8g2_ClearBuffer(u8g2);
    	for(int i=30; i>0; i-=2)
    	{
    		u8g2_DrawBox(u8g2,i*2,i,128-i*4,64-2*i);
    		u8g2_SendBuffer(u8g2);
    	}
    	//空心矩形逐渐变小
    	u8g2_ClearBuffer(u8g2);
    	for(int i=0; i<32; i+=2)
    	{
    		u8g2_DrawFrame(u8g2,i*2,i,128-i*4,64-2*i);
    		u8g2_SendBuffer(u8g2);
    	}
    	
    	//实心圆角矩形逐渐变大
    	u8g2_ClearBuffer(u8g2);
    	for(int i=30; i>0; i-=2)
    	{
    		u8g2_DrawRBox(u8g2,i*2,i,128-i*4,64-2*i,10-i/3);
    		u8g2_SendBuffer(u8g2);
    	}
        //空心圆角矩形逐渐变小
    	u8g2_ClearBuffer(u8g2);
    	for(int i=0; i<32; i+=2)
    	{
    		u8g2_DrawRFrame(u8g2,i*2,i,128-i*4,64-2*i,10-i/3);
    		u8g2_SendBuffer(u8g2);
    	}
    	
    	//实心圆逐渐变大
    	u8g2_ClearBuffer(u8g2);
    	for(int i=2; i<64; i+=3)
    	{
    		u8g2_DrawDisc(u8g2,64,32,i, U8G2_DRAW_ALL);
    		u8g2_SendBuffer(u8g2);
    	}
    	//空心圆逐渐变小
    	u8g2_ClearBuffer(u8g2);
    	for(int i=64; i>0; i-=3)
    	{
    		u8g2_DrawCircle(u8g2,64,32,i, U8G2_DRAW_ALL);
    		u8g2_SendBuffer(u8g2);
    	}
    	
    	//实心椭圆逐渐变大
        u8g2_ClearBuffer(u8g2);
    	for(int i=2; i<32; i+=3)
    	{
    		u8g2_DrawFilledEllipse(u8g2,64,32, i*2, i, U8G2_DRAW_ALL);
    		u8g2_SendBuffer(u8g2);
    	}
        //空心椭圆逐渐变小
        u8g2_ClearBuffer(u8g2);
    	for(int i=32; i>0; i-=3)
    	{
    		u8g2_DrawEllipse(u8g2,64,32, i*2, i, U8G2_DRAW_ALL);
    		u8g2_SendBuffer(u8g2);
    	}
    }
    
    
    // width: 128, height: 48
    const unsigned char bilibili[] U8X8_PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x80, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xc0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0xe0, 0x03, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0xf0, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x80, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0x01, 0xfc, 0x00, 0x00, 0x00, 0xc0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x03, 0xfc, 0x00, 0x00, 0x3c, 0xc0, 0x0f, 0x00, 0x80, 0x03, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0x07, 0xfc, 0x00, 0x00, 0x3c, 0xc0, 0x0f, 0x00, 0xc0, 0x07, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xfc, 0x00, 0x00, 0x3c, 0x80, 0x0f, 0x00, 0xc0, 0x07, 0x00, 0xc0, 0x0f, 0x00, 0x00, 0x80, 0x0f, 0xf8, 0x00, 0x00, 0x3c, 0x80, 0x0f, 0x00, 0x80, 0x07, 0x00, 0xc0, 0x07, 0x00, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00, 0x78, 0x80, 0x0f, 0x00, 0x80, 0x07, 0x00, 0xc0, 0x07, 0x00, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00, 0x78, 0x80, 0x0f, 0x00, 0x80, 0x07, 0x00, 0xc0, 0x07, 0x00, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x80, 0x79, 0x80, 0x0f, 0x00, 0x98, 0x07, 0x00, 0xc0, 0x07, 0x00, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0xe0, 0x79, 0x9f, 0x0f, 0x00, 0xbe, 0xe7, 0x01, 0xc0, 0x07, 0x10, 0x40, 0x00, 0x1f, 0xf8, 0x00, 0xe0, 0x7b, 0x1f, 0x0f, 0x00, 0xbe, 0xe7, 0x01, 0xc0, 0x87, 0x1f, 0xe0, 0x0f, 0x1f, 0xf8, 0x00, 0xe0, 0x7b, 0x1e, 0x0f, 0x00, 0x3e, 0xe7, 0x01, 0xc0, 0xe7, 0x3f, 0xe0, 0x3f, 0x1f, 0xf0, 0x00, 0xe0, 0x7b, 0x1e, 0x0f, 0x00, 0x3e, 0xe7, 0x01, 0xc0, 0xe7, 0x3f, 0xe0, 0x3f, 0x1f, 0xf0, 0x00, 0x60, 0x71, 0x1e, 0x0f, 0x00, 0x34, 0xe7, 0x01, 0xc0, 0xe7, 0x07, 0x00, 0x3f, 0x1f, 0xf0, 0x00, 0x00, 0x70, 0x00, 0x1f, 0x00, 0x00, 0x07, 0x00, 0xc0, 0x07, 0x00, 0x00, 0x00, 0x1f, 0xf0, 0x00, 0xc0, 0x73, 0x1e, 0x1f, 0x00, 0x3c, 0xc7, 0x01, 0xc0, 0x07, 0x00, 0x00, 0x00, 0x1f, 0xf0, 0x00, 0xc0, 0x73, 0x1e, 0x1f, 0x00, 0x7c, 0xe7, 0x01, 0xc0, 0x07, 0x00, 0x00, 0x00, 0x1f, 0xf0, 0x00, 0xc0, 0x73, 0x1e, 0x1f, 0x00, 0x7c, 0xef, 0x01, 0xc0, 0x07, 0x00, 0x00, 0x00, 0x1f, 0xf0, 0x01, 0xc0, 0x77, 0x1e, 0x1e, 0x00, 0x7c, 0xef, 0x01, 0xc0, 0x07, 0x00, 0x03, 0x00, 0x1f, 0xf0, 0xff, 0xc1, 0xf7, 0x1e, 0xfe, 0x1f, 0x78, 0xef, 0x01, 0xc0, 0x07, 0x70, 0x37, 0x00, 0x1f, 0xe0, 0xff, 0x87, 0xf7, 0x1e, 0xfe, 0xff, 0x78, 0xee, 0x01, 0xc0, 0x07, 0xe0, 0x3f, 0x00, 0x1f, 0xe0, 0xff, 0x9f, 0xf7, 0x1e, 0xfe, 0xff, 0x79, 0xce, 0x01, 0xc0, 0x07, 0xc0, 0x18, 0x00, 0x1f, 0xe0, 0xff, 0xbf, 0xe7, 0x1e, 0xfe, 0xff, 0x7b, 0xce, 0x01, 0xc0, 0x07, 0x00, 0x00, 0x00, 0x1f, 0xe0, 0xc7, 0xbf, 0xe7, 0x1e, 0xfe, 0xf8, 0x77, 0xce, 0x01, 0xc0, 0x07, 0x00, 0x00, 0x00, 0x1f, 0xe0, 0x0f, 0x3f, 0xe7, 0x1c, 0xfe, 0xf0, 0x77, 0xce, 0x03, 0xc0, 0x07, 0x00, 0x00, 0x00, 0x1f, 0xe0, 0xcf, 0x3f, 0xe7, 0x1c, 0xfe, 0xf8, 0xf3, 0xce, 0x03, 0xc0, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xe0, 0xef, 0x1f, 0xe7, 0x1c, 0xfe, 0xfe, 0xf1, 0xce, 0x03, 0x80, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xe0, 0xff, 0x0f, 0xcf, 0x1c, 0xfc, 0xff, 0xf0, 0xc0, 0x03, 0x00, 0xff, 0xff, 0xff, 0xff, 0x07, 0xe0, 0xff, 0x03, 0x06, 0x1c, 0xfc, 0x7f, 0x60, 0xc0, 0x01, 0x00, 0xfe, 0xff, 0xff, 0xff, 0x03, 0xe0, 0xff, 0x00, 0x00, 0x00, 0xfc, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0x00, 0xc0, 0x0f, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
    // width: 128, height: 48
    const unsigned char three_support[] U8X8_PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x00, 0x00, 0xfc, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x00, 0x00, 0xfe, 0x7f, 0x00, 0x00, 0x00, 0x80, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x80, 0x1f, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0x80, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0xc0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x03, 0x00, 0x00, 0x80, 0x0f, 0xf0, 0x01, 0x00, 0x00, 0xfc, 0xff, 0x01, 0x00, 0x00, 0xc0, 0xfd, 0xff, 0x00, 0x00, 0xc0, 0x7f, 0xfe, 0x01, 0x00, 0x00, 0xff, 0xff, 0x0f, 0x00, 0x00, 0xe0, 0xfd, 0xff, 0x01, 0x00, 0xc0, 0x1f, 0xf8, 0x03, 0x00, 0x00, 0xff, 0xff, 0x0f, 0x00, 0x00, 0xe0, 0xfd, 0xff, 0x01, 0x00, 0xc0, 0x0f, 0xf0, 0x03, 0x00, 0x00, 0xfe, 0xff, 0x07, 0x00, 0x00, 0xe0, 0xfd, 0xff, 0x01, 0x00, 0xc0, 0x67, 0xe6, 0x03, 0x00, 0x00, 0xfc, 0xff, 0x03, 0x00, 0x00, 0xe0, 0xfd, 0xff, 0x01, 0x00, 0xc0, 0x67, 0xe6, 0x03, 0x00, 0x00, 0xf8, 0xff, 0x01, 0x00, 0x00, 0xe0, 0xfd, 0xff, 0x00, 0x00, 0xc0, 0x67, 0xe6, 0x03, 0x00, 0x00, 0xf0, 0x7f, 0x00, 0x00, 0x00, 0xe0, 0xfd, 0xff, 0x00, 0x00, 0xc0, 0x67, 0xee, 0x03, 0x00, 0x00, 0xe0, 0x7f, 0x00, 0x00, 0x00, 0xe0, 0xfd, 0xff, 0x00, 0x00, 0x80, 0x7f, 0xfe, 0x01, 0x00, 0x00, 0xe0, 0xff, 0x00, 0x00, 0x00, 0xe0, 0xfd, 0xff, 0x00, 0x00, 0x80, 0x7f, 0xfe, 0x01, 0x00, 0x00, 0xf0, 0xff, 0x00, 0x00, 0x00, 0xe0, 0xfd, 0x7f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xf0, 0xff, 0x00, 0x00, 0x00, 0xe0, 0xfd, 0x7f, 0x00, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0x00, 0xf8, 0xf9, 0x01, 0x00, 0x00, 0xe0, 0xfd, 0x7f, 0x00, 0x00, 0x00, 0xfe, 0x7f, 0x00, 0x00, 0x00, 0xf8, 0xf0, 0x00, 0x00, 0x00, 0xe0, 0xfd, 0x1f, 0x00, 0x00, 0x00, 0xf8, 0x1f, 0x00, 0x00, 0x00, 0x30, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
    
    void testDrawXBM(u8g2_t *u8g2)
    {
    	int t = 1000;
    	u8g2_ClearBuffer(u8g2);
    	u8g2_DrawStr(u8g2,0, 14, "DrawXBM");
    
    	u8g2_DrawXBM(u8g2,0, 16, 128, 48, bilibili);
    	SEND_BUFFER_DISPLAY_MS(u8g2,t);
    
    	u8g2_ClearBuffer(u8g2);
    	u8g2_DrawStr(u8g2,0, 14, "Lily_s");
    	u8g2_DrawXBM(u8g2,0, 16, 128, 48, three_support);
    	SEND_BUFFER_DISPLAY_MS(u8g2,t);
    }
    
    void u8g2DrawTest(u8g2_t *u8g2)
    {
    	testDrawProcess(u8g2);
    	testDrawMulti(u8g2);
    	//testDrawFrame(u8g2);
    	//testDrawRBox(u8g2);
    	//testDrawCircle(u8g2);
    	//testDrawFilledEllipse(u8g2);
    	testShowFont(u8g2);
    	testDrawXBM(u8g2);
    
    }
    
    

    4.1.3 效果演示

    五、探究总结

    图像显示原本是一个相对复杂的工程,但是u8g2图形库的出现让复杂图形以及动画显示变成了一件相对简单的事。

    作者:双料毒狼_s

    物联沃分享整理
    物联沃-IOTWORD物联网 » 使用U8G库实现基于I2C协议的OLED显示【STM32】

    发表回复