玩转u8g2 OLED库,一篇就够——基于SMT32、HAL

本文详细介绍了STM32中使用的U8g2图形库,包括初始化、基本函数如u8g2_t结构体、u8g2_InitDisplay、u8g2_SetPowerSave等,以及进阶的绘制函数如DrawBox、DrawCircle、DrawFrame等。此外,还讨论了显示配置相关函数和缓存管理,提供了实例代码帮助理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

STM32中U8g2图形库的使用

1 前言

  OLED图形库众多,如Adafruit_GFX 和 Adafruit_SSD1306库。但是,今天要使用的是 U8g2图形库。

参考文章:深入学习Arduino u8g2 OLED库,一篇就够
参考文章:GitHub–>u8g2reference

1.1 U8g2库百度脑图

U8g2库百度脑图
可以分为四大类:

  • 基本函数
  • 绘制相关函数
  • 显示配置相关函数
  • 缓存相关函数

2 U8g2库函数详解

2.1 基本函数(干货从这里开始)

2.1.1 u8g2_t u8g2;

u8g2_t u8g2;		// 显示器初始化结构体

2.1.2 u8g2Init(u8g2_t *u8g2)

u8g2_t u8g2;		// 显示器初始化结构体
u8g2Init(&u8g2);   //显示器调用初始化函数

2.1.3 u8g2_InitDisplay(u8g2)

void u8g2Init(u8g2_t *u8g2)
{
   
	u8g2_Setup_ssd1306_128x64_noname_f(u8g2, U8G2_R0, u8x8_byte_4wire_hw_spi, u8x8_stm32_gpio_and_delay); 
	u8g2_InitDisplay(u8g2);     //初始化显示
	u8g2_SetPowerSave(u8g2, 0); //开启显示
}

2.1.4 u8g2_SetPowerSave(u8g2, is_enable);

u8g2_SetPowerSave(&u8g2, 0);   //开启显示
  • 不管是启用还是禁用,显示器需要的内存消耗是不变的,说到底就是为了关闭屏幕,做到省电;
  • 所以这里就可以理解为什么初始化需要 u8g2_SetPowerSave(u8g2, 0); 来开启显示

2.1.5 u8g2_ClearDisplay(u8g2_t *u8g2)

u8g2_ClearDisplay(&u8g2);    //清除屏幕缓冲区
  • 不要在 firstPage 和 nextPage 函数之间调用该方法。

2.1.6 u8g2_ClearBuffer(u8g2_t *u8g2) —— 清除缓冲区

  • 一般这个函数是与u8g2_SendBuffer函数配对使用,通常用法如下:
void Buffer(u8g2_t *u8g2) {
   
  u8g2_ClearBuffer(u8g2); 
  // ... 向缓冲区写入内容
  u8g2_SendBuffer(u8g2);
}

2.2 绘制相关函数(进阶)

2.2.1 u8g2_DrawBox() —— 画实心矩形

函数说明:

/**
 * 画实心矩形,左上角坐标为(x,y),宽度为w,高度为h
 * @param x 左上角的x坐标
 * @param y 左上角的y坐标
 * @param w 方形的宽度
 * @param h 方形的高度
 */
void u8g2_DrawBox(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t w, u8g2_uint_t h)
  • 如果支持绘制颜色(也就是不是单色显示器),那么由**u8g2_SetDrawColor(u8g2_t *u8g2, uint8_t color)**设置;
  • 示例:
u8g2_DrawBox(&u8g2,3,7,25,15);

画实心矩形

  • 显示一个简单的进度条
u8g2_FirstPage(&u8g2);
do
{
   
	u8g2_DrawBox(&u8g2,0,32,i++,15);
	HAL_Delay(50);
}while (u8g2_NextPage(&u8g2));

显示进度条

2.2.2 u8g2_DrawCircle() —— 画空心圆

函数说明:

