查看: 4197|回复: 20

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

[复制链接]
回帖奖励 6 金币 回复本帖可获得 3 金币奖励! 每人限 1 次(中奖概率 50%)
  • TA的每日心情
    奋斗
    2020-3-22 18:12
  • 签到天数: 62 天

    [LV.6]常住居民II

    发表于 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上显示

    不说了讲得太累了直接附上代码:

    [mw_shl_code=arduino,true]#include <U8g2lib.h>


    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();                     
    }[/mw_shl_code]

    没错,u8g2.setFont();设置替换的字体就可以显示那段你你想要的中文了。
    格式工厂1569821757376.png
    ----------------------------END-------------------------------

  • TA的每日心情
    奋斗
    2020-3-22 18:12
  • 签到天数: 62 天

    [LV.6]常住居民II

     楼主| 发表于 2020-1-25 23:56 | 显示全部楼层
    为了预防大家u8g2库了没有tools这个文件夹我发百度网盘,让大家放心下载
    链接: https://pan.baidu.com/s/1gebsgWoKnjpoZm-uOZG-rg 提取码: SRol
  • TA的每日心情
    无聊
    2020-5-11 15:55
  • 签到天数: 107 天

    [LV.6]常住居民II

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

    回帖奖励 +3 金币

    哇,真厉害!顶。
  • TA的每日心情
    奋斗
    2020-3-22 18:12
  • 签到天数: 62 天

    [LV.6]常住居民II

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

    感谢支持

    该用户从未签到

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

    [LV.2]偶尔看看I

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

    回帖奖励 +3 金币

    顶顶顶顶顶顶顶
  • TA的每日心情
    开心
    2020-1-14 13:13
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    发表于 2019-12-3 17:46 | 显示全部楼层

    回帖奖励 +3 金币

    有没有制作好的库文件,贴出来一下吧,谢谢。
  • TA的每日心情
    郁闷
    2019-8-16 23:35
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    发表于 2019-12-4 07:26 | 显示全部楼层
    为啥我在库管理下的库,第一步里的文件夹都没有。。。。
  • TA的每日心情
    郁闷
    2019-8-16 23:35
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    发表于 2019-12-4 08:43 | 显示全部楼层

    回帖奖励 +3 金币

    改好了,但是最后把库放进去后,一直报错没有此库
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    热门推荐

    5分钟带你快速了解新一代开发板:M5STACK
    5分钟带你快速了解新一代
    一、什么是M5Stack M5Stack是一种模块化、可堆叠扩展的开发板,每个模块
    创客火首发无人机编队套装,开启不一样的人工智能教育
    创客火首发无人机编队套装
    2017年国务院发布《新一代人工智能发展规划》,提出要广泛开展人工智能科普活动,在中
    求助,用l298n模块控制电机转速,老是无缘无故的转动怎么...
    求助,用l298n模块控制电
    代码如下:int state1=0; int state2=0; void setup() { pinMode(9,OUTPUT); pinMode(
    【干货分享】mega2560原理图PCB图纸altium designer18
    【干货分享】mega2560原理
    分享一下mega2560的板子 AD版本 **** 本内容被作者隐藏 **** ergo
    绑定github账号,免费增加设备额度
    绑定github账号,免费增加
    免费增加blinker设备额度的方法: 1.登录点灯管理台( https://admin.diandeng.tech/
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
    快速回复 返回顶部 返回列表