MakerLab创客实验室 — Let's Make something.
现在注册
已注册用户请 登入

Mini Panel真正开启中文汉字支持u8glib Marlin

3D打印机上用的LCD控制器都是英文的菜单,给新手带来了障碍,MakerLab现已开发支持中文的Marlin版本
Mini Panel简介48 U8glib如何显示中文74 U8glib如何定制字体8 Marlin中文版LCD界面25 如何使用Marlin中文版19 Marlin LCD菜单的功能11 bdf字体文档下载1
Andy large avatar
MakerLab创客实验室  ›  学习系统  ›  3d 打印  ›  Mini Panel真正开启中文汉字支持u8glib Marlin

U8glib如何显示中文

By Andy at 2 年前 , 26562 次浏览

U8glib之前并没有用过。最近为了让Marlin固件支持中文显示(需要支持图形显示的LCD,如常见的12864液晶),花时间研究了一下这个库。很强大、很好的一个库。在这里简单介绍一下如何使用U8glib显示中文或其它字体的字(包括英文或其它语言)。希望对有同样或类似需求的朋友能够提供帮助和参考。

强大的库

U8glib是非常一个非常强大的库,我体验到的强大之处有:
1、不同驱动芯片及不同分辨率的支持,这就让用户几乎不必关系底层驱动的部分,只需要写自己的程序就可以了,要知道底层驱动的调试比较费时间的;
2、不同连接方式支持,可以支持硬件SPI、软件SPI及8位并行控制方式;
3、支持Arduino、AVR及ARM等不同芯片,CPU升级时,移植代价比较小;
4、多种字体(几十种)可选,从4像素到42像素都有,不过都是最常见的ASCII码,中文等其它特殊字符需要自己定制(即使用自己的字体文件);
5、更换或定制字体还算容易,对于我来说,的确是研究了一段时间才搞明白如何添加新字体,不过一旦掌握,就很简单了;
6、支持横屏或竖屏显示;

局限性

虽然U8glib有很多优点,但也有它的局限性,至少我发现是这样的。尤其是对中文这样的无法用ASCII码覆盖的复杂字符(需要用Unicode标识)。
U8glib的局限性主要体现者对字体的处理方式上,虽然支持几十种字体,但每种字体最多只支持255个字符(0x01~0xFF),而对于中文、韩文及日文等的字符数量成千上万个,要想实现中文语句:创客实验室,可能需要切换不同的字体来实现对各个字的显示,总是切换字体确实比较麻烦,并且切换字体后,还需要重新确定显示坐标。
另一个局限也是提现在字体方面,就是U8glib字体都是0x00~0xFF的ASCII码,而中文则是Unicode,当用ASCII表示中文时,意味着不是完整的Unicode,而是发送\xab\x03\xef等之类的不易读的ASCII码(不是标准的)。所以要想实现显示一句中文,需要自己对应好正确的字体和ASCII码两个才可以正确显示一个汉字,并且每一个汉字都可能需要不同的字体和ASCII。说的有点模糊,看看下面这个例子吧。

如果你不想学这些东西,可以直接下载我整合的bdf文件:http://www.makerlab.me/guides/9/articles/82

举例

如何显示创客实验室这5个汉字呢?
要想显示这几个汉字,还真是不简单,让我们按照步骤一步步的走。注意,U8glib没有所谓的带或不带中文字库,所以带不带中文字库的显示屏都需要以下步骤(这是我的理解,如果我有错误,欢迎指正)。

第一步,确定<code>创客实验室</code>这几个汉字的Unicode码

这一部不难,有很多工具可以使用,我用的上这样网站: 转码工具 输入这5个汉字后,点击向下的箭头,就可以看到这几个字分别对应的Unicode了:

  521B  [CJK Unified Ideographs]
5BA2 [CJK Unified Ideographs]
5B9E [CJK Unified Ideographs]
9A8C [CJK Unified Ideographs]
5BA4 [CJK Unified Ideographs]

第二步,使用U8glib提供的工具,生产字体文件

