olcd12864的u8g2库_OLED屏显示功能-U8glib库函数大全。

这篇教程详细介绍了U8g2库在OLED 128x64显示屏上的应用,包括基本图形绘制函数如点、线、框、三角形等,以及字符显示、位图处理等功能。通过实例展示了如何使用这些函数进行图像显示和控制,帮助开发者更好地理解和运用U8g2库。

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

本帖最后由 alientg 于 2017-1-9 15:09 编辑

以下内容装载自 http://www.geek-workshop.com/thread-10634-1-1.html   (微排版)

U8glib库函数,有一些描述不正确,因为是直接翻译过来的,欢迎提意见。

另外我觉得U8G2库比它更强大,同样支持1306控制芯片。正在研究中,到时候再发出来。

----------------------------------------------------------目录-----------------------------------------------------------------------------

本教程的硬件环境为

Arduino Nano (ATmega328p)

0.96寸 OLED-128X64 SPI 接口

官方介绍为Universal Graphics Library for 8 Bit Embedded Systems。详见

函数:

> firstPage图像显示

> nextPage

> drawPixe                 点

> drawLine                 线

> drawHLine               水平线

> drawVLine               垂直线

> drawTriangle           三角(实心)

> drawFrame              矩形框

> drawRFrame            圆角矩形框

> drawBox                 矩形(实心)

> drawRBox               圆角矩形(实心)

> drawCircle                圆

> drawDisc                  圆形(实心)

> drawEllipse               圆弧

> drawFilledEllipse        扇形(实心)

> drawStr          显示字符串

> print               输出

> drawBitmapP          画位图

> drawXMBP              画大尺寸位图

> getHeight          获得显示器高度

> getWidth           获得显示器宽度

> getStrWidth       获得字符串宽度

> setFont                        设置字体

> setPrintPos                   设置输出位置

> setColorIndex               设置显示与否

> setRot90 /180 /270      显示内容旋转

> setFontPosTop

------------------------------------------------------------------------------------------------------------------------------------------------------------------

//若要使图像正常显示,u8glib库提供了如下的picture loop。

>  firstPage

1)方法定义u8g.firstPage(void)      //调用此过程,标志着图像循环的开始

>  nextPage

1)方法定义

u8g.nextPage(void)   //调用此过程,标志着图像循环的结束

#include "U8glib.h"

U8GLIB_SSD1306_128X64 u8g( ... );

void setup() { ... }

void loop() {

u8g.firstPage();

do {

//display

}while(u8g.nextPage());

}

//详见几何图形-----------------------------------------------------------------------------------------------------------

>  drawPixel//画一个点1)方法定义u8g.drawPixel(uint8_t x, uint8_t y)

3)参数         x:点的横坐标         y:点的纵坐标

4)例子

u8g.drawPixel(14, 23);

1.png (1.07 KB, 下载次数: 52)

2017-1-8 15:31 上传

>  drawLine//画一条线段1)方法定义u8g.drawLine(u8g_uint_t x1, u8g_uint_t y1, u8g_uint_t x2, u8g_uint_t y2)

3)参数

x1: 线段起点 横坐标         y1: 线段起点 纵坐标         x2: 线段终点 横坐标         y2: 线段终点 纵坐标

4)例子

u8g.drawLine(7, 10, 40, 55);

2.png (1.39 KB, 下载次数: 56)

2017-1-8 15:31 上传

>  drawHLine        //画一条向右的水平线段1)方法定义u8g.drawHLine(u8g_uint_t x, u8g_uint_t y, u8g_uint_t w)

3)参数         x:线段起点 横坐标         y:线段起点 纵坐标         w:水平宽度(w个像素点)

4)例子见最下边的drawVLine。

>  drawVLine//画一条向下的垂直线段1)方法定义

u8g.drawHLine(u8g_uint_t x, u8g_uint_t y, u8g_uint_t h)

3)参数         x:线段起点 横坐标         y:线段起点 纵坐标         h:垂直高度(h个像素点)

4)例子

u8g.drawHLine(60,12, 30);

u8g.drawVLine(10,20, 20);

>  drawTriangle//画一个实心的三角形。至于空心三角形用drawLine即可画出。1)方法定义

u8g.drawTriangle(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2)

3)参数         x0:其中一角的 横坐标         y0:其中一角的 纵坐标         x1:另一角的 横坐标         y1:另一角的 纵坐标

x2:最后一角的 横坐标         y2:最后一角的 纵坐标

