U8G2自定义中文字库的方法

使用U8G2库来做为Oled显示,但是中文支持不够用,打算使用自己建的中文字库

需要的材料和工具:

  1. .map文件
  2. .pdf文件(字体文件)
  3. bdfconv.exe(u8g2自带)
  4. 文本与unicode码转换小工具
  5. TTF to BDF工具 otf2bdf(u8g2 github里有下载)

1 收集字符到 txt 文件

虽然 iconv 工具支持几乎所有的字符集编码,但建议原始 txt 文件还是采用 UTF-8 编码保存。

txt 文本文件可以换行,也可以存在重复的字符。但不能含有 ASCII 字符。比如下列 str.txt 文件

!"#¥%&'()*+,-./
0123456789:;<=>?
@ABCDEFGHIJKLMNO
PQRSTUVWXYZ[\]^_
`abcdefghijklmno
pqrstuvwxyz{|} ̄
温度湿度

2 将字符文件转换成bdfconv 需要的Map文件

echo '32-128,' > myfont.map
cat str.txt | iconv -f utf-8 -t c99 | sed 's/\\u\([0-9a-f]\{4\}\)/\$\1,\n/g' | sort | uniq  |sed 's/^.//' | tr '/a-f/' '/A-F/' >> myfont.map

3 将字体文件转换在bdf文件

通过在u8g2的github提供的otf2bdf工具

ps: 这个工具在xp 系统下解压开来提示缺少两个 dll freetype6.dllzlib1.dll 网上下载这两个dll 放在otf2bdf同目录下就可以工作

8x8 Fonts:

otf2bdf -r 72 -p 8  -o 

16x16 Fonts:

otf2bdf -r 72 -p 16  -o 

4 使用 bdfconv 转换

bdfconv -b 0 -f 1 -M myfont.map -n my_88yh_font -o my_88yh_font.c 8x8yh.bdf -d 8x8yh.bdf

最后成生成的 my_88yh_font.c 头部添加#include "my_88yh_font.h"

arduino 处理

增加头文件 my_88yh_font.h

#ifndef _MYFONT_H
#define _MYFONT_H

#include 
#include 

#ifdef __cplusplus
extern "C" {
#endif

#ifndef U8G2_USE_LARGE_FONTS
#define U8G2_USE_LARGE_FONTS
#endif

#ifndef U8X8_FONT_SECTION

#ifdef __GNUC__
#  define U8X8_SECTION(name) __attribute__ ((section (name)))
#else
#  define U8X8_SECTION(name)
#endif

#if defined(__GNUC__) && defined(__AVR__)
#  define U8X8_FONT_SECTION(name) U8X8_SECTION(".progmem." name)
#endif

#if defined(ESP8266)
#  define U8X8_FONT_SECTION(name) __attribute__((section(".text." name)))
#endif

#ifndef U8X8_FONT_SECTION
#  define U8X8_FONT_SECTION(name) 
#endif

#endif

#ifndef U8G2_FONT_SECTION
#define U8G2_FONT_SECTION(name) U8X8_FONT_SECTION(name) 
#endif

extern const uint8_t my_88yh_font[] U8G2_FONT_SECTION("my_88yh_font");


#ifdef __cplusplus
}
#endif

#endif

你可能感兴趣的:(esp8266,arduino)