使用U8G2库来做为Oled显示,但是中文支持不够用,打算使用自己建的中文字库
需要的材料和工具:
- .map文件
- .pdf文件(字体文件)
- bdfconv.exe(u8g2自带)
- 文本与unicode码转换小工具
- 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.dll 和 zlib1.dll 网上下载这两个dll 放在otf2bdf同目录下就可以工作
8x8 Fonts:
otf2bdf -r 72 -p 8 <ttf-file> -o <bdf-file>
16x16 Fonts:
otf2bdf -r 72 -p 16 <ttf-file> -o <bdf-file>
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 <stdint.h>
#include <stddef.h>
#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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。