查看: 627|回复: 6

[教程] 【Arduino】u8g2中文字库制作教程 小白请进

[复制链接]
回帖奖励 24 金币 回复本帖可获得 3 金币奖励! 每人限 1 次(中奖概率 50%)
  • TA的每日心情
    郁闷
    2019-10-27 12:29
  • 签到天数: 51 天

    [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了
    捕获3.PNG
    chinese4.map不是自带的是我写的大家不要慌
    用文本打开chinesetext.map输入    32-128,    这个是26个字母和一些符合的“坐标”
    4.PNG 捕获.PNG

    现在.map文件已经打好了“地基”下面来制作中文字符的“坐标”
    比如我需要这些中文:中文字库制作教程
    复制这些文字到文本与unicode码转换小工具-----注意“Unicode分隔符”里的内容
    5.PNG
    “, $”“,”与“$”之间有空格“, $”是每个坐标的间隔
    复制unicode到.map文件里
    6.PNG
    删除第一个“, ”,保存文件,我们需要的.map文件就制作完成了。

    Second、制作.bdf文件
              我们到系统盘的windows文件夹里的font文件夹找到我们想要的中文字体----我选择了“宋体”
    7.PNG
    把它复制出来 8.PNG
    打开GuiTool,打开刚刚提取的字体文件
    9.PNG
    选择中文字符集,勾选Bdf。
    11.PNG
    在工具栏里设置字体大小,点击“生成字符”
    12.PNG
    把生成的字体文件复制到u8g2库里的bdf文件夹里
    13.PNG
    OK,bdf文件也准备好了,下面来到最最最重要的部分了。


    Third、使用bdfconv生成字库文件
    bdfconv在u8g2bdfconv文件夹里
    14.PNG
    它须要相应的代码来运行程序,通过代码命令生成字库,代码如下
    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(随便)用文本打开

    15.PNG

    要输入的内容格式为:

    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文件 16.PNG

    保存,回到bdfconv目录双击刚刚的.bat文件,它就回执行生成字库和tga图

    18.PNG

    打开tga文件,已有刚刚想要的文字

    17.PNG

    字库做好了,不过还没有结束。


    Fourth、替换到字体文件

      用文本打开刚刚生成的.c文件(我生成的是myfont.c)

    19.PNG

      打开u8g2库里的csrc文件夹中的 u8g2_fonts.c,找到u8g2_font_unifont_t_chinese1

    20.PNG

      myfont.c红框里的内容替换u8g2_font_unifont_t_chinese1字库里的内容

    21.png

    其实可以替换到其它字库里,只要你制作的字库小于你要替换的字库如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();设置替换的字体就可以显示那段你你想要的中文了。
    格式工厂1569821757376.png
    ----------------------------END-------------------------------

  • TA的每日心情
    郁闷
    2019-11-4 14:50
  • 签到天数: 93 天

    [LV.6]常住居民II

    发表于 2019-10-3 14:15 | 显示全部楼层

    回帖奖励 +3 金币

    哇,真厉害!顶。
  • TA的每日心情
    郁闷
    2019-10-27 12:29
  • 签到天数: 51 天

    [LV.5]常住居民I

     楼主| 发表于 2019-10-3 20:42 来自手机 | 显示全部楼层
    wangyirun 发表于 2019-10-3 14:15
    哇,真厉害!顶。

    感谢支持

    该用户从未签到

    发表于 2019-10-3 20:57 来自手机 | 显示全部楼层
    够详细明了,赞一个
  • TA的每日心情
    郁闷
    2019-10-19 17:19
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2019-10-17 23:48 | 显示全部楼层

    回帖奖励 +3 金币

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

    本版积分规则

    热门推荐

    【原创】全球最小口袋3D打印机mini one直播教程贴
    【原创】全球最小口袋3D打
    最近闲得蛋疼,没事搞个掌上3D打印机,先放效果图吧。 搞了半天,终于能正常打印,
    程序设计问题求大虾们帮帮忙
    程序设计问题求大虾们帮帮
    大家好,我是一个萌新想设计一个程序,现在遇到困难了。当运行按下按钮,电机会向end
    请问 3块 MCP 4725 ,能否同时接在一起使用?
    请问 3块 MCP 4725 ,能否
    买来时,ADDR是全开路的,使用代码中的所有地址,均无法使用。 // For Adafruit M
    打砖块游戏
    打砖块游戏
    **** 本内容被作者隐藏 ****
    OLED 128*64自制可达10000000个选项的菜单(已更新)
    OLED 128*64自制可达10000
    OLED 128*64自制可达10000000个选项的菜单 温馨提示: 建议占个楼再食用本帖子
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
    快速回复 返回顶部 返回列表