找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5485|回复: 7
收起左侧

Arduino OLED库自己U8g2添加字库教程

  [复制链接]
ID:261544 发表于 2022-11-13 13:35 | 显示全部楼层 |阅读模式
Arduino OLED自己添加字库教程,刚开始接触U8g2字库走了不少弯路,然后U8g2添加字库的过程记录下来做成文档供和我一样的小白们参考,希望能申精。

一、前言

最近在研究用 Arduino 以 U8g2 库驱动 OLED 显示中文,过程中走了很多弯路历经曲折,翻阅很多资料对 于我这样的小白来说这些资料有点深奥,理解不是怎么透彻于是请教群里的高手,非但问题没有帮助解决还受到嘲 笑和讥讽,于是我下定决心自己一定要把这个字库弄成功,最后我翻阅资料和反复试验终于成功的添加了自己的字 库,所以我要将自己的心得和成功的方法献给像我这样的小白。

  二、备硬件和软件   
1.准备一块 ssd1306 液晶显示模块,一块 arduino 开发板。


2.准备 arduino IDE


3.下载 ssd 1306 的支持库 u8g2:地址自行搜索
  或者在 arduino 上安装 u8g2:(1)打开管理库:


(2)搜索并安装 u8b2

用 arduino 驱动 oled 显示屏 (1)接线。我用的是 Arduino R3,这个 1106 的屏幕是使用 i2c,我只需在 Arduino R3 上选取两个引脚作为 i2c 即可,而 1106 需要 3.3v 供电,再接两根线供电。 (2)打开 u8b2 的例程 PrintUTF8。


(3)配置工程的引脚和通讯方式。只需要根据屏幕的通讯方式和接的 I2C 引脚配置即可,配置方式是选择对应的 配置去掉注释。我用的是 SSD1106_128X64,用了 I2C 接口,使用 SDA 和 SCL 作为 i2c 的引脚,所以我配置是:   
U8G2_SSD1106_128X64_NONAME_F_SW_I2C    u8g2(U8G2_R0,    /*    clock=*/    23,    /*    data=*/    22,    /*    reset=*/ U8X8_PIN_NONE);       // All Boards without Reset of the Display

代码如下:

void setup(void) {
u8g2.begin();
u8g2.enableUTF8Print();                  // enable UTF8 support for the Arduino print() function
}


void loop(void) {
u8g2.setFont(u8g2_font_unifont_t_chinese2);  // use chinese2 for all the glyphs of "你好世界" u8g2.setFontDirection(0);
u8g2.clearBuffer(); u8g2.setCursor(0, 15); u8g2.print("Hello World!"); u8g2.setCursor(0, 40);
u8g2.print("世界你好");                  // Chinese "Hello World"
u8g2.sendBuffer();


delay(1000);

}
显示效果如下:

如果不能正常显示汉字需要将汉字在 UTF8 编码格式下打开,也可以在 UTF8 编码格式格式下打开以上代码然后点 击保存,我使用的是 Notepad++ 打开并保存代码便可以解决汉字乱码的问题

四、制作自定义的字库 u8b2 官方的库只能显示很少的中文,如果要显示其他中文就要自己制作字库了。制作字库的工具在目录在:
u8g2\tools\font\bdfconv

bdfconv.exe 这个工具是一个 dos 命令,需要开启 cmd.exe 在命令行输入命令或者用 bat 脚本来生成字库。
bdfconv.exe 命令的使用方法如下:

bdfconv [options] filename
-h                       Display this help
-v                       Print log messages
-b <n>             Font build mode, 0: proportional, 1: common height, 2: monospace, 3: multiple of 8
-f <n>              Font format, 0: ucglib font, 1: u8g2 font, 2: u8g2 uncompressed 8x8 font (enforces -b 3)
-m 'map'         Unicode ASCII mapping
-M 'mapfile'          Read Unicode ASCII mapping from file 'mapname'
-o <file>       C output file
-n <name>       C indentifier (font name)
-d <file>       Overview picture: Enable generation of bdf.tga and assign BDF font <file> for description
-l <margin> Overview picture: Set left margin
-a                       Overview picture: Additional font information (background, orange&blue dot)
-t                       Overview picture: Test string (Woven silk pyjamas exchanged for blue quartz.)

