找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 8282|回復(fù): 7
打印 上一主題 下一主題
收起左側(cè)

Arduino OLED庫(kù)自己U8g2添加字庫(kù)教程

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:261544 發(fā)表于 2022-11-13 13:35 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
Arduino OLED自己添加字庫(kù)教程,剛開始接觸U8g2字庫(kù)走了不少?gòu)澛罚缓骍8g2添加字庫(kù)的過(guò)程記錄下來(lái)做成文檔供和我一樣的小白們參考,希望能申精。

一、前言

最近在研究用 Arduino 以 U8g2 庫(kù)驅(qū)動(dòng) OLED 顯示中文,過(guò)程中走了很多彎路歷經(jīng)曲折,翻閱很多資料對(duì) 于我這樣的小白來(lái)說(shuō)這些資料有點(diǎn)深?yuàn)W,理解不是怎么透徹于是請(qǐng)教群里的高手,非但問(wèn)題沒(méi)有幫助解決還受到嘲 笑和譏諷,于是我下定決心自己一定要把這個(gè)字庫(kù)弄成功,最后我翻閱資料和反復(fù)試驗(yàn)終于成功的添加了自己的字 庫(kù),所以我要將自己的心得和成功的方法獻(xiàn)給像我這樣的小白。

  二、準(zhǔn)備硬件和軟件   
1.準(zhǔn)備一塊 ssd1306 液晶顯示模塊,一塊 arduino 開發(fā)板。


2.準(zhǔn)備 arduino IDE


3.下載 ssd 1306 的支持庫(kù) u8g2:地址自行搜索
  或者在 arduino 上安裝 u8g2:(1)打開管理庫(kù):


(2)搜索并安裝 u8b2

、用 arduino 驅(qū)動(dòng) oled 顯示屏 (1)接線。我用的是 Arduino R3,這個(gè) 1106 的屏幕是使用 i2c,我只需在 Arduino R3 上選取兩個(gè)引腳作為 i2c 即可,而 1106 需要 3.3v 供電,再接兩根線供電。 (2)打開 u8b2 的例程 PrintUTF8。


(3)配置工程的引腳和通訊方式。只需要根據(jù)屏幕的通訊方式和接的 I2C 引腳配置即可,配置方式是選擇對(duì)應(yīng)的 配置去掉注釋。我用的是 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 編碼格式格式下打開以上代碼然后點(diǎn) 擊保存,我使用的是 Notepad++ 打開并保存代碼便可以解決漢字亂碼的問(wèn)題

四、制作自定義的字庫(kù) u8b2 官方的庫(kù)只能顯示很少的中文,如果要顯示其他中文就要自己制作字庫(kù)了。制作字庫(kù)的工具在目錄在:
u8g2\tools\font\bdfconv

bdfconv.exe 這個(gè)工具是一個(gè) dos 命令,需要開啟 cmd.exe 在命令行輸入命令或者用 bat 腳本來(lái)生成字庫(kù)。
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”目錄下有一個(gè)腳本 “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
我們可以利用這個(gè)腳本來(lái)生成字庫(kù),這個(gè)是直接通過(guò)“helvB18.bdf”字庫(kù)文件生成 ".C"的字庫(kù)數(shù)據(jù),而中文字庫(kù) 很大,一般都有幾 M 大小,顯然這種直接生成的方法不好用。還有另外一種字庫(kù)生成方法是按需提取字庫(kù),利用一 個(gè) map 表來(lái)提取要生成字庫(kù)的內(nèi)容,map 表里面放置的是 unicode 編碼(需要哪些中文就填這些中文的 unicode 碼)。unicode 編碼工具很多我用的是 ”文本與 unicode 轉(zhuǎn)換小工具 V5.02.05”



Unicode 碼分隔符用$ 在文本區(qū)輸入想要顯示的漢字 Unicode 碼進(jìn)制選十六進(jìn)制,接著 Unicode 碼區(qū)會(huì)顯示十

六進(jìn)制碼,復(fù)制生成的字碼將它填在自己要顯示的 map 表里面。 我的字碼放置在“chinese2.map”(當(dāng)然這和字碼表也可以另建)如下圖:


  
這種生產(chǎn)方式的命令是:

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

  

從這個(gè)命令我們可以知道 map 文件是 “chinese2.map”,全路徑是:“u8g2\tools\font\build”,我們可以在 “chinese2.map”文件里面添加我們要顯示的中文。生產(chǎn)的字庫(kù)代碼在 u8g2_font_unifont_zgzt.c 文件里面,我 們可以將里面的內(nèi)容復(fù)制,然后打開路徑" U8g2\src\clib 下的 u8g2_fonts.c "文件, 將復(fù)制的內(nèi)容粘貼在里面。 注意:我是將字碼放在例程的字庫(kù)里(也就數(shù) chinese2.map 里面)所以產(chǎn)生命令是:

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

如下圖: 點(diǎn)擊保存。
   
打開 u8b2 的例程 PrintUTF8 程序?qū)⑸蛇^(guò)字碼的漢字填在 u8g2.print("");里就可以顯示要顯示的漢字了。

以上圖文的pdf格式文檔下載(內(nèi)容和本網(wǎng)頁(yè)上的一模一樣,方便大家保存):如果你不想保存就不必下載了:
U8g2自己添加字庫(kù).pdf (1.09 MB, 下載次數(shù): 42)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏9 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:16255 發(fā)表于 2022-11-15 09:20 | 只看該作者
那么,如何用現(xiàn)成的字庫(kù)反推出字庫(kù)里包含的文字?
回復(fù)

使用道具 舉報(bào)

板凳
ID:16255 發(fā)表于 2022-11-15 09:22 | 只看該作者
這些生成的代碼表面上像是一堆亂碼,這是一種怎么樣的編碼規(guī)律?
回復(fù)

使用道具 舉報(bào)

地板
ID:844772 發(fā)表于 2022-11-15 15:46 | 只看該作者
mengsiu 發(fā)表于 2022-11-15 09:22
這些生成的代碼表面上像是一堆亂碼,這是一種怎么樣的編碼規(guī)律?

應(yīng)該有反推的程序,不過(guò)要是字少,可以用excel弄,很方便的。
回復(fù)

使用道具 舉報(bào)

5#
ID:16255 發(fā)表于 2022-11-15 22:50 | 只看該作者
glinfei 發(fā)表于 2022-11-15 15:46
應(yīng)該有反推的程序,不過(guò)要是字少,可以用excel弄,很方便的。

如何反推?
回復(fù)

使用道具 舉報(bào)

6#
ID:844772 發(fā)表于 2022-11-16 15:17 | 只看該作者

查一下編碼規(guī)則唄。也是點(diǎn)陣字,只不過(guò)先描述了每個(gè)字的有效范圍和坐標(biāo)等信息,所以每個(gè)字模大小、起始位置是不一樣的,而且本來(lái)是十六進(jìn)制的,折騰到十進(jìn)制了,自然產(chǎn)生亂碼,找到每個(gè)字模點(diǎn)陣的起點(diǎn),然后按普通點(diǎn)陣字處理,自然就翻譯了。
回復(fù)

使用道具 舉報(bào)

7#
ID:1095377 發(fā)表于 2023-10-8 14:21 | 只看該作者
感謝你提供的資料,正好遇到項(xiàng)目需要使用
回復(fù)

使用道具 舉報(bào)

8#
ID:845241 發(fā)表于 2023-10-11 08:56 | 只看該作者
研究下字庫(kù)芯片,自己生成字庫(kù)文件太占處理器存儲(chǔ)空間,得不償失
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表