查看: 276|回復: 4
打印 上一主題 下一主題

[教程] 【Arduino】u8g2中文字庫制作教程 小白請進

[復制鏈接]
回帖獎勵 27 金幣 回復本帖可獲得 3 金幣獎勵! 每人限 1 次(中獎概率 50%)
  • TA的每日心情
    郁悶
    2019-10-7 01:57
  • 簽到天數: 50 天

    [LV.5]常住居民I

    跳轉到指定樓層
    樓主
    發表于 2019-9-30 13:49 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
    本帖最后由 zjssun 于 2019-9-30 16:26 編輯

    我知道對于這個話題許多大佬們都會,發這個貼子也算是炒冷飯了,所以一開始我也十分糾結到底發不發這個帖子,后來我發現一些小白其實是十分期待有一個十分詳細的u8g2中文字庫制作教程看一遍就會的這種,所以我決定在國慶假期了完成這個帖子。話不多說,開講了~



    需要的材料和工具:
       1. .map文件
       2. .pdf文件(字體文件)
       3.bdfconv.exe(u8g2自帶)
       4.文本與unicode碼轉換小工具
       5.GuiTool(把字體文件轉為bdf格式)

    First、制作.map文件
          那么.map文件是個什么用的呢?它好比喻一個地圖,它的坐標就是16進制的unicode碼,bdfconv工具就會根據這些坐標來定位翻譯每個坐標的內容生成字庫。
          .map文件在u8g2字庫的build文件夾里,具體地址:Arduino\libraries\u8g2-master\tools\font\build
          在該文件夾了創建一個文件:chinesetext.map ,文件名隨便改你喜歡的都行(前提是要英文)只要后綴是.map就OK了

    chinese4.map不是自帶的是我寫的大家不要慌
    用文本打開chinesetext.map輸入    32-128,    這個是26個字母和一些符合的“坐標”


    現在.map文件已經打好了“地基”下面來制作中文字符的“坐標”
    比如我需要這些中文:中文字庫制作教程
    復制這些文字到文本與unicode碼轉換小工具-----注意“Unicode分隔符”里的內容

    “, $”“,”與“$”之間有空格“, $”是每個坐標的間隔
    復制unicode到.map文件里

    刪除第一個“, ”,保存文件,我們需要的.map文件就制作完成了。

    Second、制作.bdf文件
              我們到系統盤的windows文件夾里的font文件夾找到我們想要的中文字體----我選擇了“宋體”

    把它復制出來
    打開GuiTool,打開剛剛提取的字體文件

    選擇中文字符集,勾選Bdf。

    在工具欄里設置字體大小,點擊“生成字符”

    把生成的字體文件復制到u8g2庫里的bdf文件夾里

    OK,bdf文件也準備好了,下面來到最最最重要的部分了。


    Third、使用bdfconv生成字庫文件
    bdfconv在u8g2bdfconv文件夾里

    它須要相應的代碼來運行程序,通過代碼命令生成字庫,代碼如下
    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.


    大家看到這里不要慌,其實我們制作字庫只用當中的幾個命令而已分別是:-v -b -f -M -n -o -d

    它們的意義分別是:-v打印日志消息   -b設置字體構建模式,0:正比,1:共同高度,2:單空間,3:8的倍數

    -f設置字體格式,0:ucglib字體,1:u8g2字體,2:u8g2未壓縮8x8字體(強制-b 3)

    -m 獲取.map文件 -n生成字庫的文件名 -o輸出.c文件  -d啟用bdf.tga的生成并為描述指定bdf字體

    我們現在已經知道它們是干什么的了,下面我就生成字庫吧

    在bdfconv目錄下創建.bat文件chinesefont.bat(隨便)用文本打開


    要輸入的內容格式為:

    bdfconv.exe -v -b 輸入字體構建模式 -f 輸入字體格式(空格).bdf文件路徑 -M 輸入.map文件路徑 -n 設置字庫文件的文件名

    -o 文件名.c -d 輸入.bdf文件路徑生成tga圖

    格式實例:

    bdfconv.exe -v -b 2 -f 1 C:/Users/kk/Documents/Arduino/libraries/u8g2-master/tools/font/bdf/simsun_U16.bdf  -M C:/Users/kk/Documents/Arduino/libraries/u8g2-master/tools/font/build/chinesefont.map -n myfont -o myfont.c -d C:/Users/kk/Documents/Arduino/libraries/u8g2-master/tools/font/bdf/simsun_U16.bdf

    注意:路徑是你自己文件的路徑

    輸入到剛剛新建的.bat文件

    保存,回到bdfconv目錄雙擊剛剛的.bat文件,它就回執行生成字庫和tga圖


    打開tga文件,已有剛剛想要的文字


    字庫做好了,不過還沒有結束。


    Fourth、替換到字體文件

      用文本打開剛剛生成的.c文件(我生成的是myfont.c)


      打開u8g2庫里的csrc文件夾中的 u8g2_fonts.c,找到u8g2_font_unifont_t_chinese1


      myfont.c紅框里的內容替換u8g2_font_unifont_t_chinese1字庫里的內容


    其實可以替換到其它字庫里,只要你制作的字庫小于你要替換的字庫如myfont.c中的[1681]小于u8g2_font_unifont_t_chinese1中的[14178]就可以替換。


    Finally、在OLED上顯示

    不說了講得太累了直接附上代碼:

    U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0);//四腳0.96寸OLED,IIC控制(SDA,SCL) void setup(void) {   u8g2.begin();   u8g2.enableUTF8Print(); } void loop(void) {   u8g2.clearBuffer();                     u8g2.setCursor(0,20);   u8g2.setFont(u8g2_font_unifont_t_chinese1); //看這里~   u8g2.print("中文字庫制作教程");   u8g2.sendBuffer();                      }


    沒錯,u8g2.setFont();設置替換的字體就可以顯示那段你你想要的中文了。

    ----------------------------END-------------------------------

    覺得文章有幫助,可以請我吃甜甜圈
  • TA的每日心情
    難過
    2019-10-4 14:19
  • 簽到天數: 91 天

    [LV.6]常住居民II

    板凳
    發表于 2019-10-3 14:15 | 只看該作者

    回帖獎勵 +3 金幣

    哇,真厲害!頂。
  • TA的每日心情
    郁悶
    2019-10-7 01:57
  • 簽到天數: 50 天

    [LV.5]常住居民I

    地板
     樓主| 發表于 2019-10-3 20:42 來自手機 | 只看該作者
    wangyirun 發表于 2019-10-3 14:15
    哇,真厲害!頂。

    感謝支持
    覺得文章有幫助,可以請我吃甜甜圈

    該用戶從未簽到

    5#
    發表于 2019-10-3 20:57 來自手機 | 只看該作者
    夠詳細明了,贊一個
    您需要登錄后才可以回帖 登錄 | 立即注冊  

    本版積分規則

    熱門推薦

    esp32作為智能主機使魚缸內溫度保持在28度種植水草
    esp32作為智能主機使魚缸
    esp32作為智能主機使魚缸內溫度保持在28度種植水草, 設計原則, 一,使用我手上現有
    請大佬幫助如何分別控制兩塊pca9685上的舵機
    請大佬幫助如何分別控制兩
    目前一塊驅動板上的舵機可以分別控制分別是0到15號舵機,不清楚在級聯的情況下如何分
    【干貨分享】mega2560原理圖PCB圖紙altium designer18
    【干貨分享】mega2560原理
    分享一下mega2560的板子 AD版本 **** 本內容被作者隱藏 **** ergo
    [Arduino物聯網開發實戰4]天貓精靈控制1
    [Arduino物聯網開發實戰4]
    [md] 上一篇:(http://www.lfjdqf.icu/thread-83175-1-1.html) blinker支持多種智
    【項目】基于Arduino Nano的多功能桌面感應垃圾桶
    【項目】基于Arduino Nano
    基于Arduino Nano的多功能桌面感應垃圾桶隨著大學生活不斷往前邁進,宿舍桌面上的雜物
    Copyright   ©2015-2016  Arduino中文社區  Powered by©Discuz!   ( 蜀ICP備14017632號-3 )
    快速回復 返回頂部 返回列表
    美娱娱乐登录网址