4)例子

u8g.drawTriangle(14,9, 45,32, 9,42);   //第一个三角形

u8g.drawTriangle(14,55, 45,33, 9,43);   //第二个三角形

>  drawFrame// 画一个空心矩形1)方法定义

u8g.drawFrame(u8g_uint_t x, u8g_uint_t y, u8g_uint_t w, u8g_uint_t h)

3)参数

x:方框左上角点的横坐标         y:方框左上角点的纵坐标         w:方框的宽         h:方框的高

4)例子

u8g.drawFrame(10, 12, 30, 20); // 方框的长宽包括了边框所在的像素点

>  drawRFrame//画一个圆角空心矩形1)方法定义

u8g.drawRFrame(u8g_uint_t x, u8g_uint_t y, u8g_uint_t w, u8g_uint_t h, u8g_uint_t r)

其中 最好满足:w>=2x(r+1), h>=2x(r+1)。

3)参数

x:圆角矩形左上角 横坐标y:圆角矩形左上角 纵坐标w:圆角矩形 宽度h:圆角矩形 高度r:圆角弧度的半径

4)例子u8g.drawRFrame(10,12, 30,20, 5);

3.png (1.59 KB, 下载次数: 51)

2017-1-8 15:31 上传

>  drawBox//画一个实心矩形

1)方法定义

u8g.drawBox(u8g_uint_t x, u8g_uint_t y, u8g_uint_t w, u8g_uint_t h)

3)参数x:矩形左上角的 横坐标y:矩形左上角的 纵坐标w:矩形的 宽h:矩形的 高

4)例子

u8g.drawBox(10,12,20,30);

>  drawRBox//画一个圆角实心矩形,与drawRFrame类似。

1)方法定义u8g.drawRBox(u8g_uint_t x, u8g_uint_t y, u8g_uint_t w, u8g_uint_t h, u8g_uint_t r)

3)参数

x:圆角矩形左上角 横坐标y:圆角矩形左上角 纵坐标w:矩形的 宽h:矩形的 高r:圆角弧度半径

>  drawCircle//画一个空心圆

1)方法定义

u8g.drawCircle(u8g_uint_t x0, u8g_uint_t y0, u8g_uint_t rad, uint8_t opt = U8G_DRAW_ALL)

3)参数x0:圆心 横坐标y0:圆心 纵坐标rad:半径opt:

U8G_DRAW_UPPER_RIGHT        上部右侧 1/4 圆弧

U8G_DRAW_UPPER_LEFT          上部左侧 1/4 圆弧

U8G_DRAW_LOWER_LEFT         下部左侧 1/4 圆弧

U8G_DRAW_LOWER_RIGHT       下部右侧 1/4 圆弧

U8G_DRAW_ALL                          整圆(默认)

4)例子

u8g.drawCircle(20,20, 14); //整圆

u8g.drawCircle(20,20, 14, U8G_DRAW_UPPER_RIGHT); //  1/4 圆

>  drawDisc//画一个实心圆,直径=2*rad+1

1)方法定义

u8g.drawDisc(u8g_uint_t x0, u8g_uint_t y0, u8g_uint_t rad, uint8_t opt = U8G_DRAW_ALL)

3)参数

x0:圆心 横坐标y0:圆心 纵坐标rad:半径opt:

U8G_DRAW_UPPER_RIGHT        上部右侧 1/4 扇形

U8G_DRAW_UPPER_LEFT          上部左侧 1/4 扇形

U8G_DRAW_LOWER_LEFT         下部左侧 1/4 扇形

U8G_DRAW_LOWER_RIGHT       下部右侧 1/4 扇形

U8G_DRAW_ALL                          整圆(默认)

>  drawEllipse//圆一个椭圆(空心)

1)方法定义

u8g.drawEllipse(u8g_uint_t x0, u8g_uint_t y0, u8g_uint_t rx, u8g_uint_t ry, uint8_t opt)

3)参数

x0,y0:椭圆圆心 横、纵坐标rx:水平方向半径ry:垂直方向半径opt:

U8G_DRAW_UPPER_RIGHT        上部右侧 1/4 椭圆弧

U8G_DRAW_UPPER_LEFT          上部左侧 1/4 椭圆弧

U8G_DRAW_LOWER_LEFT         下部左侧 1/4 椭圆弧

U8G_DRAW_LOWER_RIGHT       下部右侧 1/4 椭圆弧

U8G_DRAW_ALL                          整圆(默认)