-r                      Runtime test
map := <mapcmd> { "," <mapcmd> }
mapcmd := <default> | <maprange> | <exclude>
default := "*"
maprange := <range> [    ">" <addexpr> ]                 Move specified glyph <range> to target code <num>
exclude := "~" <range>
range := <addexpr> [ "-" <addexpr> ]                      Select glyphs within specified range addexpr := <mulexpr> [ "+" <mulexpr> ]
mulexpr := <num> [ "*" <num> ]
num := <hexnum> | <decnum>
hexnum := "$" <hexdigit> { <hexdigit> }
decnum := <decdigit> { <decdigit> }
decdigit := "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
hexdigit := "a" | "b" | "c" | "d" | "e" | "f" | "A" | "B" | "C" | "D" | "E" | "F" | <decdigit>
{ } zero, one ore more, [ ] zero or once, | alternative example:
-m '32-255'            select gylphs from encoding 32 to 255
-m '32-255,~64' select gylphs from encoding 32 to 255, exclude '@'
-m '32,48-57'       select space, '1', '2', ... '9' build modes:
-b 0: Most compact, glyph bitmap is minimal
-b 1: Like -b 0, but glyph bitmap is extended to the height of the largest glyph within the selected glyph list.
Also the width of the gylphs is extended to cover the delta x advance.
-b 2: Like -b 1, but glyph width is set to the width of the largest glyph within the selected gylph list.
-b 3: Like -b 2, but width and height are forced to be a multiple of 8.

在“bdfconv”目录下有一个脚本 “test_helvb18.bat” ,
bdfconv.exe -v -f 1 -m "32-127" ../bdf/helvB18.bdf -o helvb18_tf.c    -n u8g2_font_helvB18_tf -d ../bdf/helvB18.bdf type helvb18_tf.c
我们可以利用这个脚本来生成字库,这个是直接通过“helvB18.bdf”字库文件生成 ".C"的字库数据,而中文字库 很大,一般都有几 M 大小,显然这种直接生成的方法不好用。还有另外一种字库生成方法是按需提取字库,利用一 个 map 表来提取要生成字库的内容,map 表里面放置的是 unicode 编码(需要哪些中文就填这些中文的 unicode 码)。unicode 编码工具很多我用的是 ”文本与 unicode 转换小工具 V5.02.05”



Unicode 码分隔符用$ 在文本区输入想要显示的汉字 Unicode 码进制选十六进制,接着 Unicode 码区会显示十

六进制码,复制生成的字码将它填在自己要显示的 map 表里面。 我的字码放置在“chinese2.map”(当然这和字码表也可以另建)如下图:


  
这种生产方式的命令是:

bdfconv.exe -v ../bdf/unifont.bdf -b 0 -f 1 -M ../build/chinese2.map -d ../bdf/7x13.bdf -n u8g2_font_unifont_zgzt -o u8g2_font_unifont_zgzt.c

  

从这个命令我们可以知道 map 文件是 “chinese2.map”,全路径是:“u8g2\tools\font\build”,我们可以在 “chinese2.map”文件里面添加我们要显示的中文。生产的字库代码在 u8g2_font_unifont_zgzt.c 文件里面,我 们可以将里面的内容复制,然后打开路径" U8g2\src\clib 下的 u8g2_fonts.c "文件, 将复制的内容粘贴在里面。 注意:我是将字码放在例程的字库里(也就数 chinese2.map 里面)所以产生命令是:

bdfconv.exe -v ../bdf/unifont.bdf -b 0 -f 1 -M ../build/chinese2.map -d ../bdf/7x13.bdf -n u8g2_fonts -o u8g2_fonts.c

如下图: 点击保存。
   
打开 u8b2 的例程 PrintUTF8 程序将生成过字码的汉字填在 u8g2.print("");里就可以显示要显示的汉字了。

以上图文的pdf格式文档下载(内容和本网页上的一模一样,方便大家保存):如果你不想保存就不必下载了:
U8g2自己添加字库.pdf (1.09 MB, 下载次数: 40)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:16255 发表于 2022-11-15 09:20 | 显示全部楼层
那么,如何用现成的字库反推出字库里包含的文字?
回复

使用道具 举报

ID:16255 发表于 2022-11-15 09:22 | 显示全部楼层
这些生成的代码表面上像是一堆乱码,这是一种怎么样的编码规律?
回复

使用道具 举报

ID:844772 发表于 2022-11-15 15:46 | 显示全部楼层
mengsiu 发表于 2022-11-15 09:22
这些生成的代码表面上像是一堆乱码,这是一种怎么样的编码规律?

应该有反推的程序,不过要是字少,可以用excel弄,很方便的。
回复

使用道具 举报

ID:16255 发表于 2022-11-15 22:50 | 显示全部楼层
glinfei 发表于 2022-11-15 15:46
应该有反推的程序,不过要是字少,可以用excel弄,很方便的。

如何反推?
回复

使用道具 举报

ID:844772 发表于 2022-11-16 15:17 | 显示全部楼层

查一下编码规则呗。也是点阵字,只不过先描述了每个字的有效范围和坐标等信息,所以每个字模大小、起始位置是不一样的,而且本来是十六进制的,折腾到十进制了,自然产生乱码,找到每个字模点阵的起点,然后按普通点阵字处理,自然就翻译了。
回复

使用道具 举报

ID:1095377 发表于 2023-10-8 14:21 | 显示全部楼层
感谢你提供的资料,正好遇到项目需要使用
回复

使用道具 举报

ID:845241 发表于 2023-10-11 08:56 | 显示全部楼层
研究下字库芯片,自己生成字库文件太占处理器存储空间,得不偿失
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表