久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8108|回復: 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, 下載次數: 42)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
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弄,很方便的。
回復

使用道具 舉報

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

如何反推?
回復

使用道具 舉報

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

查一下編碼規則唄。也是點陣字,只不過先描述了每個字的有效范圍和坐標等信息,所以每個字模大小、起始位置是不一樣的,而且本來是十六進制的,折騰到十進制了,自然產生亂碼,找到每個字模點陣的起點,然后按普通點陣字處理,自然就翻譯了。
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人在线国产 | 中文字幕在线观看一区 | 日日干干夜夜 | 91一区二区 | 国产成人小视频 | 免费观看a级毛片在线播放 黄网站免费入口 | 盗摄精品av一区二区三区 | 国产欧美综合在线 | 久久久久se | 国产精品一二三区 | h在线播放 | 麻豆国产一区二区三区四区 | 亚洲最大的成人网 | 99热免费在线| 亚洲风情在线观看 | 国产一二区免费视频 | 四虎影院免费在线 | 免费看a | 中文亚洲视频 | 久久精品 | 荷兰欧美一级毛片 | 欧美中文一区 | 国产精华一区 | 国产美女在线播放 | 国产精品久久一区 | 色悠悠久 | 国产一区二区 | 日韩一级免费电影 | 亚洲欧美在线观看 | 在线播放国产一区二区三区 | 91精品国产综合久久久动漫日韩 | 国产亚洲欧美在线 | 日本在线视频中文字幕 | 国产一区二区精品在线 | 国产99久久精品一区二区永久免费 | 精品久久久久久久久久久院品网 | 一级毛片成人免费看a | 国产一级视频 | 97精品国产97久久久久久免费 | 久久夜色精品国产 | 午夜在线视频 |