玩转u8g2 OLED库,一篇就够

您所在的位置:网站首页 oled有条竖线 玩转u8g2 OLED库,一篇就够

玩转u8g2 OLED库,一篇就够

2024-03-22 23:02| 来源: 网络整理| 查看: 265

STM32中U8g2图形库的使用 1 前言1.1 U8g2库百度脑图 2 U8g2库函数详解2.1 基本函数(干货从这里开始)2.1.1 u8g2_t u8g2;2.1.2 u8g2Init(u8g2_t *u8g2)2.1.3 u8g2_InitDisplay(u8g2)2.1.4 u8g2_SetPowerSave(u8g2, is_enable);2.1.5 u8g2_ClearDisplay(u8g2_t *u8g2)2.1.6 u8g2_ClearBuffer(u8g2_t *u8g2) —— 清除缓冲区 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 缓存相关函数(了解了解)2.4.1 u8g2_GetBufferPtr() —— 获取缓存空间的地址2.4.2 u8g2_GetBufferTileHeight() —— 获取缓冲区的Tile高度2.4.3 u8g2_GetBufferTileWidth() —— 获取缓冲区的Tile宽度2.4.4 u8g2_GetBufferCurrTileRow() —— 获取缓冲区的当前Tile row2.4.5 u8g2_SetBufferCurrTileRow() —— 设置缓冲区的当前Tile row 3.如何运用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); HAL_Delay(50); }while (u8g2_NextPage(&u8g2));

视频

2.2.5 u8g2_DrawFilledEllipse() —— 画实心椭圆 2.2.6 u8g2_DrawFrame() —— 画空心矩形

函数说明:

/** * 画空心方形,左上角坐标为(x,y),宽度为w,高度为h * @param x 左上角的x坐标 * @param y 左上角的y坐标 * @param w 方形的宽度 * @param h 方形的高度 */ void u8g2_DrawFrame(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_DrawFrame(&u8g2,3,7,25,15);

画空心矩形

进度条示例 u8g2_FirstPage(&u8g2); do { for(uint8_t i=0;i u8g2_ClearBuffer(&u8g2); char buff[20]; sprintf(buff,"%d",(int)(i/100.0*100)); u8g2_SetFont(&u8g2,u8g2_font_inb24_mf); u8g2_DrawStr(&u8g2,127-41,24,buff); u8g2_SendBuffer(&u8g2); HAL_Delay(100); } 2.2.14 u8g2_DrawTriangle() —— 绘制实心三角形

函数说明:

/** * 绘制实心三角形,定点坐标分别为(x0,y0),(x1,y1),(x2,y2) */ void u8g2_DrawTriangle(u8g2_t *u8g2, int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2, int16_t y2) 示例: u8g2_DrawTriangle(&u8g2,20,5, 27,50, 5,32);

绘制实心三角形

for(uint8_t i=0;i u8g2_SetFont(&u8g2,u8g2_font_ncenB14_tr); u8g2_DrawStr(&u8g2,0,15,"Hello World!"); } while (u8g2_NextPage(&u8g2)); 库源码解析: void u8g2_FirstPage(u8g2_t *u8g2) { if ( u8g2->is_auto_page_clear ) { //清除缓冲区 u8g2_ClearBuffer(u8g2); } //设置当前缓冲区的Tile Row 一个Tile等于8个像素点的高度 u8g2_SetBufferCurrTileRow(u8g2, 0); } uint8_t u8g2_NextPage(u8g2_t *u8g2) { uint8_t row; u8g2_send_buffer(u8g2); row = u8g2->tile_curr_row; row += u8g2->tile_buf_height; if ( row >= u8g2_GetU8x8(u8g2)->display_info->tile_height ) { //如果row已经到达最后一行,触发refreshDisplay调用,表示整个页面已经刷完了 u8x8_RefreshDisplay( u8g2_GetU8x8(u8g2) ); return 0; } if ( u8g2->is_auto_page_clear ) { //清除缓冲区 u8g2_ClearBuffer(u8g2); } //不断更新TileRow 这是非常关键的一步 u8g2_SetBufferCurrTileRow(u8g2, row); return 1; } 2.2.19 u8g2_SendBuffer() —— 绘制缓冲区的内容

函数说明:

/** * 绘制缓冲区的内容 * @Note 关联方法 clearBuffer */ void u8g2_SendBuffer(u8g2_t *u8g2) u8g2_SendBuffer的RAM占用空间大,需要结合构造器的buffer选项使用;不管是u8g2_FirstPage、u8g2_NextPage还是u8g2_SendBuffer,都涉及到一个叫做 current page position的概念;库源码解析: void u8g2_SendBuffer(u8g2_t *u8g2) { u8g2_send_buffer(u8g2); u8x8_RefreshDisplay( u8g2_GetU8x8(u8g2) ); } static void u8g2_send_tile_row(u8g2_t *u8g2, uint8_t src_tile_row, uint8_t dest_tile_row) { uint8_t *ptr; uint16_t offset; uint8_t w; w = u8g2_GetU8x8(u8g2)->display_info->tile_width; offset = src_tile_row; ptr = u8g2->tile_buf_ptr; offset *= w; offset *= 8; ptr += offset; u8x8_DrawTile(u8g2_GetU8x8(u8g2), 0, dest_tile_row, w, ptr); } /* write the buffer to the display RAM. For most displays, this will make the content visible to the user. Some displays (like the SSD1606) require a u8x8_RefreshDisplay() */ static void u8g2_send_buffer(u8g2_t *u8g2) U8X8_NOINLINE; static void u8g2_send_buffer(u8g2_t *u8g2) { uint8_t src_row; uint8_t src_max; uint8_t dest_row; uint8_t dest_max; src_row = 0; src_max = u8g2->tile_buf_height; dest_row = u8g2->tile_curr_row; dest_max = u8g2_GetU8x8(u8g2)->display_info->tile_height; do { u8g2_send_tile_row(u8g2, src_row, dest_row); src_row++; dest_row++; } while( src_row


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3