U8g2库使用

1、头文件

#include

2、选型号

选择使用的屏幕型号,这里使用的是SSD1306驱动的128 x 64:U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /*clock=*/SCL, /*data=*/SDA, /*reset=*/U8X8_PIN_NONE);  

类的一些含义:

部分 含义
固定U8G2
驱动芯片名字
显示大小
OLED名字,一般就是NONAME
1/2/F分别是一页、二页、全部完成的显示缓存,占用芯片内存依次增加
通信类型          SW:软件模拟                HW:硬件模拟

形参的含义:

形参 含义
U8G2_R0/1/2/3/MIRROR 不旋转、顺90、顺180、顺270、镜像
clock  SPI:时钟        I2C:SCL
data I2C        SDA
reset 屏幕的重置引脚,没有就U8X8_PIN_NONE
cs 片选
dc 命令脚

SSD1306使用spi的SW,一次刷新要500ms,硬件22ms

类的选择参考:https://github.com/olikraus/u8g2/wiki/u8g2setupcpp/

以上配置就把屏幕信息选择好了,就可以使用函数了。这里有个注意的地方,上面代码中间的u8g2是一个对象。

3、一些常用函数

初始化

u8g2.enableUTF8Print(); // enable UTF8 support for the Arduino print() function

// enableUTF8Print()好像初始化默认开启,以防万一加了也没啥事,用来支持中文的。

u8g2.setContrast(200);        // 设置亮度(0-255),似乎用不了,不用也行。

u8g2.begin();       // 初始化的设置

设置字体

u8g2.setFont(u8g2_font_wqy15_t_gb2312b);

选择字体,u8g2_font_wqy15_t_gb2312b就是汉字。字号从12-16,把前面15改掉来选择。

英文的一般用:u8g2_font_unifont_t_symbols和u8g2_font_ncenB12_tr

中文字体16号就占用了320K空间。

查询字库参考:Wiki - Gitee.com

网站使用讲解:

U8g2库使用_第1张图片

 Pixel表示像素,意思就是你字体的大小。

新版加入了文泉驿字库,有以下几个:

u8g2_font_wqy16_t_chinese1

u8g2_font_wqy16_t_chinese2

u8g2_font_wqy16_t_chinese3

u8g2_font_wqy16_t_gb2312

u8g2_font_wqy16_t_gb2312a

u8g2_font_wqy16_t_gb2312b

说明:chinese1/2/3是小字符集,不常用。gb2312是完整的,有七千多字符;gb2312a没有全角标点符号,4041字符;b比a多了一些额外符号,4531字符。

u8g2命名规则: '_' '_'

参数 含义
t 透明字体
h 字体等高
m 字体等高等宽
8 固定 8 X 8 像素
参数 含义
f 完整ASCII,256个字符
r ASCII的32-127
u ASCII32-95
n 只有数字和额外的glyphs
... 其他的没啥好说

注意点:u8g2的文本显示在光标的右上角。

其他常用函数讲解

home(0);               // 光标返回原点

setCursor(x,y)        // 光标坐标

clear();                    // 清屏和缓冲,光标回原点

clearBuffer();           // 清缓冲

sendBuffer();           // 显示缓冲区

u8g2.drawStr(x,y,“文本”);        // 编码不大于256的文本,y轴向上绘制

u8g2.drawUTF8(x,y,“文本”);         // 可以中文

u8g2.drawGlyph(x,y,HEX);         // 绘制特殊文本图标,比如内置的天气的图标,后面细说

u8g2.print(xxx);                        // 打印文本字符,可打中文、变量,须同配合setCursor和setFont

其他不打了,太多了。自行了解。

这里缓冲区的概念需要清楚:打个比方,上台表演,幕布没拉,观众看不到东西,但演员在后面准备好了,就叫放入缓冲区,一旦拉幕布,就看到了,就是显示这个命令。一旦显示,除非刷新,才能显示新放入缓冲区里的。

#include 
#include 

#define SDA 4                       // SDA引脚,默认gpio4(D2)
#define SCL 5                       // SCL引脚,默认gpio5(D1)

U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /*clock=*/SCL, /*data=*/SDA, /*reset=*/U8X8_PIN_NONE);           // 选择显示屏幕


void setup(){
  u8g2.begin();               // 初始化
  u8g2.enableUTF8Print();     // UTF8允许

  u8g2.clearBuffer();         // 清除缓存,其实初始化里有清除,循环时一定要加上

  u8g2.setFont(u8g2_font_wqy12_t_gb2312b);    // 选择中文gb2313b
  u8g2.setCursor(0,15);             // 缓存区定位
  u8g2.print("你好,U8g2!");        // 指定缓存区需要打印的字符串
    
      
  u8g2.sendBuffer();          // 将定位信息发送到缓冲区
}

void loop(){

}

特殊文本图标

这个玩意的使用,看了半天都没搞懂,累死人,好在看出来了。

可以表示的特殊图标参考下面:

fntgrpiconic · olikraus/u8g2 Wiki · GitHub

讲解一下:

U8g2库使用_第2张图片

 网页里这一大串玩意,主要看后面的英文。就比如我现在要用weather,找到点开来。

