一,简介
1.U8g2简介
U8g2 是一款用于单色 OLED、LCD 显示屏的 C/C++ 图形库,适用于嵌入式系统和微控制器。它提供了广泛的功能,如绘制图形、文本和图像,支持各种字体和语言,以及多种显示效果。U8g2 可以跨平台运行,支持多种开发板和控制器,使用简单方便,适用于各种项目,如传感器、数据采集、嵌入式系统等。U8g2 的代码库和文档都是开源的,用户可以根据自己的需要进行定制和修改。
接口方式分为spi和IIC
2.OLED屏简介
OLED(Organic Light Emitting Diode)是一种有机发光二极管技术,用于制造显示屏幕。与传统的液晶显示屏相比,OLED 显示屏具有许多优势,包括更高的对比度、更快的响应时间、更广的视角、更薄更轻、更省电等特点。
OLED 显示屏不需要背光灯,因为它们的每个像素都是自发光的,这意味着可以实现更深的黑色和更生动的颜色。另外,由于 OLED 是有机材料,所以可以制造成柔性屏幕,适用于弯曲和折叠显示器。这使得 OLED 技术被广泛应用于手机、平板电脑、电视机、手表、车载显示屏等各种电子设备中。
总的来说,OLED 屏幕具有显示效果更好、更节能、更轻薄、更灵活等优点,因此在电子产品市场上受到了广泛的欢迎。
3.I2C简介
I2C(Inter-Integrated Circuit)是一种串行通信总线协议,用于在微处理器、传感器、存储器和其他外设之间传输数据。I2C 由飞利浦公司(现在的恩智浦半导体)开发,是一种简单、高效的通信方式,在嵌入式系统中广泛应用。
I2C 总线由两根线组成:SCL(串行时钟线)和SDA(串行数据线)。通过 SCL 线上的时钟脉冲来同步数据传输,而数据则通过 SDA 线进行双向传输。每个设备在总线上都有一个唯一的地址,可以通过这个地址与其通信。
I2C 主要优点包括双向通信、多主机支持、地址寻址、简单连接等。它适用于连接多种设备,如传感器、显示器、存储器等,并且能够减少系统中所需的引脚数。在嵌入式系统中,许多微控制器和外围设备都支持 I2C 接口,因此它成为了常用的通信标准之一。
I2C主设备接受流程
I2C总线读写数据操作
总线可挂多个设备
I2C时序图
二,Cubex MX 配置
RCC配置
SYS配置
I2C配置
TIM1配置
时钟配置
工程配置
三,U8g2的移植
下载地址https://github.com/olikraus/u8g2
如下图下载完后
一,精简U8g2库
这里我们主要关注的是U8g2库文件中的csrc文件。
去掉无用文件,这些驱动文件通常是u8x8_d_xxx.c,xxx包括驱动的型号和屏幕分辨率。ssd1306驱动芯片的OLED,使用u8x8_ssd1306_128x64_noname.c这个文件,其它的屏幕驱动和分辨率的文件可以删掉。
二,精简u8g2_d_setup.c
u8g2_Setup_ssd1306_i2c_128x64_noname_f就好(如果是SPI接口,需要使用u8g2_Setup_ssd1306_128x64_noname_f这个函数),其它的可以删掉或注释掉。
与这个函数看起来十分相似的函数的有:
u8g2_Setup_ssd1306_128x64_noname_1
u8g2_Setup_ssd1306_128x64_noname_2
u8g2_Setup_ssd1306_128x64_noname_f
u8g2_Setup_ssd1306_i2c_128x64_noname_1
u8g2_Setup_ssd1306_i2c_128x64_noname_2
u8g2_Setup_ssd1306_i2c_128x64_noname_f
注意是u8g2_Setup_ssd1306_i2c_128x64_noname_f
三, 精简u8g2_d_memory.c
由于用到的u8g2_Setup_ssd1306_i2c_128x64_noname_f函数中,只调用了u8g2_m_16_8_f这个函数,所以留下这个函数,其它的函数一定要删掉或注释掉,否则编译时很可能会提示内存不足!!
四, 将精简后的U8g2库添加至Keil
四, 代码实现
(1)
stm32_u8g2.h:
#ifndef __STM32_U8G2_H
#define __STM32_U8G2_H
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "u8g2.h"
/* USER CODE BEGIN Includes */
/* USER CODE END Includes */
/* USER CODE BEGIN Private defines */
/* USER CODE END Private defines */
#define u8 unsigned char // ?unsigned char ????
#define MAX_LEN 128 //
#define OLED_ADDRESS 0x78 // oled
#define OLED_CMD 0x00 //
#define OLED_DATA 0x40 //
/* USER CODE BEGIN Prototypes */
uint8_t u8x8_byte_hw_i2c(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr);
uint8_t u8x8_gpio_and_delay(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_