4)例子

u8g.drawEllipse(20,20, 14,17);//相同圆心的椭圆与圆

u8g.drawCircle(20,20, 14);

(示意图,椭圆实际效果好)

>  drawFilledEllipse//画一个椭圆(实心)

1)方法定义

u8g.drawFilledEllipse(u8g_uint_t x0, u8g_uint_t y0, u8g_uint_t rx, u8g_uint_t ry, uint8_t opt)

3)参数

x0,y0:椭圆圆心 横、纵坐标rx:水平方向半径ry:垂直方向半径opt:

U8G_DRAW_UPPER_RIGHT        上部右侧 1/4 椭圆

U8G_DRAW_UPPER_LEFT          上部左侧 1/4 椭圆

U8G_DRAW_LOWER_LEFT         下部左侧 1/4 椭圆

U8G_DRAW_LOWER_RIGHT       下部右侧 1/4 椭圆

U8G_DRAW_ALL                          整圆(默认)

------------------------------------------------字符显示-------------------------------------------------------------------------------------

>  drawStr//显示字符,使用前要使用setFont函数设置要显示字符的字体

1)方法定义

u8g.drawStr(u8g_uint_t x, u8g_uint_t y, const char *s)

另外还有drawStr90(); drawStr180(); drawStr270();使字符顺时针旋转响应的角度。

3)参数

x:字符左下角的横坐标y:字符左下角的纵坐标*s:要显示的字符

4)例子

u8g.setFont(u8g_font_osb18);

u8g.drawStr(0, 20, "ABC");

u8g.drawStr90(0,20, "ABC"); //字符旋转90度

1.png (1.57 KB, 下载次数: 39)

2017-1-7 17:18 上传

>  print//打印要显示的字符,包括变量值、字符串等。

1)方法定义

u8g.print(...)//使用前需用setPrintPos()函数设置位置

---------------------------------------------------------图形显示-------------------------------------------------------

>  drawXBMP//此函数是一个显示一个位图的方法。

1)方法定义

u8g.(u8g_uint_t x, u8g_uint_t y, u8g_uint_t w, u8g_uint_t h, const u8g_pgm_uint8_t *bitmap)

3)参数

x:位图左上角的横坐标y:位图左上角的纵坐标w:位图的宽h:位图的高

//bitmap:位图对象PS:在任何画图软件中,必须把图片属性调位单位图1bit

4)例子

static unsigned char u8g_logo_bits[] U8G_PROGMEM = {

0xff, 0xff, 0xff, 0xff, 0x3f,   0xff, 0xff, 0xff, 0xff, 0x3f,   0xe0, 0xe0, 0xff, 0xff, 0x3f,

0xe3, 0xe1, 0xff, 0xff, 0x3f,   0xf3, 0xf1, 0xff, 0xff, 0x3f,   0xf3, 0xf1, 0xfe, 0xbf, 0x37,

0xf3, 0x11, 0x1c, 0x1f, 0x30,   0xf3, 0x01, 0x08, 0x8c, 0x20,   0xf3, 0x01, 0x00, 0xc0, 0x39,

0xf3, 0x81, 0xc7, 0xc1, 0x39,   0xf3, 0xc1, 0xc7, 0xc9, 0x38,   0xf3, 0xc1, 0xc3, 0x19, 0x3c,

0xe3, 0x89, 0x01, 0x98, 0x3f,   0xc7, 0x18, 0x00, 0x08, 0x3e,   0x0f, 0x3c, 0x70, 0x1c, 0x30,

0x3f, 0xff, 0xfc, 0x87, 0x31,   0xff, 0xff, 0xbf, 0xc7, 0x23,   0x01, 0x00, 0x00, 0xc6, 0x23,

0x03, 0x00, 0x00, 0x0e, 0x30,   0xff, 0xff, 0x3f, 0x1f, 0x3c,   0xff, 0xff, 0x3f, 0xff, 0x3f,

0xff, 0xff, 0x3f, 0xff, 0x3f,   0xff, 0xff, 0xff, 0xff, 0x3f,   0xff, 0xff, 0xff, 0xff, 0x3f

};    //数据可以自行下载一个 “字模提取”软件,方便、简洁、中文。

u8g.drawXBMP( 0, 0, 38, 24, u8g_logo_bits);

>  drawBitmapP//此函数是一个显示一个位图的方法。

1)方法定义