/**
 * 画空心圆,圆心坐标为(x0,y0),半径为rad
 * @param x0 圆点的x坐标
 * @param y0 圆点的y坐标
 * @param rad 圆形的半径
 * @param opt 圆形选项
 *        U8G2_DRAW_ALL 整个圆
 *        U8G2_DRAW_UPPER_RIGHT 右上部分的圆弧
 *        U8G2_DRAW_UPPER_LEFT  左上部分的圆弧
 *        U8G2_DRAW_LOWER_LEFT  左下部分的圆弧
 *        U8G2_DRAW_LOWER_RIGHT 右下部分的圆弧
 *        选项可以通过 | 操作符来组合
 */
void u8g2_DrawCircle(u8g2_t *u8g2, u8g2_uint_t x0, u8g2_uint_t y0, u8g2_uint_t rad, uint8_t option)
  • 示例:
u8g2_DrawCircle(&u8g2,20,25,10,U8G2_DRAW_ALL);

画空心圆

  • 动态测试
u8g2_FirstPage(&u8g2);
do
{
   
	u8g2_DrawCircle(&u8g2,63,31,i++,U8G2_DRAW_ALL ); 
//    u8g2_DrawCircle(&u8g2,63,31,i++,U8G2_DRAW_UPPER_RIGHT|U8G2_DRAW_LOWER_LEFT); 
	HAL_Delay(50);
}while (u8g2_NextPage(&u8g2));

空心圆测试all
空心圆测试

2.2.3 u8g2_DrawDisc() —— 画实心圆

/**
 * 画实心圆,圆心坐标为(x0,y0),半径为rad
 * @param x0 圆点的x坐标
 * @param y0 圆点的y坐标
 * @param rad 圆形的半径
 * @param opt 圆形选项
 *        U8G2_DRAW_ALL 整个圆
 *        U8G2_DRAW_UPPER_RIGHT 右上部分的圆弧
 *        U8G2_DRAW_UPPER_LEFT  左上部分的圆弧
 *        U8G2_DRAW_LOWER_LEFT  左下部分的圆弧
 *        U8G2_DRAW_LOWER_RIGHT 右下部分的圆弧
 *       选项可以通过 | 操作符来组合
 */
void u8g2_DrawDisc(u8g2_t *u8g2, u8g2_uint_t x0, u8g2_uint_t y0, u8g2_uint_t rad, uint8_t option)
  • 直径等于2rad + 1;
  • 如果支持绘制颜色(也就是不是单色显示器),那么由**u8g2_SetDrawColor(u8g2_t *u8g2, uint8_t color)**设置;
  • 示例
u8g2_FirstPage(&u8g2);
do
{
   
	u8g2_DrawDisc(&u8g2,63,31,i++,U8G2_DRAW_UPPER_RIGHT|U8G2_DRAW_LOWER_LEFT); 
	HAL_Delay(50);
}while (u8g2_NextPage(&u8g2));

实心圆测试

2.2.4 u8g2_DrawEllipse() —— 画空心椭圆

函数说明:

/**
 * 画空心椭圆,圆心坐标为(x0,y0),半径为rad
 * @param x0 圆点的x坐标
 * @param y0 圆点的y坐标
 * @param rx 椭圆形水平x方向的半径
 * @param ry 椭圆形竖直y方向的半径
 * @param opt 圆形选项
 *        U8G2_DRAW_ALL 整个椭圆
 *        U8G2_DRAW_UPPER_RIGHT 右上部分的圆弧
 *        U8G2_DRAW_UPPER_LEFT  左上部分的圆弧
 *        U8G2_DRAW_LOWER_LEFT  左下部分的圆弧
 *        U8G2_DRAW_LOWER_RIGHT 右下部分的圆弧
 *        选项可以通过 | 操作符来组合
 */
void u8g2_DrawEllipse(u8g2_t *u8g2, u8g2_uint_t x0, u8g2_uint_t y0, u8g2_uint_t rx, u8g2_uint_t ry, uint8_t option)
  • rx*ry 在8位模式的u8g2必须小于512(博主也没有理解);
  • 示例:
u8g2_DrawEllipse(&u8g2,20,25,15,10,U8G2_DRAW_ALL);

画空心椭圆

u8g2_FirstPage(&u8g2);
do
{
   
	u8g2_DrawEllipse(&u8g2,63,31,i++,30,U8G2_DRAW_UPPER_RIGHT|U8G2_DRAW_LOWER_LEFT); 
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

深藏ぺblue

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值