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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8508|回復: 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一区二区三区在线观看 | 99久久亚洲 | 国产综合精品一区二区三区 | 国产一级片一区二区三区 | 国产在线精品一区二区 | 欧美一区二区大片 | 暖暖成人免费视频 | 国产精品一区二区三级 | 日韩欧美中文字幕在线观看 | 国产999精品久久久久久 | 99精品免费视频 | 久久久久国产精品一区二区 | 久久久久9999亚洲精品 | 日本一区二区三区四区 | 免费视频二区 | 国产精品v| 国产欧美日韩一区二区三区在线 | 欧美日韩亚洲国产 | 欧美最猛黑人xxxⅹ 粉嫩一区二区三区四区公司1 | 久久久久久久久久毛片 | 中文字幕日韩欧美 | 国产精品99久 | 中文字幕第十页 | 亚洲激情在线观看 | 日韩高清三区 | 成年人在线观看视频 | 欧美午夜精品理论片a级按摩 | 成人高潮片免费视频欧美 | 久久精品国产一区二区电影 | 国产精品国产精品国产专区不蜜 | 亚洲精品一区二区网址 | 亚洲精品久久久一区二区三区 | 久久久亚洲一区 | 九九亚洲 | www.久久 | 97精品超碰一区二区三区 | 五十女人一级毛片 | 日韩精品视频中文字幕 | 精品国产乱码久久久久久丨区2区 | 天天天天操 |