U8glib为我们提供了必要的工具和文档,下载U8glib后( https://code.google.com/p/u8glib/ ,由于这个地址需要翻墙,所以没办法翻墙的朋友可以到网盘下载:http://pan.baidu.com/s/1dDfApod ,提供了多个不同版本,我使用的是Arduino版本,并且我把所有的源文件都下载了下来,因为有几个工具及文件在Arduino版本代码里面并没有,需要单独下载),可能需要另外下载的工具上 bdf2u8g(.exe)【用来把字体文档bdf转化为字体数据的】,Unicode.bdf(则是完整的Unicode字体文件,比较大,在U8glib源码中可以下载到Unicode.bdf 9.8M大小),都下载完成后,放入同一个文件夹,来转换字体,命令如下(主要windows版本需要加.exe,linux系统不需要):
linux系统命令是:./bdf2u8g -b 0 -e 255 -l 156 -u 157 unifont.bdf chinese_test chinese_test.c
windows系统命令是:bdf2u8g.exe -b 0 -e 255 -l 156 -u 157 unifont.bdf chinese_test chinese_test.c
等等,这都是什么意思?
bdf2u8g命令的参数说明:
必须的参数:
bdf文件,这是你需要转换的字体文件,bdf格式;
字体名称,用于生产代码数据的标识;
.c文件,c语言文件;
可选参数:
[-b 数字] ASCII码的起始位,范围是0~255;
[-e 数字] ASCII码的结束位,范围是0~255;
[-l page] 用于定位超出0~255范围的Unicode的页数,如果ASCII码范围是0~127,则使用这个参数,如果范围在128~255,则使用下面的-u参数;
[-u page] 用于定位超出0~255范围的Unicode的页数,如果ASCII码范围是128~255,则使用这个参数,如果范围在0~127,则使用上面的-l参数;
创 521B计算页地址为:0x521B/0x80 = 0xA4 = 164,由于1B=27 < 7F,所以使用-l参数即可,命令为:./bdf2u8g -b 27 -e 27 -l 164 unifont.bdf chinese_test chinese_test.c执行命令后,会输出:

encoding range 27..27
bbx 14 16 0 -2 encoding 27
input file '../bdf/unifont.bdf'
u8g font name 'chinese_test'
output file 'chinese_test.c'

这时打开生产的c代码文件内容如下:

#include "u8g.h"
const u8g_fntpgm_uint8_t chinese_test[55] U8G_FONT_SECTION("chinese_test") = {
0,16,16,0,254,0,0,0,0,0,27,27,0,14,254,0,
0,14,16,32,16,0,254,8,4,8,4,20,4,18,36,33,
36,64,164,190,36,34,36,34,36,34,36,42,36,36,36,32,
132,32,132,31,148,0,8};

需要注意的是,如果在Arduino IDE下使用,需要调整为:

#include "utility/u8g.h"
const u8g_fntpgm_uint8_t chinese_test[55] U8G_SECTION(".progmem.chinese_test") = {
0,16,16,0,254,0,0,0,0,0,27,27,0,14,254,0,
0,14,16,32,16,0,254,8,4,8,4,20,4,18,36,33,
36,64,164,190,36,34,36,34,36,34,36,42,36,36,36,32,
132,32,132,31,148,0,8};

前面的include部分是必须改的,U8G_SECTION(".progmem.chinese_test")这个部分可能不同版本需要不同的写法,我用的版本必须改为下面的,否则会有错误。
完整的Arduino代码(显示一个字):

#include "U8glib.h"
#include "utility/u8g.h"
const u8g_fntpgm_uint8_t chinese_test[55] U8G_SECTION(".progmem.chinese_test") = {
0,16,16,0,254,0,0,0,0,0,27,27,0,14,254,0,
0,14,16,32,16,0,254,8,4,8,4,20,4,18,36,33,
36,64,164,190,36,34,36,34,36,34,36,42,36,36,36,32,
132,32,132,31,148,0,8};

U8GLIB_MINI12864 u8g(45,47);

void draw(void) {
// graphic commands to redraw the complete screen should be placed here
u8g.setFont(chinese_test);
//u8g.setFont(u8g_font_osb21);
u8g.drawStr( 0, 22, "\x1b");
}

void setup(void) {

// flip screen, if required
// u8g.setRot180();

// set SPI backup if required
//u8g.setHardwareBackup(u8g_backup_avr_spi);

// assign default color value
if ( u8g.getMode() == U8G_MODE_R3G3B2 )
u8g.setColorIndex(255); // white
else if ( u8g.getMode() == U8G_MODE_GRAY2BIT )
u8g.setColorIndex(3); // max intensity
else if ( u8g.getMode() == U8G_MODE_BW )
u8g.setColorIndex(1); // pixel on
}

void loop(void) {
// picture loop
u8g.firstPage();
do {
draw();
} while( u8g.nextPage() );

// rebuild the picture after some delay
delay(500);
}

那么如何显示创客实验室5个汉字呢?你可能注意到了。这5个汉字并没有在unicode的同一页,也就是如果你想节省flash空间,降低字体数据大小的话,需要每个字生产一个字体,并且每个字切换一下字体(严格来说不是字体了,而是字数据),其它几个字的生产代码分别是:
客 5BA2生产代码:./bdf2u8g -b 162 -e 162 -u 183 unifont.bdf chinese_ke chinese_ke.c
实 ‎5B9E生产代码:./bdf2u8g -b 158 -e 158 -u 183 unifont.bdf chinese_shi chinese_shi.c
验 ‎9A8C生产代码:./bdf2u8g -b 140 -e 140 -u 132 unifont.bdf chinese_yan chinese_yan.c
室 ‎5BA4生产代码:./bdf2u8g -b 164 -e 164 -l 183 unifont.bdf chinese_shi2 chinese_shi2.c

其中有几个字,都在5B00~5BFF范围内,可以生产在一个文档中,不过夹杂的一些不相关字会占用flash空间。
数据都生产完成了,但每个字都需要切换一次字体,真的让人受不了,有没有解决办法呢?答案是有的,我经过很多测试和对比,发现如果直接将字体数据进行合并,会导致显示不正常,为了克服这个问题,需要对单独生产的数据进行调整,调整后的创客实验室5个字的数据为:

const u8g_fntpgm_uint8_t chinese_test[] U8G_SECTION(".progmem.chinese_test") = {
0,16,16,0,254,0,0,0,0,0,161,165,0,14,254,0,/\*<b>161,165</b>161165A1A5 \*/
//Chinese "创"
0,14,16,32,16,0,254,8,4,8,4,20,4,18,36,33,
36,64,164,190,36,34,36,34,36,34,36,42,36,36,36,32,
132,32,132,31,148,0,/\*8, \*/
//Chinese "客"
0,15,16,32,16,0,254,2,0,1,0,127,254,64,2,136,
4,15,240,16,32,44,64,3,128,28,112,224,14,31,240,16,
16,16,16,31,240,16,/\*16\*/
//Chinese "实"
0,15,16,32,16,0,254,2,0,1,0,127,254,64,2,136,
132,4,128,4,128,16,128,8,128,8,128,255,254,1,64,2,
32,4,16,24,8,96,/\*4\*/
//Chinese "验"
0,15,16,32,16,0,254,0,32,248,32,8,80,72,80,72,
136,73,4,74,250,124,0,4,68,4,36,29,36,228,168,68,
136,4,16,43,254,16,/\*0\*/
//Chinese "室"
0,15,15,30,16,0,255,2,0,1,0,127,254,64,2,128,
4,63,248,4,0,8,32,31,240,1,16,1,0,63,248,1,
0,1,0,255,254
};

要想显示这5个字,只需要将之前提到的arduino代码中的显示代码改为u8g.drawStr( 0, 28, "\xa1\xa2\xa3\xa4\xa5");就可以显示了,如图:

可以看到,中文可以显示了,但字体是Unicode.bdf文件中标准的字体,16X16像素,如果想显示个性字体,请参考下一部分

本文最后更新于:7 个月前
74 回复
柯察极限 medium avatar
#1 - 2 年前
柯察极限

做到第二步就做云里雾里了,
1、因为有几个工具及文件在Arduino版本代码里面并没有,需要单独下载),可能需要另外下载的工具上 bdf2u8g(.exe)
------------------请教下这个EXE文件是不是个安装文件,我下下来是个压缩包,
2、【用来把字体文档bdf转化为字体数据的】,Unicode.bdf(则是完整的Unicode字体文件,比较大
-----------------这个具体是怎么转的,能写一个图文教程吗
3、(主要windows版本需要加.exe,linux系统不需要):linux系统命令是:./bdf2u8g -b 0 -e 255 -l 156 -u 157 unifont.bdf chinese_test chinese_test.c
windows系统命令是:bdf2u8g.exe -b 0 -e 255 -l 156 -u 157 unifont.bdf chinese_test chinese_test.c
------------------这个也许是前面都不搞明白,这步就更不明白了,在哪里输入这个命令?

希望站长能写一个图文教程,尽可能的详细一些,方便各位玩家,谢谢!

Andy medium avatar
#2 - 2 年前
Andy

@柯察极限
1、下这个EXE文件是不是个安装文件,我下下来是个压缩包?
我记不清了,如果是压缩包,解压后应该会有exe文件,在命令行下测试一下能不能用就可以了。

2、这个具体是怎么转的,能写一个图文教程吗?
你说的bdf怎么转的?说实话我也不知道,所以建议直接找提供bdf格式的字体来使用。

3、哪里输入这个命令?
命令行下输入命令。如下图,不过我用的不是windows系统,可能不太一样。

柯察极限 medium avatar
#3 - 2 年前
柯察极限

我下下来的,不是EXE文件,里面解压了也没有EXE,
把缀改为EXE也不能运行,我是WINDOWS系统的,

柯察极限 medium avatar
#7 - 2 年前
柯察极限

去下下来的文件不是EXE文件,里面也没有EXE文件
能传给我一份那个文件吗52240847@QQ.COM

buzhisuoyun medium avatar
#9 - 2 年前
buzhisuoyun

这句 " 验 ‎9A8C生产代码:./bdf2u8g -b 140 -e 140 -u 132 unifont.bdf chinese_yan chinese_yan.c" 中的132是怎么来的?

按照你讲的方法 “ 创 521B计算页地址为:0x521B/0x80 = 0xA4 = 164,由于1B=27 < 7F,所以使用-l参数即可,命令为:./bdf2u8g -b 27 -e 27 -l 164 unifont.bdf chinese_test chinese_test.c ”

那么 验 ‎9A8C 的计算页地址不是应该 0x‎9A8C/0x80 = 0x135 = 309 这样算吗? 结果大于255了,怎么处理的?

Andy medium avatar
#10 - 2 年前
Andy

@buzhisuoyun 好像我写错了。正确的应该就是-u 309,你生成一下数据试试显示正常吗。另外-l -u的参数没有255的限制。-b -e才有255最大限制。

xuximeng medium avatar
#11 - 2 年前
xuximeng

@Andy 感谢,已经成功显示中文,而且和您的固件原带的也不冲突,只是我又另定义了一种字体,因为我生成的字体数据和您生成的的第一行内容有区别,所以只能另做一种字体了! 也明白了你的字体数据只其实已经又单独生成了32-127这些的ASCII码,之后才是您再添加的中文。这个工作的主要难度在于转换字体数据。感谢您的授之以渔! 以后可能还会有问题,到时再麻烦您解答!

涛涛 medium avatar
#12 - 2 年前
涛涛

@xuximeng 请问你是怎么追加汉字的呢?

恶作剧 medium avatar
#13 - 2 年前
恶作剧

我很好奇为什么计算页地址是除以0x80呢?

senlin_star medium avatar
#15 - 2 年前
senlin_star

你好,你说这些步骤二的链接中给的网址都打不开,能给传个其它的下载链接或者能下载的地址么?你的这个网上能提供下载附件么?

Andy medium avatar
#16 - 2 年前
Andy

@senlin_star 哪个链接?如果有条件,请翻墙查看,因为google相关的网站都被封了。

821379 medium avatar
#18 - 2 年前
821379

我是用 鋒 这个字
bdf2u8g.exe -b 210 -e 210 -u 293 unifont.bdf chinese_feng chinese_feng.c
转换后
/*
Fontname: -gnu-unifont-medium-r-normal--16-160-75-75-c-80-iso10646-1
Copyright:
Capital A Height: 0, '1' Height: 0
Calculated Max Values w=15 h=16 x= 0 y= 0 dx=16 dy= 0 ascent=14 len= 0
Font Bounding box w=16 h=16 x= 0 y=-2
Calculated Min Values x= 0 y=-2 dx= 0 dy= 0
Pure Font ascent = 0 descent= 0
X Font ascent = 0 descent= 0
Max Font ascent =14 descent=-2
*/
#include "u8g.h"
const u8g_fntpgm_uint8_t chinese_feng[55] U8G_SECTION(".progmem.chinese_feng") = {
0,16,16,0,254,0,0,0,0,0,210,210,0,14,254,0,
0,15,16,32,16,0,254,16,64,16,64,40,252,36,136,65,
80,184,32,16,216,19,38,252,248,16,32,148,248,88,32,83,
254,28,32,224,32,64,32};

之后的步骤要怎么做

Andy medium avatar
#19 - 2 年前
Andy

@821379 把生成的代码,全部或部分复制到arduino中u8glib的例子中,然后测试显示一下是否正常。

821379 medium avatar
#20 - 2 年前
821379

例子中,是指哪個...
因為不是學這的所以不懂得很多

Andy medium avatar
#21 - 2 年前
Andy

@821379 arduino IDE中,有例子(example),然后找到u8glib相关的例子即可

毛毛虫002012 medium avatar
#22 - 2 年前
毛毛虫002012

@Andy,请教两个问题。第一,所下载的bdf2u8g.exe(1)打不开(win7系统);第二,unicode下载不了,可以给个链接么?

Andy medium avatar
#23 - 2 年前
Andy

@毛毛虫002012
1、bdf2u8g.exe这个是命令行程序,需要在cmd里面输入命令使用。双击打开应该不行。
2、unicode应该不难找,你搜索一下吧。可能需要翻墙下载

Andy medium avatar
#25 - 2 年前
Andy

@毛毛虫002012 你是什么问题具体说一下吧?仔细看一下我的教程,应该能看出端倪。好好理解一下。

毛毛虫002012 medium avatar
#28 - 2 年前
毛毛虫002012

@Andy
const u8g_fntpgm_uint8_t chinese_test[53] U8G_FONT_SECTION("chinese_test") = {
0,16,16,0,254,0,0,0,0,0,31,31,0,14,255,0,
0,15,15,30,16,0,255,1,0,17,0,17,0,17,0,63,
252,33,0,65,0,129,0,1,0,63,248,1,0,1,0,1,
0,1,0,255,254};
之后将这段代码复制到程序相关位置没反应!请教!!

Andy medium avatar
#29 - 2 年前
Andy

@毛毛虫002012

Arduino测试代码:

#include "U8glib.h"
#include "utility/u8g.h"
const u8g_fntpgm_uint8_t chinese_test[55] U8G_SECTION(".progmem.chinese_test") = {
0,16,16,0,254,0,0,0,0,0,31,31,0,14,255,0,
0,15,15,30,16,0,255,1,0,17,0,17,0,17,0,63,
252,33,0,65,0,129,0,1,0,63,248,1,0,1,0,1,
0,1,0,255,254};

U8GLIB_MINI12864 u8g(45,47);//这个代码非常关键,配置不对lcd及IO意味着无法显示;

void draw(void) {
// graphic commands to redraw the complete screen should be placed here
u8g.setFont(chinese_test);
//u8g.setFont(u8g_font_osb21);
u8g.drawStr( 0, 22, "\x1f");//根据你导出的数据是31,转化为16进制为0x1F
}

void setup(void) {

// flip screen, if required
// u8g.setRot180();

// set SPI backup if required
//u8g.setHardwareBackup(u8g_backup_avr_spi);

// assign default color value
if ( u8g.getMode() == U8G_MODE_R3G3B2 )
u8g.setColorIndex(255); // white
else if ( u8g.getMode() == U8G_MODE_GRAY2BIT )
u8g.setColorIndex(3); // max intensity
else if ( u8g.getMode() == U8G_MODE_BW )
u8g.setColorIndex(1); // pixel on
}

void loop(void) {
// picture loop
u8g.firstPage();
do {
draw();
} while( u8g.nextPage() );

// rebuild the picture after some delay
delay(500);
}

代码刷入后,应当显示你的字符

毛毛虫002012 medium avatar
#31 - 2 年前
毛毛虫002012

@Andy,请教下,我如何在固件font data marlin.h里面加入自己用bdf2u8g生成的代码数据,然后正常显示啊?

Andy medium avatar
#32 - 2 年前
Andy

@毛毛虫002012
首先上面的例子你都可以显示正常,并且明白了里面的原理。

然后生成字体数据,包含英文及常见符号和你想要的中文字体,复制到字体文档中;

然后编辑翻译部分代码让中文显示的编码跟你想定义的汉字对应,就可以了。

具体参考我的代码。

毛毛虫002012 medium avatar
#34 - 2 年前
毛毛虫002012

U8GLIB_MINI12864 u8g(45,47);//这个代码非常关键,配置不对lcd及IO意味着无法显示;

毛毛虫002012 medium avatar
#35 - 2 年前
毛毛虫002012

“U8GLIB_MINI12864 u8g(45,47);//这个代码非常关键,配置不对lcd及IO意味着无法显示;”请问@Andy,这个45、47具体怎么来的?

Andy medium avatar
#36 - 2 年前
Andy   via iPad

@毛毛虫002012 分别是我电路设计中对应的两个io口

yangkkokk medium avatar
#37 - 2 年前
yangkkokk

可以吧整个库文件放进SD卡,有效避免出错,记得日本人有个用i2c与eeprom做的字库,你们完全有时间把字库放到SD卡里,就是有点耗时间,但是这样你们的LCD程序就完整了,而且有推广价值了,目前你的程序只是翻译了一下而已,求突破!

yangkkokk medium avatar
#38 - 2 年前
yangkkokk

而且这样就比韩国棒子,日本矮子,快了先进了很多

alidetuou medium avatar
#39 - 2 年前
alidetuou

./bdf2u8g -b 27 -e 27 -l 164 unifont.bdf chinese_test chinese_test.c 是将这个输入到命令窗口吗

Andy medium avatar
#40 - 2 年前
Andy

@alidetuou 是的命令行呢,windows下好像不需要最前面的./就可以

alidetuou medium avatar
#41 - 2 年前
alidetuou

恩 是的 已经成功 不过有些字转换不出来呢 例如“匀”

Andy medium avatar
#42 - 2 年前
Andy

@alidetuou 转出来不是这个字?拿根据显示在字和“匀”,unicode编码差距找原因。很可能是编码计算错误导致的

alidetuou medium avatar
#43 - 2 年前
alidetuou

编码计的问题?那怎么解决啊?

Andy medium avatar
#44 - 2 年前
Andy

@alidetuou 你打算显示“匀”,实际显示为什么汉字?找到那个汉字的unicode,然后对比“匀”和这个字的unicode差距,然后修改bdf2u8g的参数。

alidetuou medium avatar
#45 - 2 年前
alidetuou

显示的是一个方框,里边是NUL,我查了这个在在unicode编码表中就是5300,而且我试了,只要后边是00的字,都显示这样,我猜可能是bdf2u8g的问题,

alidetuou medium avatar
#46 - 2 年前
alidetuou

这个转法是不是只能一个字一个字转,有没有方法把bdf中的都转了

Andy medium avatar
#47 - 2 年前
Andy

@alidetuou 不能都转,但可以最多转255个字符。但都是连续编码才可以。中文字太多,不行

alidetuou medium avatar
#49 - 2 年前
alidetuou

自己做bdf?怎么做 做出来要怎样计算

Andy medium avatar
#50 - 2 年前
Andy

@alidetuou 应该有字体设计软件可以做bdf,比如定制字体部分中我提到的软件,就可以保存为bdf格式。不需要计算吧,只需要把汉字放在0~255范围内就可以

alidetuou medium avatar
#51 - 2 年前
alidetuou

那要把所有的汉字做出来不是很麻烦?我现在要做的是把汉字转码出来保存,然后通过查询的方式显示需要的汉字

Andy medium avatar
#52 - 2 年前
Andy

@alidetuou 不可能把所有的汉字转出来。用多少转多少。这是u8glib的限制(每种字体255个字符最多),如果用你的方法实现的话,估计需要另外写一个lcd库。

alidetuou medium avatar
#53 - 2 年前
alidetuou

你知不知道转出来的这些码的意义,比如

const u8g_fntpgm_uint8_t dian[55] U8G_FONT_SECTION("dian") = {
0,16,16,0,254,0,0,0,0,0,14,14,0,14,254,0,
0,13,16,32,16,2,254,4,0,4,0,4,0,255,224,132,
32,132,32,132,32,255,224,132,32,132,32,132,32,255,224,132,
40,4,8,4,8,3,248};

这是个“电”字,它和其它字有相同的部分,这些相同的数字代表什么意思?

Andy medium avatar
#54 - 2 年前
Andy

@alidetuou 第一行有特殊含义,上面文章中提了一下,基本就是对这个字库的基本信息描述,我没有完全搞明白,但是,有几个应该是这个含义:
1、0,16,16...:中的16应该是字体大小的数据,你转的字体应该是16X16像素的;
2、...,14,14,...:中的第一个14代表字体起始ASCII码,第二个14表示结束ASCII码,因为你只转了一个字所以,这两个数字一样。如果你要在这端数据基础上增加另一个字,那么这两个数字就需要做调整,比如放在电数据后面的话,第二个14就需要改为15,比如你的第二个字数据是“脑”这个字的,那么要像显示“电脑”两个字,就需要:u8g.drawStr( 0, 22, "\x0e\x0f");当然如果你把这两个数字改为...,13,14,...,那么这段代码就需要调整为:u8g.drawStr( 0, 22, "\x0d\x0e");

其它的含义我也不太清楚。
希望对你有帮助。

alidetuou medium avatar
#56 - 2 年前
alidetuou

你前边说一次可以转255的字,怎么做,我只能转127个

alidetuou medium avatar
#57 - 2 年前
alidetuou

是不是可以用cmd的批量处理命令让它一次转完,但是不知道批量处理命令怎么用

Andy medium avatar
#58 - 2 年前
Andy

@alidetuou 一个命令转255个,命令是:

./bdf2u8g -b 32 -e 255  ../bdf/.bdf font001 font001.c

严格来说不是255个,因为从32开始的,32之前的都是不可读字符,所以转了意义不大。

ytf168 medium avatar
#59 - 2 年前
ytf168

请问一下为什么我是生成的字库是这样的 #include "u8g.h"
const u8g_fntpgm_uint8_t 164[18] U8G_SECTION(".progmem.164") = {
0,0,0,0,0,0,0,0,0,0,27,27,0,0,0,0,
0,255};

Andy medium avatar
#60 - 2 年前
Andy

@ytf168 这应该是空的意思,说明你生成的字体有问题,原因可能是bdf2u8g工具的参数错误,导致在相应bdf文件中没有找到对应的编码导致的。你可以尝试一下其它字找找原因

ytf168 medium avatar
#61 - 2 年前
ytf168

andy,你好很感谢你的回答,我发送的参数是你教材里面的测试参数来的,不知道是什么原因

Andy medium avatar
#62 - 2 年前
Andy

@ytf168 bdf用的哪个文件?选对了吗?

cp2010504400 medium avatar
#63 - 2 年前
cp2010504400

楼主您好,运行的时候出行的是这样的:
C:\Users\DC>bdf2u8g_101.exe -b 27 -e 27 b24.bdf at at.c
encoding range 27..27
input file 'b24.bdf'
u8g font name 'at'
output file 'at.c'
怎么跟你的相比少了一行呢,还有我的生成的字库也是这样的include "u8g.h"
const u8g_fntpgm_uint8_t at[18] U8G_FONT_SECTION("at") = {
0,0,0,0,0,0,0,0,0,0,27,27,0,0,0,0,
0,255};
这是为何?该怎么解决呀?
恳请楼主给予帮助,真诚的谢谢!

Andy medium avatar
#64 - 2 年前
Andy

@cp2010504400 你生成的这个字体数据应该是空的,也就是不会显示任何内容,请确认你的b24.bdf文档中含有编号27的数据。建议多试几个不同的编号。

cp2010504400 medium avatar
#65 - 2 年前
cp2010504400

楼主,我试过好多次了,还是不行。方便透漏一下您的qq吗?我加你,截图给你看下我这边的状况。

小羊 medium avatar
#67 - 2 年前
小羊

@Andy
怎么我生成的和你们的不一样啊!是哪里错了吗?
/*
Fontname:
Copyright:
Capital A Height: 0, '1' Height: 0
Calculated Max Values w= 0 h= 0 x= 0 y= 0 dx= 0 dy= 0 ascent= 0 len= 0
Font Bounding box w= 0 h= 0 x= 0 y= 0
Calculated Min Values x= 0 y= 0 dx= 0 dy= 0
Pure Font ascent = 0 descent= 0
X Font ascent = 0 descent= 0
Max Font ascent = 0 descent= 0
*/
#include "u8g.h"
const u8g_fntpgm_uint8_t chinese_test[18] U8G_FONT_SECTION("chinese_test") = {
0,0,0,0,0,0,0,0,0,0,27,27,0,0,0,0,
0,255};

aaron medium avatar
#68 - 一年前
aaron

請問
室 ‎5BA4生产代码:./bdf2u8g -b 164 -e 164 -l 183 unifont.bdf chinese_shi2 chinese_shi2.c;
-b 164 -e 164 的164如何產生的?

qhdtc medium avatar
#70 - 一年前
qhdtc

@Andy 首先感谢您的教程,我的U8glib库也能显示中文了,在这里有个问题想咨询一下,为什么我转换的Firefly11点阵字体显示不全?比如:“置”文字右下角少几个像素,那一横没有写完的感觉。而且“开”这个字更是有问题,附上代码:
开 -> 0x5F00, 0x5F00/0x80=0xBE(190)
命令行:bdf2u8g -b 0 -e 0 -l 190 fireflyR11.bdf chinese_0_190 chinese_0_190.c
chinese_0_190.c:
{
0,11,11,0,255,0,0,0,0,0,0,0,0,9,0,0,
0,4,9,9,6,0,0,240,144,144,144,144,144,144,144,240
};
其他汉字获得的字体数据是26个字节,而这个“开”字只有15个,不知道什么原因。

Andy medium avatar
#71 - 一年前
Andy

多试几个字,找找规律。“开”显示出来是什么呢?

qhdtc medium avatar
#72 - 一年前
qhdtc

@Andy 显示的更像个瘦了一半的“几”,不到一个汉字的一半,我现在想知道你获取的"开“与我的一样吗?

一思佛 medium avatar
#73 - 一年前
一思佛

@Andy,老师好!
请问这个 ASCII码的起始位和结束位,是什么?

乱世繁华 medium avatar
#74 - 7 个月前
乱世繁华   via Android

为什么直接由一组数据就变成了xa1 xa2 xa3……?