介绍
U8g2是一个功能强大的C++图形库,专为嵌入式系统而设计,是一个开源的图形库, 主要用来驱动小屏幕, 内部继承了I2C/SPI, 支持常用的小屏幕支持很多型号, 特别是在Arduino和其他低功耗平台上。以下是关于U8g2的详细介绍:
-
主要特点:
- 支持多种屏幕:U8g2支持近200种单色屏,包括LCD、OLED等,这使得开发者能够轻松地在不同的显示屏上实现图形界面。
- 跨平台支持:除了Arduino平台外,U8g2还可以在其他嵌入式平台上使用,增强了其灵活性和可移植性。
- 多种字体支持:U8g2支持多种字体,包括中文、韩文、日文、梵文等,满足了不同项目的需求。
- 高效的内存管理:采用页缓冲策略,减少了对内存的需求,这在资源有限的嵌入式平台上尤为重要。
- 丰富的图形功能:提供了绘制文本、线条、形状等基本图形操作,以及自动滚动、页面缓冲区管理等高级特性。
-
技术细节:
- 硬件兼容性:U8g2支持多种显示屏型号和接口类型,如SPI、I2C、4Wire、3Wire、1Wire、8080等,这为用户提供了广泛的选择。
- C++编程模型:采用面向对象的API设计,使得代码更易于理解和维护。开发者可以通过类和对象创建多个独立的显示实例,并根据需要进行初始化和更新。
- 自定义字体支持:除了内置的一系列字体外,U8g2还支持加载和使用自定义的点阵字体,这为用户提供了更大的灵活性。
-
应用场景:
- 物联网仪表盘:用于实时数据可视化的简易面板。
- 游戏界面:创建简单的游戏图形界面和得分显示。
- 智能家居控制面板:设计直观的控制界面。
- 实验原型:快速构建带图形界面的原型机。
- 显示传感器数据、制作时钟、显示菜单、显示动画等。
-
使用示例:
- U8g2提供了丰富的API函数,用于实现各种图形操作。例如,可以使用
u8g2_DrawBox
函数绘制实心矩形,u8g2_DrawStr
函数绘制字符串等。 - 通过简单的函数调用,开发者可以轻松地创建出各种复杂的图形界面。
- U8g2提供了丰富的API函数,用于实现各种图形操作。例如,可以使用
综上所述,U8g2是一个功能强大、易于使用且高度灵活的图形库,适用于各种嵌入式系统项目。
使用
1. 打开图形库的官方地址
如果上面地址打不开则使用码云官方地址:
2. 下载源代码
下载成功后, 保存下来
3. 进入设置指南与参考手册
选择 移植到新的MCR平台
点击进入移植到新的MCR平台后,选择STM32, 如果是GD32,也可以选择这个文档
我们可以在第二个链接中, 寻找自己需要的代码, 其他链接也可参考
4. 编写代码
经过上面一系列查找文档之后, 我们可以开始着手代码部分了
我们习惯使用C语言的src, 所以选择csrc
1. 删除不需要的屏幕驱动
删掉csrc文件夹中其它的屏幕驱动,只保留自己的屏幕驱动,例如我使用的屏幕驱动是ssd1306, 128x64的屏幕
以下是删除后,剩余文件,可供参考
2. 精简u8g2_d_setup.c
打开u8g2_d_setup.c文件, 找到需要的屏幕驱动, 删除其他代码, 比如我们需要128 × 64, 只保留u8g2_Setup_ssd1306_i2c_128x64_noname_f函数(370行)
4. 参考main.c文件
打开下面这个网站,看看如何将它移植到stm32平台中
3. 讲精简完的u8g2文件夹, 拖进需要用到的文件中
这里需要注意, 在使用时别忘记, 加入
4. 下载stm32平台的main.c
https://github.com/nikola-v/u8g2_template_stm32f103c8t6/blob/master/Src/main.c
5. 参考文档, 在u8g2.c 文件中编写代码
/*
是一个开源的图形库, 主要用来驱动小屏幕
内部继承了I2C/SPI
支持常用的小屏幕
*/
#include "u8g2.h"
#include "gd32f4xx.h"
#include <stdio.h>
#include <string.h>
#include "systick.h"
uint8_t u8g2_gpio_and_delay_gd32(U8X8_UNUSED u8x8_t *u8x8, U8X8_UNUSED uint8_t msg, U8X8_UNUSED uint8_t arg_int, U8X8_UNUSED void *arg_ptr)
{
switch(msg){
//Initialize SPI peripheral
case U8X8_MSG_GPIO_AND_DELAY_INIT:
/* HAL initialization contains all what we need so we can skip this part. */
break;
//Function which implements a delay, arg_int contains the amount of ms
case U8X8_MSG_DELAY_MILLI:
delay_1ms(arg_int);
break;
//Function which delays 10us
case U8X8_MSG_DELAY_10MICRO:
delay_1us(10);
break;
//Function which delays 100ns
case U8X8_MSG_DELAY_100NANO:
__NOP();
break;
//Function to define the logic level of the clockline
case U8X8_MSG_GPIO_I2C_CLOCK:
if (arg_int) gpio_bit_write(GPIOB, GPIO_PIN_6, SET);
else gpio_bit_write(GPIOB, GPIO_PIN_6, RESET);
break;
//Function to define the logic level of the data line to the display
case U8X8_MSG_GPIO_I2C_DATA:
if (arg_int) gpio_bit_write(GPIOB, GPIO_PIN_7, SET);
else gpio_bit_write(GPIOB, GPIO_PIN_7, RESET);
break;
default:
return 0; //A message was received which is not implemented, return 0 to indicate an error
}
return 1; // command processed successfully.
}
/*
开源的图形库,主要是用来驱动小型屏幕
内部已经集成I2C/SPI
支持常用的小屏幕
*/
void u8g2_test(){
// 对GPIO进行初始化
rcu_periph_clock_enable(RCU_GPIOB);
// PB6 SCL
gpio_mode_set(GPIOB,GPIO_MODE_OUTPUT,GPIO_PUPD_PULLUP,GPIO_PIN_6);
gpio_output_options_set(GPIOB,GPIO_OTYPE_OD,GPIO_OSPEED_MAX,GPIO_PIN_6);
// PB7 SDA
gpio_mode_set(GPIOB,GPIO_MODE_OUTPUT,GPIO_PUPD_PULLUP,GPIO_PIN_7);
gpio_output_options_set(GPIOB,GPIO_OTYPE_OD,GPIO_OSPEED_MAX,GPIO_PIN_7);
/* USER CODE BEGIN 1 */
u8g2_t u8g2;
/* USER CODE END 1 */
u8g2_Setup_ssd1306_i2c_128x64_noname_f(&u8g2, U8G2_R0, u8x8_byte_sw_i2c, u8g2_gpio_and_delay_gd32);
u8g2_InitDisplay(&u8g2); // send init sequence to the display, display is in sleep mode after this,
u8g2_SetPowerSave(&u8g2, 0); // wake up display
delay_1ms(1000);
printf("example16_u8g2_test\r\n");
u8g2_DrawLine(&u8g2, 50,50, 100, 100);
u8g2_SetFontMode(&u8g2, 1);
u8g2_SetFontDirection(&u8g2, 0);
u8g2_SetFont(&u8g2, u8g2_font_fub20_tf);
u8g2_DrawStr(&u8g2, 0, 28, "ICHEIMA");
// 将数据发送到屏幕上显示
u8g2_SendBuffer(&u8g2);
while(1){
}
}
6. 在main中使用, 并在OLED板上显示
#include "gd32f4xx.h"
#include "systick.h"
#include <stdio.h>
/*********************
任务目标:
模板工程
**********************/
int main(void) {
// 系统滴答定时器初始化
systick_config();
// 移植U8G2开源库
extern void u8g2_test();
u8g2_test();
while(1) {
}
}
最终效果
稍后更新...