u8g.drawBitmapP(u8g_uint_t x, u8g_uint_t y, u8g_uint_t cnt, u8g_uint_t h, const u8g_pgm_uint8_t *bitmap)

3)参数

x:位图左上角的横坐标y:位图左上角的纵坐标cnt:在水平方向上的位图的字节数。该位图的宽度是cnt* 8(1字节=8位)

h:位图的高*bitmap:位图对象PS:在任何画图软件中,必须把图片属性调位单位图1bit

4)例子

const uint8_t rook_bitmap[] U8G_PROGMEM = {

0x00,         // 00000000

0x55,         // 01010101

0x7f,          // 01111111

0x3e,         // 00111110

0x3e,         // 00111110

0x3e,         // 00111110

0x3e,         // 00111110

0x7f           // 01111111

};

u8g.drawBitmapP(0,0, 1, 8, rook_bitmap);

2.png (1.03 KB, 下载次数: 48)

2017-1-7 17:20 上传

------------------------------------------------------获取----------------------------------------------------------------------------------------------------------

>  getHeight//获得屏幕的高度,本函数放置在picture loop里面或外部皆可

1)方法定义

u8g.getHeight(void)

3)返回值

"屏幕高度"

>  getWidth//获得屏幕宽度,本函数放置在picture loop里面或外部皆可

1)方法定义

u8g.getWidth(void)

3)返回值

"屏幕宽度"

4)例子

w = u8g.getWidth();

h = u8g.getHeight();

3.png (27.55 KB, 下载次数: 42)

2017-1-7 17:20 上传

>  getStrWidth//获得所显示字符串的宽度,即按照不同字体显示的字符串共占了多少像素。

1)方法定义

u8g.getStrWidth(const char *s)

3)返回值

"字符串的宽度"

4)例子

int w;    //设置一个存储变量

u8g.setFont(u8g_font_osb18); //设置字体

u8g.drawStr(0,20, "ABC");

w = u8g.getStrWidth("ABC"); //获得显示的字符串宽度

u8g.drawFrame(0,10, w,11); //画一个以获得的字符串宽度为宽度的方框。

4.png (1.73 KB, 下载次数: 51)

2017-1-7 17:21 上传

------------------------------------------------------设置显示属性----------------------------------------------------------------------------------------------------------

>  setFont//设置要显示字符的字体。

1)方法定义

u8g.setFont(const u8g_fntpgm_uint8_t *font)

3)参数

*font:字体样式。u8glib提供的字体样式>  setPrintPos//设置下文中print()的显示位置

1)方法定义

u8g.setPrintPos(u8g_uint_t x, u8g_uint_t y)

3)参数

x:横坐标         y:纵坐标

>  setColorIndex  //对于单色OLED,此函数功能为是否显示对象。可以理解为透明还是不透明。对于有灰度值的屏幕则是一个灰度值。

1)方法定义

u8g.setColorIndex(uint8_t color_index)

3)参数

color_index:①1:表示显示,不透明

②0:表示不显示,透明。

4)例子

u8g.setColorIndex(1);

u8g.drawBox(10, 12, 20, 30);

u8g.setColorIndex(0);

u8g.drawPixel(28, 14); // 点亮一个 点,位置在 (28, 14)

5.png (1.49 KB, 下载次数: 44)

2017-1-7 17:21 上传

>  setRot90 or 180 or 270 //将显示的结果旋转90°或180°或270°

1)方法定义

u8g.setRot90()

u8g.setRot180()

u8g.setRot270()

3)参数

4)例子

u8g.setFont(u8g_font_osb18);//正常显示

u8g.drawStr(0,20, "ABC");

u8g.setRot90(); //旋转90°      : or setRot180();  setRot270();

u8g.setFont(u8g_font_osb18);

u8g.drawStr(0,20, "ABC");

>  setFontPosTop//使用drawStr显示字符串时,默认标准为显示字符的左下角坐标。(参考

u8g.setFontPosTop(void)  //本函数可理解为将坐标位置改为显示字符串的左上角为坐标标准。具体用法可参考例子。

3)例子

u8g.setFont(u8g_font_osb18);

u8g.setFontPosTop();

u8g.drawStr(0, 20, "ABC");

END

嘻嘻,别忘了打赏哦。大家新年快乐。

