【2022得捷创新设计大赛】U8g2中的字体应用
[复制链接]
知道上面这个U8g2的人,都说U8g2是一个好东西。
U8g2 是用于嵌入式设备的单色图形库,支持单色 OLED 和 LCD,其中包括但不限于以下控制器:SSD1305、SSD1306、SSD1309、SSD1312、SSD1316、SSD1318、SSD1320、SSD1322、SSD1325、SSD1327、SSD1329、SSD1606、SSD1607、SH1106、SH1107、SH1108、SH1122、T6963、RA8835、LC7981、PCD8544、PCF1107、SH1108、SH1122、T6963、RA8835、LC7981、PCD8544、PCFf。 8812, HX1230, UC1601, UC1604, UC1608, UC1610, UC1611, UC1617, UC1638, UC1701, ST7511, ST7528, ST7565, ST7567, ST7571, ST7586, ST7588, ST75160, ST75256, ST75320, NT7534, ST7920, IST3020, IST3088, IST7920, LD7032, KS0108, KS0713, HD44102, T7932, SED1520, SBN1661, IL3820, MAX7219, GP1287, GP1247, GU800
可以说,常见的嵌入式设备上用的单色OLED和LCD,基本上都支持上了。
通常,是在Arduino中使用U8g2,可以从 Arduino IDE 的库管理器安装。因为这个库是开源的,所以有很多牛人移植到了各种不同的平台和系统上。
但这篇分享,不是讲U8g2具体如何使用的,是单说U8g2中的字体的。
U8g2除了能够处理例如划线、画框、等图形处理,另一个强大的地方,就是支持Unicode字符,可以很方便的通过U8g2在显示设备上,显示所需要的字符。
首先,是我们最常用的:中文。
通常,我们要在单色 OLED 和 LCD显示中文,要么显示设备自带字体,要么我们的程序自带字体点阵数据。
例如著名的 字模取模工具PCtoLCD ,就是帮助我们做这个工作的。
而在U8g2中,默认支持多种中文字体,包括:
- 文泉驿12号、13号、14号、15号、16号字体
- GNU Unifont字体
不过,为了节省资源,毕竟单片机的资源不是敞着用的,所以U8g2中的中文字体,仅支持常用的几百个汉字,一般如下:
所以,当你信心满满的用U8g2输出中文的时候,可能发现:
- 啥都没有输出
- 缺字
例如:输出 “机器人控制平台“,控制的控,就没有了
在实际中,可以使用的中文字体包括:
u8g2_font_wqy12_t_chinese1
u8g2_font_wqy12_t_chinese2
u8g2_font_wqy12_t_chinese3
u8g2_font_wqy12_t_gb2312
u8g2_font_wqy12_t_gb2312a
u8g2_font_wqy12_t_gb2312b
u8g2_font_wqy13_t_chinese1
u8g2_font_wqy13_t_chinese2
u8g2_font_wqy13_t_chinese3
u8g2_font_wqy13_t_gb2312
u8g2_font_wqy13_t_gb2312a
u8g2_font_wqy13_t_gb2312b
u8g2_font_wqy14_t_chinese1
u8g2_font_wqy14_t_chinese2
u8g2_font_wqy14_t_chinese3
u8g2_font_wqy14_t_gb2312
u8g2_font_wqy14_t_gb2312a
u8g2_font_wqy14_t_gb2312b
u8g2_font_wqy15_t_chinese1
u8g2_font_wqy15_t_chinese2
u8g2_font_wqy15_t_chinese3
u8g2_font_wqy15_t_gb2312
u8g2_font_wqy15_t_gb2312a
u8g2_font_wqy15_t_gb2312b
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
u8g2_font_unifont_t_chinese1
u8g2_font_unifont_t_chinese2
u8g2_font_unifont_t_chinese3
在上述字体中,可以发现,文泉驿有的是chinese、有的是gb2312,有什么差别呢?
如果是chinese的,则为Unicode字符集,包含的字符范围更广,但是汉字数偏少。
如果是gb2312,则包含的字符范围偏少,但是汉字数更多。
可以根据实际情况使用。
以下为实际显示的情况:
U8G2::setFont(u8g2_font_unifont_t_chinese2); // 中文字体
U8G2::setFontMode(1); // 使用 u8g2 透明模式(默认)
U8G2::setCursor(30, 35);
U8G2::print("二自由度");
U8G2::setCursor(25, 55);
U8G2::print("机器人平台");
在Arduino中,驱动SSD1306 OLED,通常使用Adafruit_SSD1306,则可以应用U8g2_for_Adafruit_GFX,将Adafruit_SSD1306和U8G2连接起来,使用下面的调用方式:
u8g2_for_adafruit_gfx.setFont(u8g2_font_unifont_t_chinese2); // 中文字体
u8g2_for_adafruit_gfx.setFontMode(1); // 使用 u8g2 透明模式(默认)
u8g2_for_adafruit_gfx.setCursor(30, 35);
u8g2_for_adafruit_gfx.print("二自由度");
u8g2_for_adafruit_gfx.setCursor(25, 55);
u8g2_for_adafruit_gfx.print("机器人平台");
然后,是图标。
有时候,我们需要在界面上,显示一些图标,这样子方便理解。
例如:
要显示图标,通常需要先找到对应的图片,然后提取其点阵数据,在需要的时候,呈现出来。
然而,使用U8G2,可以很方便的显示图标。
在Unicode字符集中,包含有很多图标的字符集。
例如:
而上述状态栏中的图标,则来源于:
实际调用如下:
u8g2_for_adafruit_gfx.setFont(u8g2_font_siji_t_6x10); // icon字体
u8g2_for_adafruit_gfx.setFontMode(1); // 使用 u8g2 透明模式(默认)
u8g2_for_adafruit_gfx.drawGlyph(0, 12, 0x0e200); // 电源图标
u8g2_for_adafruit_gfx.drawGlyph(128 - 16, 12, 0x0e21a); // WiFi图标
U8g2中,支持多种icon字体,用于显示图标。也有部分字体中,包含有特殊的字符,也可以当做图标来显示。
包含icon的字体很多,可以在如下页面,搜索icon获取:
以上小小的分享,是U8G2自身就能够提供的功能了,如果还不满足的话,还可以通过U8G2提供的otf2bdf工具,来自己添加自定义的字体,这样就更能方便我们的使用了。
|