STM32中U8g2图形库的使用
- 1 前言
- 2 U8g2库函数详解
-
- 2.1 基本函数(干货从这里开始)
- 2.2 绘制相关函数(进阶)
-
- 2.2.1 u8g2_DrawBox() —— 画实心矩形
- 2.2.2 u8g2_DrawCircle() —— 画空心圆
- 2.2.3 u8g2_DrawDisc() —— 画实心圆
- 2.2.4 u8g2_DrawEllipse() —— 画空心椭圆
- 2.2.5 u8g2_DrawFilledEllipse() —— 画实心椭圆
- 2.2.6 u8g2_DrawFrame() —— 画空心矩形
- 2.2.7 u8g2_DrawGlyph() —— 绘制字体字集的符号
- 2.2.8 u8g2_DrawHLine() —— 绘制水平线
- 2.2.9 u8g2_DrawLine() —— 两点之间绘制线
- 2.2.10 u8g2_DrawPixel() —— 绘制像素点
- 2.2.11 u8g2_DrawRBox() —— 绘制圆角实心方形
- 2.2.12 u8g2_DrawRFrame() —— 绘制圆角空心方形
- 2.2.13 u8g2_DrawStr() —— 绘制字符串
- 2.2.14 u8g2_DrawTriangle() —— 绘制实心三角形
- 2.2.15 u8g2_DrawUTF8() —— 绘制UTF8编码的字符
- 2.2.16 u8g2_DrawVLine() —— 绘制竖直线
- 2.2.17 u8g2_DrawXBM()/u8g2_DrawXBMP() —— 绘制图像
- 2.2.18 u8g2_FirstPage()/u8g2_NextPage() —— 绘制命令
- 2.2.19 u8g2_SendBuffer() —— 绘制缓冲区的内容
- 2.3 显示配置相关函数(并不是很有用,再进阶)
-
- 2.3.1 u8g2_GetAscent() —— 获取基准线以上的高度
- 2.3.2 u8g2_GetDescent() —— 获取基准线以下的高度
- 2.3.3 u8g2_GetDisplayHeight() —— 获取显示器的高度
- 2.3.4 u8g2_GetDisplayWidth() —— 获取显示器的宽度
- 2.3.5 u8g2_GetMaxCharHeight() —— 获取当前字体里的最大字符的高度
- 2.3.6 u8g2_GetMaxCharWidth() —— 获取当前字体里的最大字符的宽度
- 2.3.7 u8g2_GetStrWidth() —— 获取字符串的像素宽度
- 2.3.8 u8g2_GetUTF8Width() —— 获取UTF-8字符串的像素宽度
- 2.3.9 u8g2_SetAutoPageClear() —— 设置自动清除缓冲区
- 2.3.10 u8g2_SetBitmapMode() —— 设置位图模式
- 2.3.11 u8g2_SetClipWindow() —— 设置采集窗口大小
- 2.3.14 u8g2_SetDisplayRotation() —— 设置显示器的旋转角度
- 2.3.15 u8g2_SetDrawColor() —— 设置绘制颜色(反色)
- 2.3.16 u8g2_SetFont() —— 设置字体集
- 2.3.17 u8g2_SetFontDirection() —— 设置字体方向
- 2.4 缓存相关函数(了解了解)
- 3.如何运用U8G2库
1 前言
OLED图形库众多,如Adafruit_GFX 和 Adafruit_SSD1306库。但是,今天要使用的是 U8g2图形库。
1.1 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));
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);