<think>我们正在使用0.96寸OLED幕(通常为128x64分辨率,驱动芯片为SSD1306),并希望在其上绘制圆角矩形。 参考引用内容,特别是引用[4]提到了使用U8g2图形来在OLED显示U8g2是一个强大的嵌入式图形,支持多种显示器,包括SSD1306驱动的OLED。 因此,我们可以通过移植U8g2,然后使用其提供的绘制圆角矩形函数来实现。 步骤: 1. 确保已经将U8g2移植到你的单片机(如STM32)上。引用[2][4]都提到了U8g2在STM32上的移植。 2. 在代码中包含U8g2的头文件。 3. 初始化OLED幕(通过I2C或SPI,根据你的硬件连接)。 4. 使用U8g2提供的绘制圆角矩形函数U8g2中绘制圆角矩形函数是`drawRBox`或`drawRFrame`(具体取决于你是要填充的还是空心的)。 - `drawRFrame`: 绘制空心圆角矩形 - `drawRBox`: 绘制实心圆角矩形 函数原型(以C++为例,但我们在C中也可以类似使用): void drawRBox(u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t w, u8g2_uint_t h, u8g2_uint_t r); void drawRFrame(u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t w, u8g2_uint_t h, u8g2_uint_t r); 参数说明: x, y: 圆角矩形左上角的坐标 w, h: 圆角矩形的宽度高度 r: 圆角的半径 注意:在绘制之前,需要设置绘制颜色(U8g2支持单色显示器,通常有白色黑色两种,具体取决于你的显示器)。 示例代码(基于STM32 HAL,使用U8g2): 1. 首先,我们需要定义U8g2对象并配置其通信方式(比如I2C): u8g2_t u8g2; // 初始化函数,根据你的硬件连接选择初始化函数,例如: u8g2_Setup_ssd1306_i2c_128x64_noname_f(&u8g2, U8G2_R0, u8x8_byte_hw_i2c, u8x8_gpio_and_delay); // 使用硬件I2C 2. 初始化U8g2u8g2_InitDisplay(&u8g2); u8g2_SetPowerSave(&u8g2, 0); // 唤醒显示器 3. 绘制圆角矩形u8g2_ClearBuffer(&u8g2); // 清除内部缓冲区 u8g2_SetDrawColor(&u8g2, 1); // 设置颜色为白色(1表示亮,0表示灭) // 绘制一个圆角矩形,位置(10,10),宽100,高40,圆角半径5 u8g2_DrawRBox(&u8g2, 10, 10, 100, 40, 5); // 实心圆角矩形 // 或者绘制空心圆角矩形u8g2_DrawRFrame(&u8g2, 10, 10, 100, 40, 5); u8g2_SendBuffer(&u8g2); // 将缓冲区内容发送到显示显示 注意:在移植U8g2时,需要实现底层的通信函数(如I2C的读写)延时函数。引用[2][4]提供了移植方法。 如果你还没有移植U8g2,可以参考引用[4]中提到的移植步骤,或者引用[2]中关于U8g2移植的部分。 另外,引用[3]提到了OLED模块的电路连接,包括I2C地址的选择(默认0x3C或0x3D),在初始化U8g2时需要正确设置地址。 总结:使用U8g2图形提供的圆角矩形绘制函数可以方便地实现需求。重点在于正确移植U8g2并配置好通信。 如果不想使用U8g2,也可以自己编写绘制圆角矩形函数,但这样会比较复杂,需要计算圆角部分(通常使用圆弧或贝塞尔曲线)。因此,使用现有的图形是更高效的方法。 相关问题: 1. 如何移植U8g2到STM32单片机? 2. U8g2支持哪些图形绘制函数? 3. 如何设置OLED的I2C地址? 4. 如何优化OLED显示以降低闪烁? 5. 圆角矩形的圆角半径如何影响显示效果?</think>### 单片机0.96寸OLED显示圆角矩形实现方法 在0.96寸OLED(通常为SSD1306驱动,128×64分辨率)上绘制圆角矩形,推荐使用**U8g2图形**实现。以下是具体步骤: --- #### 一、移植U8g2(参考引用[4]) 1. **获取U8g2** 从GitHub下载源码:[https://github.com/olikraus/u8g2](https://github.com/olikraus/u8g2) 2. **移植到工程** - 将`u8g2/csrc`目录下的`.c`文件添加到工程 - 包含头文件路径:`u8g2/csrc` - 实现硬件接口函数(I2C/SPI通信延时函数),例如: ```c // 示例:I2C字节传输函数(STM32 HAL) uint8_t u8x8_byte_hw_i2c(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr) { switch(msg) { case U8X8_MSG_BYTE_SEND: HAL_I2C_Master_Transmit(&hi2c1, OLED_ADDR, (uint8_t*)arg_ptr, arg_int, 100); break; case U8X8_MSG_BYTE_INIT: /* 初始化I2C */ break; case U8X8_MSG_BYTE_SET_DC: /* 无操作 */ break; } return 0; } ``` --- #### 二、绘制圆角矩形 U8g2提供直接绘制圆角矩形函数: ```c #include "u8g2.h" // 1. 初始化U8g2对象 u8g2_t u8g2; u8g2_Setup_ssd1306_i2c_128x64_noname_f(&u8g2, U8G2_R0, u8x8_byte_hw_i2c, u8x8_gpio_and_delay); // 2. 初始化显示 u8g2_InitDisplay(&u8g2); u8g2_SetPowerSave(&u8g2, 0); // 唤醒幕 // 3. 绘制圆角矩形 u8g2_ClearBuffer(&u8g2); // 清空缓冲区 // 空心圆角矩形(参数:x坐标, y坐标, 宽度, 高度, 圆角半径) u8g2_DrawRFrame(&u8g2, 20, 10, 80, 40, 8); // 实心圆角矩形 u8g2_DrawRBox(&u8g2, 30, 20, 60, 30, 5); u8g2_SendBuffer(&u8g2); // 发送到显示 ``` --- #### 三、关键参数说明 | 参数 | 说明 | |------------|----------------------------------------------------------------------| | **坐标系统** | 原点(0,0)在左上角,X向右增加,Y向下增加(128×64范围) | | **圆角半径** | 值越大圆角越明显,建议范围:3~10(避免半径过大导致图形变形) | | **颜色控制** | `u8g2_SetDrawColor(&u8g2, 1)`设置白色(单色只有0/1两种颜色) | --- #### 四、硬件注意事项(参考引用[3]) 1. **I2C地址** 默认地址为`0x3C`(7位地址),若模块有SA0跳线可改为`0x3D`。 2. **电压匹配** 确保OLED供电为3.3V(可通过XC6206P332等稳压器降压)[^3]。 --- #### 五、手动绘制方法(无U8g2时) 若需底层实现,核心算法是**组合直线圆弧**: ```c // 伪代码:绘制圆角矩形 void draw_rounded_rect(int x, int y, int w, int h, int r) { // 1. 绘制四条直线边 draw_hline(x + r, y, w - 2*r); // 上边 draw_hline(x + r, y + h-1, w - 2*r); // 下边 draw_vline(x, y + r, h - 2*r); // 左边 draw_vline(x + w-1, y + r, h - 2*r); // 右边 // 2. 绘制四个圆角(90度圆弧) draw_corner(x + r, y + r, r, 0); // 左上角(从0°到90°) draw_corner(x + w - r - 1, y + r, r, 90); // 右上角 draw_corner(x + r, y + h - r - 1, r, 270); // 左下角 draw_corner(x + w - r - 1, y + h - r - 1, r, 180); // 右下角 } ``` > 圆弧绘制可使用**Bresenham算法**或查表法优化性能[^4]。 --- ### 相关问题 1. **如何优化圆角矩形显示速度?** 使用U8g2的`Buffer`模式(`_f`后缀函数)可减少幕刷新次数[^4]。 2. **圆角半径过大导致图形重叠怎么办?** 需满足:$2 \times \text{半径} \leq \min(\text{宽度}, \text{高度})$,否则自动降为直角矩形。 3. **如何实现动态圆角矩形(如按钮动画)?** 结合`u8g2_DrawRBox``u8g2_SetDrawColor`交替绘制实心/空心矩形。 4. **移植U8g2时I2C通信失败如何排查?** 检查地址(0x3C/0x3D)、上拉电阻、SCL/SDA波形(示波器)[^3]。 5. **圆角矩形边框粗细如何调整?** U8g2原生不支持,可通过嵌套两个不同半径的`DrawRFrame`实现: ```c u8g2_DrawRFrame(&u8g2, x, y, w, h, r); // 外框 u8g2_DrawRFrame(&u8g2, x+1, y+1, w-2, h-2, r-1); // 内框 ``` [^1]: OLED显示原理基于行列交叉点控制LED亮灭 [^2]: U8g2在STM32上的移植需实现底层通信接口 [^3]: OLED模块需3.3V供电且I2C地址可配置 [^4]: U8g2是专为小型OLED优化的图形
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值