U8G2 API介绍
目录
- U8G2 API介绍
- 1.u8g2 API爆炸图
- 2.u8g2 API
- 2.1 基本函数
- 2.2 常用绘制函数
- 2.2.1 u8g2_DrawPixel
- 2.2.2 u8g2_DrawLine
- 2.2.3 u8g2_DrawHLine和u8g2_DrawVLine
- 2.2.4 u8g2_DrawBox
- 2.2.5 u8g2_DrawButtonUTF8
- 2.2.6 u8g2_DrawCircle和u8g2_DrawDisc
- 2.2.7 u8g2_DrawEllipse和u8g2_DrawFilledEllipse
- 2.2.8 u8g2_DrawFrame
- 2.2.9 u8g2_DrawGlyph和u8g2_DrawGlyphX2
- 2.2.10 u8g2_DrawRBox和u8g2_DrawRFrame
- 2.2.11 u8g2_DrawStr和u8g2_DrawStrX2
- 2.2.12 u8g2_DrawUTF8和u8g2_DrawUTF8X2
- 2.2.13 u8g2_DrawTriangle
- 2.2.14 u8g2_DrawXBM和u8g2_DrawXBMP
- 2.3 特殊功能函数(输入框、下拉列表等)
- 2.3.1 屏幕截图、捕获
- 2.3.2 下拉列表
- 2.3.3 信息提示
- 2.3.4 用户输入信息显示
- 2.3.5 setMaxClipWindow和u8g2_SetClipWindow
- 2.3.6 更改字形和字符串绘制函数的参考位置
- 2.3.8 u8g2_SetFontDirection
- 2.3.9 u8g2_SetFlipMode
- 2.3.10 u8g2_SetDisplayRotation
- 2.3.11 u8g2_SetBitmapMode
- 2.3.12 u8g2_GetUTF8Width和u8g2_GetStrWidth
- 2.3.13 getMaxCharWidth和getMaxCharHeight
- 2.3.14 getDisplayWidth和u8g2_GetDisplayHeight
- 2.3.15 u8g2_GetU8x8
- 2.3.16 u8g2_GetDescent和u8g2_GetAscent
- 2.4 不常用或者废弃的函数
- 3. 说明
1.u8g2 API爆炸图
2.u8g2 API
2.1 基本函数
2.1.1 u8g2_t u8g2;
u8g2_t u8g2; // 显示结构体,重要
2.1.2 void u8g2_Setup_xx_xx_x
u8g2_Setup_st7567_jlx12864_f(u8g2, U8G2_R0, u8x8_byte_4wire_sw_spi, u8g2_gpio_and_delay); // 初始化 u8g2 结构体
初始化u8g2:
- 第1个参数是u8g2指针
- 第2个参数是解决,有3个选项
U8G2_R0 无旋转,横向
U8G2_R1 顺时针旋转90度
U8G2_R2 顺时针旋转180度
U8G2_R3 顺时针旋转270度
U8G2_MIRROR 无旋转,横向,显示镜像(v2.6.x)
- 第3个参数是SPI读写回调函数
- 第4个参数是gpio操作和延时函数,修改为实际使用的GPIO模拟SPI时序
2.1.3 u8g2_InitDisplay
u8g2_InitDisplay(u8g2);// 根据所选的芯片进行初始化工作,初始化完成后,显示器处于关闭状态
2.1.4 u8g2_SetPowerSave
u8g2_SetPowerSave(u8g2, 0); // 唤醒显示器,打开或关闭显示
2.1.4 u8g2_SetContrast
u8g2_SetContrast(u8g2, 100);//设置对比度
2.1.5 u8g2_ClearBuffer
u8g2_ClearBuffer(u8g2);//清除显示缓存
2.1.6 u8g2_init
上面的5个函数被封闭为了一个函数,这个是通用的。
void u8g2_init(u8g2_t *u8g2)
{
u8g2_Setup_st7567_jlx12864_f(u8g2, U8G2_R0, u8x8_byte_4wire_sw_spi, u8g2_gpio_and_delay); // 初始化 u8g2 结构体
u8g2_InitDisplay(u8g2);// 根据所选的芯片进行初始化工作,初始化完成后,显示器处于关闭状态
u8g2_SetPowerSave(u8g2, 0); // 唤醒显示器
u8g2_SetContrast(u8g2, 100);//设置对比度
u8g2_ClearBuffer(u8g2);//清除显示缓存
}
2.1.7 u8g2_FirstPage
u8g2_FirstPage(&u8g2); //此命令是(图片)循环的一部分,用于渲染显示内容。此命令必须与nextPage一起使用。
2.1.8 u8g2_NextPage
u8g2_NextPage(&u8g2); //此命令是(图片)循环的一部分,用于渲染显示内容。此命令必须与firstPage一起使用。
2.2 常用绘制函数
2.2.1 u8g2_DrawPixel
/* 画一个点,坐标(x0,y0)
* @param x x轴起始位置
* @param y y轴起始位置
*/
void u8g2_DrawPixel(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y); //画一个点
测试代码:
u8g2_FirstPage(&u8g2);
do
{
for(x=0; x<128; )
{
u8g2_DrawPixel(&u8g2, x, 31);
x+=2;
}
} while (u8g2_NextPage(&u8g2));
显示效果:
2.2.2 u8g2_DrawLine
/* 画一个条线,开始坐标(x0,y0),终点坐标(x1,y1)
* @param x0 x轴起始位置
* @param y0 y轴起始位置
* @param x1 x轴终点位置
* @param y1 y轴终点位置
*/
void u8g2_DrawLine(u8g2_t *u8g2, u8g2_uint_t x0, u8g2_uint_t y0, u8g2_uint_t x1, u8g2_uint_t y1);
测试代码:
u8g2_FirstPage(&u8g2);
do
{
u8g2_DrawLine(&u8g2, 0, 31, 127, 31);
u8g2_DrawLine(&u8g2, 0, 0, 127, 63);
} while (u8g2_NextPage(&u8g2));
显示效果(可以看到画斜线的效果并不好):
2.2.3 u8g2_DrawHLine和u8g2_DrawVLine
/* 画一个条横线,开始坐标(x,y),宽度w
* @param x x轴起始位置
* @param y y轴起始位置
* @param w 线的宽度
*/
void u8g2_DrawHLine(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t w);
/* u8g2_DrawVLine,画一条垂直线,高度是h
* @param x x轴起始位置
* @param y y轴起始位置
* @param h 线的高度
*/
void u8g2_DrawVLine(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t h);
2.2.4 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_FirstPage(&u8g2);
do
{
u8g2_DrawBox(&u8g2, 0, 47, 29, 16);
u8g2_DrawBox(&u8g2, 29+4, 47, 29, 16);
u8g2_DrawBox(&u8g2, 29*2+4*2, 47, 29, 16);
u8g2_DrawBox(&u8g2, 29*3+4*3, 47, 29, 16);
} while (u8g2_NextPage(&u8g2));
显示效果(代码画了4个矩形,间隔是4个像素,宽度29,调试16):
2.2.5 u8g2_DrawButtonUTF8
/* 绘制一个文本框
* @param x x轴起始位置
* @param y y轴起始位置
* @param flags 选项,可以设置文本框的样式
* - U8G2_BTN_BW0:文本周围没有边框
* - U8G2_BTN_BW1:文本周围有1px边框
* - U8G2_BTN_BW2:文本周围有2px边框
* - U8G2_BTN_BW3:文本周围有3px边框
* - U8G2_BTN_SHADOW0
* - U8G2_BTN_SHADOW1
* - U8G2_BTN_SHADOW2
* - U8G2_BTN_INV:文字反转显示
* - U8G2_BTN_HCENTER
* - U8G2_BTN_XFRAME:在文字外框周围再加一层外框
* @param width 文本的最小宽度。一般设置为0,表示文本宽度适用于框架
* @param padding_h 文字与框之间前后的间隔
* @param padding_v 文字与框之间上下的间隔
* @param text:要显示的文字
*/
void u8g2_DrawButtonUTF8(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t flags, u8g2_uint_t width, u8g2_uint_t padding_h, u8g2_uint_t padding_v, const char *text);
测试代码:
u8g2_FirstPage(&u8g2);
do
{
u8g2_SetFont(&u8g2, u8g2_font_amstrad_cpc_extended_8r);
u8g2_DrawButtonUTF8(&u8g2, 5, 20, U8G2_BTN_BW1, 0, 1, 1, "Btn1");
u8g2_DrawButtonUTF8(&u8g2, 5, 40, U8G2_BTN_BW1|U8G2_BTN_XFRAME, 0, 1, 1, "Btn2");
u8g2_DrawButtonUTF8(&u8g2, 5, 60, U8G2_BTN_BW1|U8G2_BTN_XFRAME|U8G2_BTN_INV, 0, 1, 1, "Btn3");
} while (u8g2_NextPage(&u8g2));
显示效果:
2.2.6 u8g2_DrawCircle和u8g2_DrawDisc
/* 绘制一个圆
* @param x0 圆心的x坐标
* @param y0 圆心的y坐标
* @param rad 圆的半径,圆的直径是2*rad+1
* @param h 样式选项
* - U8G2_DRAW_UPPER_RIGHT:只画圆的右上部分
* - U8G2_DRAW_UPPER_LEFT:只画圆的左上部分
* - U8G2_DRAW_LOWER_LEFT:只画圆的左下部分
* - U8G2_DRAW_LOWER_RIGHT:只画圆的右下部分
* - U8G2_DRAW_ALL:画一个完整的圆
*/
void u8g2_DrawCircle(u8g2_t *u8g2, u8g2_uint_t x0, u8g2_uint_t y0, u8g2_uint_t rad, uint8_t opt);
/* 绘制一个实心圆,参数和u8g2_DrawCircle一样
*/
void u8g2_DrawDisc(u8g2_t *u8g2, u8g2_uint_t x0, u8g2_uint_t y0, u8g2_uint_t rad, uint8_t opt);
测试代码:
u8g2_FirstPage(&u8g2);
do
{
u8g2_DrawCircle(&u8g2, 20, 20, 20, U8G2_DRAW_ALL);
u8g2_DrawCircle(&u8g2, 60, 20, 20, U8G2_DRAW_UPPER_RIGHT|U8G2_DRAW_LOWER_LEFT);
} while (u8g2_NextPage(&u8g2));
显示效果:
2.2.7 u8g2_DrawEllipse和u8g2_DrawFilledEllipse
/* 绘制一个椭圆
* @param x0 圆心的x坐标
* @param y0 圆心的y坐标
* @param rx 椭圆x轴方向的大小
* @param ry 椭圆y轴方向的大小
* @param h 样式选项
* - U8G2_DRAW_UPPER_RIGHT:只画圆的右上部分
* - U8G2_DRAW_UPPER_LEFT:只画圆的左上部分
* - U8G2_DRAW_LOWER_LEFT:只画圆的左下部分
* - U8G2_DRAW_LOWER_RIGHT:只画圆的右下部分
* - U8G2_DRAW_ALL:画一个完整的圆
*/
void u8g2_DrawEllipse(u8g2_t *u8g2, u8g2_uint_t x0, u8g2_uint_t y0, u8g2_uint_t rx, u8g2_uint_t ry, uint8_t opt);
/* 绘制一个填充的椭圆,参数和u8g2_DrawEllipse一样
*/
void u8g2_DrawFilledEllipse(u8g2_t *u8g2, u8g2_uint_t x0, u8g2_uint_t y0, u8g2_uint_t rx, u8g2_uint_t ry, uint8_t opt);
测试代码
u8g2_FirstPage(&u8g2);
do
{
u8g2_DrawEllipse(&u8g2, 20, 20, 5, 10, U8G2_DRAW_ALL);
u8g2_DrawEllipse(&u8g2, 60, 20, 5, 10, U8G2_DRAW_UPPER_RIGHT|U8G2_DRAW_LOWER_LEFT);
} while (u8g2_NextPage(&u8g2));
显示效果:
2.2.8 u8g2_DrawFrame
/* 绘制一个矩形框
* @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_FirstPage(&u8g2);
do
{
u8g2_DrawFrame(&u8g2, 0, 47, 29, 16);
u8g2_DrawFrame(&u8g2, 29+4, 47, 29, 16);
u8g2_DrawFrame(&u8g2, 29*2+4*2, 47, 29, 16);
u8g2_DrawFrame(&u8g2, 29*3+4*3, 47, 29, 16);
} while (u8g2_NextPage(&u8g2));
显示效果:
2.2.9 u8g2_DrawGlyph和u8g2_DrawGlyphX2
/* 绘制单个字符
* @param x 字符坐标x
* @param y 字符坐标y
* @param encoding 字符编号,这个与制作的字符有关
*/
u8g2_uint_t u8g2_DrawGlyph(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, uint16_t encoding);
/* 显示的字符放大一倍
*/
u8g2_uint_t u8g2_DrawGlyphX2(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, uint16_t encoding);
u8g2_FirstPage(&u8g2);
do
{
u8g2_SetFont(&u8g2, u8g2_font_open_iconic_embedded_6x_t);
u8g2_DrawGlyph(&u8g2, 5, 60, 65);
u8g2_DrawGlyph(&u8g2, 55, 60, 67);
} while (u8g2_NextPage(&u8g2));
显示效果:
2.2.10 u8g2_DrawRBox和u8g2_DrawRFrame
/* 绘制圆角实心框
* @param x 起始坐标x
* @param y 起始坐标y
* @param w 宽度
* @param h 高度
* @param r 圆角半径
*/
void u8g2_DrawRBox(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t w, u8g2_uint_t h, u8g2_uint_t r);
/* 绘制圆角框(空心),参数和u8g2_DrawRBox一样
*/
void u8g2_DrawRFrame(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t w, u8g2_uint_t h, u8g2_uint_t r);
测试代码:
u8g2_FirstPage(&u8g2);
do
{
u8g2_DrawRBox(&u8g2, 10, 15, 30, 22, 7);
u8g2_DrawRFrame(&u8g2, 50, 15, 30, 22, 7);
} while (u8g2_NextPage(&u8g2));
显示效果:
2.2.11 u8g2_DrawStr和u8g2_DrawStrX2
/* 写一个字符串,不支持中文
* @param x 起始坐标x
* @param y 起始坐标y
* @param s 要显示的字符串
*/
u8g2_uint_t u8g2_DrawStr(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, const char *s);
/* 放大一倍显示,参数和u8g2_DrawStr一样
*/
u8g2_uint_t u8g2_DrawStrX2(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, const char *s);
测试代码:
u8g2_FirstPage(&u8g2);
do
{
u8g2_SetFont(&u8g2, u8g2_font_amstrad_cpc_extended_8r);
u8g2_DrawStr(&u8g2, 0,15,"Hello World!");
u8g2_DrawStrX2(&u8g2, 0,45,"Hello World!");
} while (u8g2_NextPage(&u8g2));
显示效果:
2.2.12 u8g2_DrawUTF8和u8g2_DrawUTF8X2
/* 写一个字符串,支持中文
* @param x 起始坐标x
* @param y 起始坐标y
* @param s 要显示的字符串
*/
u8g2_uint_t u8g2_DrawUTF8(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, const char *s);
/* 放大一倍显示,参数和u8g2_DrawUTF8一样
*/
u8g2_uint_t u8g2_DrawUTF8X2(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, const char *s);
2.2.13 u8g2_DrawTriangle
/* 绘制一个三角形,带填充
* @param x0,y0 三角形一个顶点的坐
* @param x1,y1 三角形第二个顶点的坐
* @param 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_FirstPage(&u8g2);
do
{
u8g2_DrawTriangle(&u8g2, 20,5, 27,50, 5,32);
} while (u8g2_NextPage(&u8g2));
显示效果:
2.2.14 u8g2_DrawXBM和u8g2_DrawXBMP
/* 加载一个位图
* @param x0,y0 起始坐标
* @param x1,y1 位图的宽度
* @param x2,y2 位图的高度
*/
void u8g2_DrawXBM(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t w, u8g2_uint_t h, const uint8_t *bitmap);
/* 实际使用和u8g2_DrawXBM一样,官网说是bitmap参数不一样,但是没有发现差别
*/
void u8g2_DrawXBMP(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t w, u8g2_uint_t h, const uint8_t *bitmap);
测试代码:
const uint8_t save[]=
{
0xFF,0xFF,0xFF,0xFF,0x01,0x00,0x00,0x80,0xF1,0xFF,0xFF,0x8F,0xF9,0xFF,0xFF,0x9F,0xFD,0xFF,0xFF,0xBF,0x1D,0x07,0xC0,0xB8,0x1D,0x07,0xC4,0xB8,0x1D,0x07,0xCE,0xB8,
0x1D,0x07,0xCE,0xB8,0x1D,0x07,0xCE,0xB8,0x1D,0x07,0xCE,0xB8,0x1D,0x07,0xCE,0xB8,0x1D,0x07,0xCE,0xB8,0x1D,0x07,0xC4,0xB8,0x1D,0x07,0xC0,0xB8,0x1D,0xFF,0xFF,0xB8,
0x1D,0xFE,0x7F,0xB8,0x1D,0xFC,0x3F,0xB8,0x1D,0x00,0x00,0xB8,0x1D,0x00,0x00,0xB8,0x1D,0x00,0x00,0xB8,0x1D,0x00,0x00,0xB8,0x1D,0x00,0x00,0xB8,0x1D,0x00,0x00,0xB8,
0x1D,0x00,0x00,0xB8,0x1D,0x00,0x00,0xB8,0x1D,0x00,0x00,0xB8,0xFD,0xFF,0xFF,0xBF,0xF9,0xFF,0xFF,0x9F,0xF1,0xFF,0xFF,0x8F,0x01,0x00,0x00,0x80,0xFF,0xFF,0xFF,0xFF,/*C:\Users\escene\Desktop\保存.bmp*/0
/* (32 X 32 )*/
};
const uint8_t recall[]=
{
0xFF,0xFF,0xFF,0xFF,0x01,0x00,0x00,0x80,0x01,0x02,0x00,0x80,0x01,0x03,0x00,0x80,0x81,0x03,0x00,0x80,0xC1,0x03,0x00,0x80,0xE1,0x03,0x00,0x80,0xF1,0x03,0x00,0x80,
0xF9,0xFF,0xFF,0x81,0xFD,0xFF,0xFF,0x83,0xFD,0xFF,0xFF,0x87,0xF9,0xFF,0xFF,0x8F,0xF1,0x03,0x80,0x9F,0xE1,0x03,0x00,0xBE,0xC1,0x03,0x00,0xBC,0x81,0x03,0x00,0xBC,
0x01,0x03,0x00,0xB8,0x01,0x02,0x00,0xB8,0x01,0x00,0x00,0xB8,0x01,0x00,0x00,0xB8,0x01,0x00,0x00,0xB8,0x01,0x00,0x00,0xB8,0x01,0x00,0x00,0xBC,0x01,0x00,0x00,0xBC,
0x01,0x00,0x00,0xBE,0x01,0x00,0x00,0x9F,0x01,0x00,0x80,0x9F,0xF9,0xFF,0xFF,0x8F,0xF9,0xFF,0xFF,0x87,0xF9,0xFF,0xFF,0x81,0x01,0x00,0x00,0x80,0xFF,0xFF,0xFF,0xFF,/*C:\Users\escene\Desktop\撤回.bmp*/0
/* (32 X 32 )*/
};
const uint8_t share[]=
{
0xFF,0xFF,0xFF,0xFF,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0xF9,0xFF,0xC3,0x80,0xFD,0xFF,0x83,0x83,0xFD,0xFF,0x01,0x8F,0x1D,0x00,0x00,0x9E,0x1D,0x00,0xF0,0xBF,
0x1D,0x00,0xFC,0xBF,0x1D,0x00,0xFE,0xBF,0x1D,0x80,0x1F,0x9E,0x1D,0xC0,0x07,0x8F,0x1D,0xC0,0x83,0x83,0x1D,0xE0,0xC1,0x80,0x1D,0xE0,0x00,0x80,0x1D,0xF0,0x00,0x98,
0x1D,0x70,0x00,0x9C,0x1D,0x70,0x00,0x9C,0x1D,0x70,0x00,0x9C,0x1D,0x70,0x00,0x9C,0x1D,0x70,0x00,0x9C,0x1D,0x30,0x00,0x9C,0x1D,0x00,0x00,0x9C,0x1D,0x00,0x00,0x9C,
0x1D,0x00,0x00,0x9C,0x1D,0x00,0x00,0x9C,0x1D,0x00,0x00,0x9C,0xFD,0xFF,0xFF,0x9F,0xFD,0xFF,0xFF,0x9F,0xF9,0xFF,0xFF,0x8F,0x01,0x00,0x00,0x80,0xFF,0xFF,0xFF,0xFF,/*C:\Users\escene\Desktop\bmap\分享\分享.bmp*/0
/* (32 X 32 )*/
};
const uint8_t txt[]=
{
0xFF,0xFF,0xFF,0xFF,0x01,0x00,0x00,0x80,0x01,0xFF,0x1F,0x80,0x81,0xFF,0x3F,0x80,0x81,0x01,0x70,0x80,0x81,0x01,0xF0,0x80,0x81,0x01,0xB0,0x81,0x81,0x01,0x30,0x83,
0x81,0x01,0x30,0x86,0xF1,0xFF,0x33,0x8C,0xF9,0xFF,0xF7,0x8F,0x19,0x00,0xF6,0x8F,0x99,0x7F,0x06,0x8C,0x99,0x7F,0x06,0x8C,0x19,0x0C,0x06,0x8C,0x19,0x0C,0x06,0x8C,
0x19,0x0C,0x06,0x8C,0x19,0x0C,0x06,0x8C,0x19,0x0C,0x06,0x8C,0x19,0x0C,0x06,0x8C,0x19,0x0C,0x06,0x8C,0x19,0x00,0x06,0x8C,0xF9,0xFF,0x07,0x8C,0xF9,0xFF,0x07,0x8C,
0x81,0x01,0x00,0x8C,0x81,0x01,0x00,0x8C,0x81,0x01,0x00,0x8C,0x81,0x01,0x00,0x8C,0x81,0xFF,0xFF,0x8F,0x81,0xFF,0xFF,0x8F,0x01,0x00,0x00,0x80,0xFF,0xFF,0xFF,0xFF,/*C:\Users\escene\Desktop\bmap\txt文件\txt文件.bmp*/0
/* (32 X 32 )*/
};
const uint8_t copy[]=
{
0xFF,0xFF,0xFF,0xFF,0x01,0x00,0x00,0x80,0x01,0xFE,0x7F,0x80,0x01,0xFF,0xFF,0x80,0x01,0x03,0xCC,0x81,0xF1,0x03,0x8C,0x83,0xF9,0x03,0x0C,0x87,0x19,0x03,0x0C,0x8E,
0x19,0x03,0x0C,0x9C,0x19,0x03,0x0C,0x9C,0x19,0x03,0xFC,0x9F,0x19,0x03,0xF8,0x9F,0x19,0x03,0x00,0x98,0x19,0x03,0x00,0x98,0x19,0x03,0x00,0x98,0x19,0x03,0x00,0x98,
0x19,0x03,0x00,0x98,0x19,0x03,0x00,0x98,0x19,0x03,0x00,0x98,0x19,0x03,0x00,0x98,0x19,0x03,0x00,0x98,0x19,0x03,0x00,0x98,0x19,0x03,0x00,0x98,0x19,0x03,0x00,0x98,
0x19,0xFF,0xFF,0x9F,0x19,0xFE,0xFF,0x8F,0x19,0x00,0x00,0x86,0x19,0x00,0x00,0x86,0xF9,0xFF,0xFF,0x87,0xF1,0xFF,0xFF,0x87,0x01,0x00,0x00,0x80,0xFF,0xFF,0xFF,0xFF,/*C:\Users\escene\Desktop\bmap\复制\复制.bmp*/0
/* (32 X 32 )*/
};
const uint8_t previous[]=
{
0xFF,0xFF,0xFF,0xFF,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0xE1,0x03,0x00,0x80,0xE1,0x03,0x00,0x86,0xE1,0x03,0x00,0x87,
0xE1,0x03,0xC0,0x87,0xE1,0x03,0xE0,0x87,0xE1,0x03,0xF0,0x87,0xE1,0x03,0xFC,0x87,0xE1,0x03,0xFE,0x87,0xE1,0x83,0xFF,0x87,0xE1,0xC3,0xFF,0x87,0xE1,0xE3,0xFF,0x87,
0xE1,0xF3,0xFF,0x87,0xE1,0xF3,0xFF,0x87,0xE1,0xE3,0xFF,0x87,0xE1,0x83,0xFF,0x87,0xE1,0x03,0xFF,0x87,0xE1,0x03,0xFC,0x87,0xE1,0x03,0xF8,0x87,0xE1,0x03,0xE0,0x87,
0xE1,0x03,0xC0,0x87,0xE1,0x03,0x00,0x87,0xE1,0x03,0x00,0x86,0xE1,0x03,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0xFF,0xFF,0xFF,0xFF,/*C:\Users\escene\Desktop\bmap\上一个\上一个.bmp*/0
/* (32 X 32 )*/
};
const uint8_t start[]=
{
0xFF,0xFF,0xFF,0xFF,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,
0x01,0x00,0x00,0x80,0x01,0x3E,0x7C,0x80,0x01,0x3E,0x7C,0x80,0x01,0x3E,0x7C,0x80,0x01,0x3E,0x7C,0x80,0x01,0x3E,0x7C,0x80,0x01,0x3E,0x7C,0x80,0x01,0x3E,0x7C,0x80,
0x01,0x3E,0x7C,0x80,0x01,0x3E,0x7C,0x80,0x01,0x3E,0x7C,0x80,0x01,0x3E,0x7C,0x80,0x01,0x3E,0x7C,0x80,0x01,0x3E,0x7C,0x80,0x01,0x3E,0x7C,0x80,0x01,0x00,0x00,0x80,
0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0xFF,0xFF,0xFF,0xFF,/*C:\Users\escene\Desktop\bmap\开始\开始.bmp*/0
/* (32 X 32 )*/
};
const uint8_t singleLoop[]=
{
0xFF,0xFF,0xFF,0xFF,0x01,0x00,0x00,0x80,0x01,0x00,0x40,0x80,0x01,0x00,0xC0,0x80,0x01,0x00,0xC0,0x81,0x01,0x00,0xC0,0x83,0x01,0xFF,0xFF,0x87,0xE1,0xFF,0xFF,0x8F,
0xF1,0xFF,0xFF,0x87,0xF9,0x01,0xC0,0x83,0x3D,0x00,0xC0,0x81,0x1D,0x00,0xC0,0x80,0x1D,0x00,0x40,0x80,0x1D,0xC0,0x01,0x80,0x1D,0xE0,0x01,0x80,0x1D,0xF0,0x01,0x80,
0x1D,0xF0,0x01,0x80,0x1D,0xC0,0x01,0x80,0x1D,0xC0,0x01,0x9C,0x1D,0xC0,0x01,0x9C,0x1D,0xC0,0x01,0x9C,0x1D,0xC0,0x01,0x9C,0x1D,0xC0,0x01,0x9C,0x1D,0x00,0x00,0x9C,
0x1D,0x00,0x00,0x9C,0x39,0x00,0x00,0x8E,0xF9,0xFF,0xFF,0x8F,0xF1,0xFF,0xFF,0x87,0xC1,0xFF,0xFF,0x81,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0xFF,0xFF,0xFF,0xFF,/*C:\Users\escene\Desktop\bmap\单曲循环\单曲循环.bmp*/0
/* (32 X 32 )*/
};
u8g2_FirstPage(&u8g2);
do
{
u8g2_DrawXBM(&u8g2, 0, 0, 32, 32, save);
u8g2_DrawXBM(&u8g2, 32, 0, 32, 32, recall);
u8g2_DrawXBM(&u8g2, 64, 0, 32, 32, share);
u8g2_DrawXBM(&u8g2, 96, 0, 32, 32, txt);
u8g2_DrawXBMP(&u8g2, 0, 32, 32, 32, copy);
u8g2_DrawXBMP(&u8g2, 32, 32, 32, 32, previous);
u8g2_DrawXBMP(&u8g2, 64, 32, 32, 32, start);
u8g2_DrawXBMP(&u8g2, 96, 32, 32, 32, singleLoop);
} while (u8g2_NextPage(&u8g2));
显示效果:
备注:
- 位图的资源是在 https://www.iconfont.cn/ 这个网站下的,下载下来是PNG格式。
- 先使用FastStoneCapture将PNG格式图片修改大小为32*32,并且保存格式为BMP。
- 使用PCtoLCD2002工具打开BMP位图,细节进行了修改,PCtoLCD2002取模选项设置如下
- 位图没有版本仅供学习,商业使用请联系作者。
2.3 特殊功能函数(输入框、下拉列表等)
2.3.1 屏幕截图、捕获
/* 屏幕截图
* @param out 一个带char *类型指针的回调函数
* 将u8g2缓冲区的内容写入指定的对象(Arduino/C++)或回调函数(纯C接口)。此功能可用于实现屏幕截图/屏幕捕获功能。输出格式为XBM或PBM。
*/
void u8g2_WriteBufferPBM(u8g2_t *u8g2, void (*out)(const char *s));
void u8g2_WriteBufferXBM(u8g2_t *u8g2, void (*out)(const char *s));
void u8g2_WriteBufferPBM2(u8g2_t *u8g2, void (*out)(const char *s));
void u8g2_WriteBufferXBM2(u8g2_t *u8g2, void (*out)(const char *s));
- 这里是裸机程序测试,后面将在linux系统中测试这几个接口
2.3.2 下拉列表
/* 绘制一个下拉列表
* @param title 下拉列表的标题
* @param start_pos 开始选中的位置
* @param sl 下拉列表的内容,每个选项用\n分隔
*/
uint8_t u8g2_UserInterfaceSelectionList(u8g2_t *u8g2, const char *title, uint8_t start_pos, const char *sl);
测试代码:
const char *string_list =
"List-1\n"
"List-2\n"
"List-3\n"
"List-4";
u8g2_FirstPage(&u8g2);
do
{
u8g2_SetFont(&u8g2, u8g2_font_amstrad_cpc_extended_8r);
u8g2_UserInterfaceSelectionList(&u8g2, "List", 2, string_list);
} while (u8g2_NextPage(&u8g2));
显示效果:
2.3.3 信息提示
/* 绘制一个带按钮的信息提示框
* @param title 第一行提示信息
* @param title2 第二行提示信息
* @param title3 第三行提示信息
* @param buttons 按键列表,可以定义多个按钮中间以\n分隔
*/
uint8_t u8g2_UserInterfaceMessage(u8g2_t *u8g2, const char *title1, const char *title2, const char *title3, const char *buttons);
测试代码:
u8g2_FirstPage(&u8g2);
do
{
u8g2_SetFont(&u8g2, u8g2_font_amstrad_cpc_extended_8r);
u8g2_SetFontRefHeightAll(&u8g2);
u8g2_UserInterfaceMessage(&u8g2, "Title1", "Title2", "Title3", "success\nfailure");
} while (u8g2_NextPage(&u8g2));
显示效果:
2.3.4 用户输入信息显示
/* 绘制一个带按钮的信息提示框
* @param title 提示信息
* @param pre 值之前的文本
* @param value 显示的值
* @param lo 最小值,可由用户选择。
* @param hi 最大值,可由用户选择。
* @param digits 位数(1到3)。
* @param post 值后面的文本。
*/
uint8_t u8g2_UserInterfaceInputValue(u8g2_t *u8g2, const char *title, const char *pre, uint8_t *value, uint8_t lo, uint8_t hi, uint8_t digits, const char *post);
测试代码:
uint8_t v = 12;
u8g2_FirstPage(&u8g2);
do
{
u8g2_SetFont(&u8g2, u8g2_font_amstrad_cpc_extended_8r);
u8g2_SetFontRefHeightAll(&u8g2);
u8g2_UserInterfaceInputValue(&u8g2, "Select Voltage", "DAC= ", &v, 0, 100, 2, " V");
} while (u8g2_NextPage(&u8g2));
显示效果:
2.3.5 setMaxClipWindow和u8g2_SetClipWindow
/* 删除setClipWindow的效果。图形被写入完整的显示器
*/
void u8g2_SetMaxClipWindow(u8g2_t *u8g2);
/* 图形写入限制区域的显示器
* @param x0 可见区域的左边缘
* @param y0 可见区域的上边缘
* @param x1 可见区域的右边缘+1
* @param y1 可见区域的下边缘+1
*/
void u8g2_SetClipWindow(u8g2_t *u8g2, u8g2_uint_t x0, u8g2_uint_t y0, u8g2_uint_t x1, u8g2_uint_t y1 );
2.3.6 更改字形和字符串绘制函数的参考位置
/* 设置字符串显示参考位置
*/
void u8g2_SetFontPosBaseline(u8g2_t *u8g2);
void u8g2_SetFontPosBottom(u8g2_t *u8g2);
void u8g2_SetFontPosTop(u8g2_t *u8g2);
void u8g2_SetFontPosCenter(u8g2_t *u8g2);
``
### 2.3.7 u8g2_SetFontMode和u8g2_SetDrawColor
```c
/* 设置字体模式,0纯色模式,1为透明模式
*/
void u8g2_SetFontMode(u8g2_t *u8g2, uint8_t is_transparent);
/* 设置颜色索引,0,1,2
*/
void u8g2_SetDrawColor(u8g2_t *u8g2, uint8_t color);
测试代码:
u8g2_FirstPage(&u8g2);
do
{
u8g2_SetFont(&u8g2, u8g2_font_amstrad_cpc_extended_8r);
/* write background pattern, then: */
u8g2_SetFontMode(&u8g2, 0);
u8g2_SetDrawColor(&u8g2, 1);
u8g2_DrawStr(&u8g2, 3, 15, "Color=1, Mode 0");
u8g2_SetDrawColor(&u8g2, 0);
u8g2_DrawStr(&u8g2, 3, 30, "Color=0, Mode 0");
u8g2_SetFontMode(&u8g2, 1);
u8g2_SetDrawColor(&u8g2, 1);
u8g2_DrawStr(&u8g2, 3, 45, "Color=1, Mode 1");
u8g2_SetDrawColor(&u8g2, 0);
u8g2_DrawStr(&u8g2, 3, 60, "Color=0, Mode 1");
} while (u8g2_NextPage(&u8g2));
显示效果:
说明:u8g2_SetFontMode一般设置参数为0,不设置透明。
2.3.8 u8g2_SetFontDirection
/* 设置字体显示方向,角度
* @param dir 方向枚举
* * 0 0度 Left to right
* * 1 90度 Top to down
* * 2 180度 Right to left
* * 3 270度 Down to top
*/
void u8g2_SetFontDirection(u8g2_t *u8g2, uint8_t dir);
2.3.9 u8g2_SetFlipMode
/* 有些显示器支持内部帧缓冲区旋转180度,需要硬件支持
*/
void u8g2_SetFlipMode(u8g2_t *u8g2, uint8_t is_enable);
2.3.10 u8g2_SetDisplayRotation
/* 设置显示旋转,在u8g2_init里面已经有设置
*/
void u8g2_SetDisplayRotation(u8g2_t *u8g2, const u8g2_cb_t *u8g2_cb);
2.3.11 u8g2_SetBitmapMode
/* 设置背景位图是否透明
* @param is_transparent,0不透明,1透明
*
*/
void u8g2_SetBitmapMode(u8g2_t *u8g2, uint8_t is_transparent);
说明:实际测试这个函数设置不生效。
2.3.12 u8g2_GetUTF8Width和u8g2_GetStrWidth
/* 计算字符串所占的像素
* @param s 被计算的字符串
* @return 返回字符串所占的像素宽度
*/
u8g2_uint_t u8g2_GetUTF8Width(u8g2_t *u8g2, const char *s);
/* 和上面函数一样 */
u8g2_uint_t u8g2_GetStrWidth(u8g2_t *u8g2, const char *s);
2.3.13 getMaxCharWidth和getMaxCharHeight
/* 每个字形都存储为位图。这将返回字体中最大位图的宽度
*/
u8g2_uint_t getMaxCharWidth(void);
/* 每个字形都存储为位图。这将返回字体中最大位图的高度
*/
int8_t u8g2_GetMaxCharHeight(u8g2_t *u8g2);
2.3.14 getDisplayWidth和u8g2_GetDisplayHeight
u8g2_uint_t u8g2_GetDisplayWidth(u8g2_t *u8g2);
int8_t u8g2_GetMaxCharHeight(u8g2_t *u8g2);
说明:返回值是屏幕的最大宽度和高度,我这里返回的是128和64
2.3.15 u8g2_GetU8x8
/* 将u8g2_t *转换为u8x8_t *类型的指针
*/
u8x8_t *u8g2_GetU8x8(u8g2_t *u8g2);
2.3.16 u8g2_GetDescent和u8g2_GetAscent
/* 与字体有关,暂时不知道有什么用
*/
int8_t u8g2_GetDescent(u8g2_t *u8g2);
int8_t u8g2_GetAscent(u8g2_t *u8g);
2.4 不常用或者废弃的函数
2.4.1 u8g2_InitInterface
#define u8x8_gpio_Init(u8x8) ((u8x8)->gpio_and_delay_cb((u8x8), U8X8_MSG_GPIO_AND_DELAY_INIT, 0, NULL ));
#define u8x8_cad_Init(u8x8) ((u8x8)->cad_cb((u8x8), U8X8_MSG_CAD_INIT, 0, NULL ));
void u8x8_InitInterface(u8x8_t *u8x8)
{
u8x8_gpio_Init(u8x8);
u8x8_cad_Init(u8x8); /* this will also call U8X8_MSG_BYTE_INIT, byte init will NOT call GPIO_INIT */
}
- 这个函数初始化了二个回调函数,已经被 u8g2_SetupDisplay 替代,不建议使用。
2.4.2 u8g2_SendBuffer
/* same as u8g2_send_buffer but also send the DISPLAY_REFRESH message (used by SSD1606) */
void u8g2_SendBuffer(u8g2_t *u8g2)
{
u8g2_send_buffer(u8g2);
u8x8_RefreshDisplay( u8g2_GetU8x8(u8g2) );
}
- 设置缓冲区并且发送刷新显示消息,不常用,在u8g2_NextPage中已经有相同的调用。
2.4.3 u8g2_SetI2CAddress
/* 对于使用I2C协议通信的显示设置,设置显示设备的地址
*/
void u8g2_SetI2CAddress(u8g2_t *u8g2, uint8_t adr);
2.4.4 u8g2_SetFontRefHeightAll和u8g2_SetFontRefHeightExtendedText和u8g2_SetFontRefHeightText
/* 与字体有关,暂时不知道用法
*/
void u8g2_SetFontRefHeightAll(u8g2_t *u8g2);
void u8g2_SetFontRefHeightExtendedText(u8g2_t *u8g2);
void u8g2_SetFontRefHeightText(u8g2_t *u8g2);
2.4.5 u8g2_SendF
/* 直接控制显示器的函数,不常用
*/
void u8g2_SendF(u8g2_t * u8g2, const char *fmt, ...);
2.4.6 u8g2_SetAutoPageClear
/* 像素缓冲区清除函数,不常用
*/
uint8_t u8g2_SetAutoPageClear(u8g2_t *u8g2, uint8_t mode);
3. 说明
- u8g2 api的版本是V2.29.11