U8g2库使用_第3张图片

 看第二行,那个就是放入u8g2.setFon(形参)里的,不要以为只能放文字,他这个意思就是,文字、图标各有自己的库,对应一个类,标签一样的。放进去意思可以用他里面的东西了。本文说的类是C++里的,自行了解,说白就是封装函数的库。

第三行,显然说文字大小的。

第五行,文字一般直接写就行,图标必须用代码,他这里用十六进制来编码的。0040就是第一个图标代码,你要是想用第三个月亮,就是0042,前面64表达啥意思,不知道。但只使用后面的就可以了。

所以你想用天气图标里的月亮,你应该写下面两句:

u8g2.setFont(u8g2_font_open_iconic_weather_1x_t);

u8g2.drawGlyph(0,16,0x0042);

u8g2.sendBuffer();                // 显示缓冲区内容

#include 
#include 

#define SDA 4                       // SDA引脚,默认gpio4(D2)
#define SCL 5                       // SCL引脚,默认gpio5(D1)

U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /*clock=*/SCL, /*data=*/SDA, /*reset=*/U8X8_PIN_NONE);           // 选择显示屏幕


void setup(){
  u8g2.begin();               // 初始化
  u8g2.enableUTF8Print();     // UTF8允许

  u8g2.clearBuffer();         // 清除缓存,其实初始化里有清除,循环时一定要加上

  u8g2.setFont(u8g2_font_open_iconic_weather_4x_t);     // 选择内置Weather图标
  u8g2.drawGlyph(0,31,0x0045);                // 选择0x45图标,定位在(0,31)右上方
    
      
  u8g2.sendBuffer();          // 将定位信息发送到缓冲区
}

void loop(){

}

画图函数

drawXBM(x,y,w,h,const uint8_t *bitmap);    

drawXBMP(x,y,w,h,const uint8_t *bitmap);     // 该函数支持PROGMEM,也是他们的区别

                                                // PROGMEM是将它修饰的变量放到Flash中,而不是放到RAM

坐标(x,y),图片宽w和高h,uint8_t *bitmap放入你要显示图片的数组名。

表示图片的数组可以用PCtoLCD2002生成。该软件的使用不做讲解,自行了解。需要注意的是图片的像素大小必须小于你屏幕能显示的大小,图片格式选择BMP,且是单色位图。

还可以使用这个工具:奈何col的工具集,生成的数组要是显示有问题你就切换大小端。

另一个工具:Easy U8g2 font generate tools: 这是一个易于操作的U8g2字体生成工具,使用者只需要输入需要转换的文本,选择字体文件以及设置字体大小,该工具会自动对文本进行去重、生成map字体映射文件、生成bdf字库并最终导出C语言字库代码

使用这个工具的时候,有一个要你给他字符风格的,就是“输入ttf格式字体路径”。你可以在你电脑C盘windows下找到Fonts,里面全是各种风格。你用楷体就把他复制下来放桌面,改个名字。然后命名行输入:Desktop:\STKAITI.TTF。Desktop是存放在桌面的意思,你要是放D盘就改成D,其实也就是放入存放路径。数组的保存内径工具生成后下面会告诉你。然后你把找到该文件,打开来,内容全部复制放入u8g2/scr/clib/u8g2_fonts.c文件里,找个空地方复制就行。然后找到u8g2.h,在最后面写自己字体的声明,照着上面的模板修改。完了之后使用的话,要用u8g2.setFont();括号里放入你字体的名字。你可能问都自带中文字库了,为啥我还要用这些工具,因为字最大也就16像素。

u8g2.drawPixel(x,y);         // 绘制像素点

u8g2.drawHLine(x,y,w);        // 绘制水平线,w表示长度

u8g2.drawVLine(x,y,h);        //绘制竖直线,h表高度

u8g2.drawLine(x,y,x1,y1);         // 绘制直线,(x,y)端点坐标,(x1,y1)另一端点坐标

u8g2.drawBox(x,y,w,h);            // 画实心矩形

u8g2.drawFrame(x,y,w,h);        // 空心矩形

u8g2.drawFrame(x,y,rad,opt);   // 画空心圆。rad半径;opt选择圆形画多少

// opt的参数选择有:U8G2_DRAW_ALL (整个圆)、U8G2_DRAW_UPPER_RIGHT右上圆弧、U8G2_DRAW_UPPER_LEFT左上圆弧、U8G2_DRAW_LOWER_RIGHT右下圆弧、U8G2_DRAW_LOWER_LEFT左下圆弧

u8g2.drawDisc(x,y,rad,opt);        // 画实心圆

u8g2.drawEillipse(x,y,rx,ry,opt);     // 画空心椭圆,rx:椭圆中心在x轴方向到椭圆的距离;ry同理

u8g2.drawFilledEillipse(x,y,rx,ry,opt);        // opt参数和之前的一样

u8g2.drawRBox(x,y,w,h,r);           // 画圆角实心方形,r为圆角半径

u8g2.drawRFrame(x,y,w,h,r);       // 画圆角空心方形

u8g2.drawTriangle(x0,y0,x1,y1,x2,y2)        //画实心三角形,三个顶点坐标

你可能感兴趣的:(学习)