嵌入式的汉字原来是这样显示的?

摘要:LCD是嵌入式常见设备,如何在LCD上显示汉字和英文?矢量字体和点阵字体有何不同?同一个字符为何有多种编码?GB2312、GB18030指什么?他们之间有关系吗?嵌入式设备如何支持多国语言?从哪里获取字库?需要付费吗?以上问题,本文一一道来!

一、如何在LCD上显示字符

在LCD上如何显示字符呢?这里我们讨论的是逻辑问题,不是LCD控制器驱动。

首先,我们要对LCD有一个概念:LCD也就是一个点一个点组成的一片点而已。本质上和1个LED一样。

1个单色LED,能显示亮灭。

将很对LED排成一行,就可以实现流水灯

将多行LED组成一片,是啥?是LED点阵

多块点阵,就能组成图文屏

如果是三色LED组成的图文屏,就能显示视频动画

无论是COG LCDOLED LCD,还是TFT LCD,实际上都是一个点一个点组成的矩阵,和LED组成的图文屏一样。

当然,制造工艺不一样,控制显示内容技术也不一样,我们不讨论制造技术,控制技术后续会有单独课程讨论。

显然,要在图文屏上显示字符,只需将对应的LED点点亮。不同的字符应该点亮那些LED呢?

我们先逆向想,下图LED点阵上显示的汉字,如何将位置信息保存到代码中,以便下次使用?

这是一个16x16的LED点阵。

每个LED的状态仅仅是亮或灭,那么就可以使用1个bit表示其状态,1表示亮,0表示灭。

1个byte,8个bit,两个byte就可以表示一行LED的状态。

上图这个德字第一行就可以这样表示:0001 0000 0100 0000;也就是0x10,0x40;

按照此方法取得“德”字得完整显示信息:

  • 0001 0000 0100 0000 0x10 0x40

  • 0001 0000 0100 0000 0x10 0x40

  • 0010 1111 1111 1110 0x2F 0xFE

  • 0100 0000 0100 0000 0x40 0x40

  • 1001 0111 1111 1100 0x97 0xFC

  • 0001 0100 1010 0100 0x14 0xA4

  • 0010 0100 1010 0100 0x24 0xA4

  • 0110 0111 1111 1100 0x67 0xFC

  • 1010 0000 0000 0000 0xA0 0x00

  • 0010 1111 1111 1110 0x2F 0xFE

  • 0010 0000 0100 0000 0x20 0x40

  • 0010 0000 0010 0100 0x20 0x24

  • 0010 0101 0010 0010 0x25 0x22

  • 0010 0101 0000 1010 0x25 0x05

  • 0010 1001 0000 1000 0x29 0x08

  • 0010 0000 1111 1000 0x20 0xF8

用1个数组保存,如下:

de_dot[32]={
0x10, 0x40, 0x10, 0x40,0x2f, 0xfe, 0x40, 0x40,
0x97, 0xfc, 0x14, 0xa4,0x24, 0xa4,0x67, 0xfc,
0xa0, 0x00,0x2f, 0xfe,0x20, 0x40,0x20, 0x24,
0x25, 0x22, 0x25, 0x05, 0x29, 0x08, 0x20, 0xf8};

得到了这个数组,在代码中按照取模的方式将其还原到LED点阵上,就能显示德字。

玩过8段数码管的朋友应该很熟悉,为了在数码管上显示数字,我们会在代码中定义0~9数字的显示掩码(数码管每个段亮灭的信息)。 点阵上显示汉字,无非就是LED更多了。

因此,要在LCD上显示字符,需要先知道如何描绘字符的信息,按照取模方式,将这写信息还原到LCD上,就能描绘出字符。

二、点阵字库

那什么是点阵字库呢?

上面说的“”字的描绘信息数组就是点阵字库。

这个德字描绘出的效果,就是点阵字体。描绘信息保存的形式,就是点阵字库

点阵字库有多种形式:

  • 1、直接将信息用数组保存到代码中。(显示的内容较少时通常会这样做)

  • 2、将点阵信息描绘到一张bmp图片,使用时根据信息文件(FNT)从图片中取信息。(很多游戏使用的就是这种贴图字体,也叫bmpfont)

  • 3、将一堆点阵信息数组打包为1个bin文件,使用算法定位字符位置。(点阵较多,按照编码规范整合在一起)

  • 4、按照电脑字体规范整合的字体。(比如windows的ttf字体,bdf字体)

三、取模方式

取模方式指的是单个bit位置信息组合成字节时使用的方式。

前面我们对德字取位置信息时:使用横向取模,并且高位在前。此外还有很多不同的取模方式,常见的方式如下:

尺寸

汉字通常有这些尺寸:12x12,16x16,24x24。在cog屏128*64像素的屏上,一般用12x12的汉字点阵,可以显示5行。

ASCII码的点阵通常和汉字高度一样,宽度是一半,比如,12x12的汉字配12x6的ASCII码,16x16的汉字配16x8的ASCII码。

四、矢量字体

矢量字体:矢量字体(Vector font)中每一个字形是通过数学曲线来描述的,它包含了字形边界上的关键点,连线的导数信息等,字体的渲染引擎通过读取这些数学矢量,然后进行一定的数学运算来进行渲染。这类字体的优点是字体实际尺寸可以任意缩放而不变形、变色。矢量字体主要包括 Type1 、 TrueType、OpenType等几类。

Freetype:FreeType库是一个完全免费(开源)的、高质量的且可移植的字体引擎,它提供统一的接口来访问多种字体格式文件,包括TrueType, OpenType, Type1, CID, CFF, Windows FON/FNT, X11 PCF等。

  • 矢量字体使用Freetype进行渲染后,最后得到的也是bitmap,毕竟,LCD就是一个一个点组成的。

  • 理论上矢量字体可以无限放大而不失真。

  • 但是,矢量字体渲染为较小字号的字,某些字(笔画多)可能失真非常严重。

五、字符编码

字符编码是指一种映射规则,根据这个映射规则可以将某个字符映射成其他形式的数据以便在计算机中存储和传输。

ASCII码

ASCII ((American Standard Code for Information Interchange): 美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是最通用的信息交换标准,并等同于国际标准ISO/IEC 646。ASCII第一次以规范标准的类型发表是在1967年,最后一次更新则是在1986年,到目前为止共定义了128个字符 。

Codepage

欧美很多国家的语言在ASCII码中没有定义,各个国家(或组织)就使用1个字节剩下的127个值映射他们需要的字符。

国家很多,定义很多,如何决定使用哪种映射呢?

IBM、微软等系统就增加了CodePage的概念:每种映射分配一个编号。这些系统的代码页编号是不完全一样的。IBM定义的代码叫做OEM,微软定义的代码叫ANSI。

六、汉字编码

汉字字符数量很多,仅仅使用高位127个值不能表示

因此国家标准组织定义了《信息交换用汉字编码字符集》。有三个版本:

GB2312编码:1981年5月1日发布的简体中文汉字编码国家标准。GB2312对汉字采用双字节编码,收录7445个图形字符,其中包括6763个汉字。

GBK编码:1995年12月发布的汉字编码国家标准,是对GB2312编码的扩充,对汉字采用双字节编码。GBK字符集共收录21003个汉字,包含国家标准GB13000-1中的全部中日韩汉字,和BIG5编码中的所有汉字。

GB18030编码:2000年3月17日发布的汉字编码国家标准,是对GBK编码的扩充,覆盖中文、日文、朝鲜语和中国少数民族文字,其中收录27484个汉字。GB18030字符集采用单字节、双字节和四字节三种方式对字符编码。兼容GBK和GB2312字符集。

汉字编码使用分区概念,如下面分区,其中的双字节二区就是符合GB2312标准的双字节区。

双字节部分编码空间结构图

七、如何获得字库

在介绍如何获得字库之前,先说明版权问题

  • 版权说的是字体,也就是一个字符描绘出来的效果。一个字体的形成方式通常是矢量字体或者点阵字库。

  • 使用工具将一种字体的矢量字库转换为点阵字库,他们仍然是同一种字体,那么版权是一样的,依然属于矢量字体拥有者。

获取矢量字体

在你的电脑中就有很多字体。windows下的C:\Windows\Fonts下保存有你电脑安装的字体,这种字体通常是ttf标准。

这些字体一般都不是开源的,也就是不能免费商用到嵌入式设备上。开源的字体有:思源字体,可以免费商用。

八、获取点阵字体

我们更关心的是如何获取点阵字体。

前面说过,点阵字体有很多存在方式,那么我们就有很多获取方式。

  1. 从很早之前的电脑汉卡上获取点阵字库。这种方式比较难找,在github上可以找到一些外文的点阵字库,汉字的没找到。

  2. 从DOS系统获取汉字点阵这种点阵我用过的有HZ1616,HZ1212。这种字体的版权不是很清楚属于谁。不过这种字库因为很早,所以基本都是GB2312规范的,不包含生僻字。

  3. 从电脑字体中找点阵字体电脑字体常见的是TTF规范,这个规范比代表它只有矢量字体,很多电脑字体中会包含矢量字体和点阵字体。点阵字体一般是小号字。小号字用矢量字体渲染,效果不好,所有某种字体通常会带小号的点阵字体。

  4. 取模工具取点阵信息 如果使用的字符很少,可以用《zimo3》等工具取模。

  5. 点阵生成工具批量生成 比如易木雨软件工作室做的《字库制作软件.rar》,可以批量将矢量字库转为点阵字库。

  6. 开源模块中找外文点阵 比如tslib触摸库中就含有英文点阵

  7. 。有一个叫高通的公司,卖点阵字库芯片。有一个较北京中易的公司,有一套很好的点阵字库。这套点阵字库由于性能好,流传广,工作经验丰富的工程师一般都接触过;不过大部分公司可能都没有获得授权。还有其他很多做字体的公司也有点阵字库,比如方正。

  8. 自己用编辑工具一个一个画,然后用你的脑子将其转为数组。

来源 | 屋脊雀 http://www.wujique.com/

本文来源网络,版权归原作者所有。如涉及作品版权问题,请联系我进行删除。

End


推荐阅读:

专辑|Linux文章汇总

专辑|程序人生

专辑|C语言

我的知识小密圈

关注公众号,后台回复「1024」获取学习资料网盘链接。

欢迎点赞,关注,转发,在看,您的每一次鼓励,我都将铭记于心~

嵌入式Linux

微信扫描二维码,关注我的公众号

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/465341.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

查看数据库、表、索引的物理存储情况

在管理、维护数据库时,经常需要查看数据库文件、日志文件所占用的磁盘空间,以及磁盘还剩下的磁盘空间,你可以通过下面几种方面查看数据库文件详细情况:1: 是通过远程连接(或VPN)连接到数据库服务器,直接去查…

Spring简化Java开发_spring如何简化java开发

1、spring简介Spring的主要目的是用来替代更加重量级的企业级的java技术2、spring如何简化java开发1)基于POJO的轻量级和最小侵入性编程;2)通过依赖注入和面向接口实现松耦合;3)基于切面和惯例进行声明式编程;4)通过切面和模板减少样版式代码…

Linux 应用调试神器- ASan

今天有小伙伴跟我他的程序崩溃了要怎么办,刚好我最近做项目使用到这个神器,做应用开发的同学可以看看,可以在C/C上配置使用。不过这仅限于调试,如果你是发布版本,一定要把这个功能关闭。当然,这是我实操的结…

asp.net验证提示美化效果

前段时间做了个ymPrompt提示效果的验证控件,ymPrompt是弹出提示的。弹出提示会增加无畏的鼠标点击动作。前段时间看到园里有位高手写了个纯cssjs的一个效果,我把它和asp.net验证控件结合起来,用这位高手写的效果做为asp.net难控件的提示效果。…

java全栈工程师要求_Java全栈工程师

分布式日志解决方案(ELKKafka)微信登录解决方案微信支付解决方案支付宝支付解决方案微服务持续集成解决方案(Jenkins)Spring Cloud全家桶搭建解决方案分布式事务解解决方案分布式锁解决方案(Redis)微服务网关解决方案(一代Zuul\二代Gateway)微服务集中配置服务解决方案(Config)…

在Linux内核使用Kasan

昨天的文章发出来后,有同学在群里说内核也可以使用这个工具,所以再转发一篇wowo网站的文章,希望对大家有帮助。Linux 应用调试神器- ASan1. 前言KASAN是一个动态检测内存错误的工具。KASAN可以检测全局变量、栈、堆分配的内存发生越界访问等问…

网线有问题?

昨晚网络卡死了。今天换了一条网线。掉包率下降不少。。转载于:https://blog.51cto.com/onlyjoking/398046

跟韦老师聊了一个深夜

自从尚明从韦老师那边离职后,我已经很难得到韦老师的消息了,有时候我也想过去看下他,但是也很难抽的开时间。而且,我们两都挺技术的,如果见面后不知道聊什么,会不会有点尴尬。😄上面那个回复是我…

java面向过程编程怎么写_从面向过程到面向对象,我的编程之路

也许现在新一代的程序员一开始涉足的就是c,C#,Java这类面向对象的语言,如果这样,这篇文章可能得不到他们的认同。 这里,我只想写写我从面向过程到面向对象开发成长中的一些感想而已。我最初学习的语言是basic&#xff…

c#xml操作方法

using System.Xml; //初始化一个xml实例XmlDocument xmlnew XmlDocument();//导入指定xml文件xml.Load(path);xml.Load(HttpContext.Current.Server.MapPath("~/file/bookstore.xml"));//指定一个节点XmlNode rootxml.SelectSingleNode("/root");//获取节点…

急救WINDOWS内存错误

该内存不能为read或written的解决方案 使用Windows操作系统的人有时会遇到这样的错误信息:「“0X????????”指令引用的“0x00000000”内存,该内存不能为“read”或“written”」,然后应用程序被关闭。如果去请教一些「高手」&#xf…

大厂不是铁饭碗

最近的事情有点多前段时间一个以前的朋友,买房找我咨询,问我恒大的房子能不能买,我当时没有给出明确的回复,但是也说了自己的看法。近些年房子越来越贵,我是从15年开始接触房子,不过我从没有想过靠房子来赚…

java 判断数字二进制有几位_判断一个二进制数字有多少个1----java实现

这个题目会有多个解法:需要判断n的二进制有几个1first:通过n向右移位&1,如果n的最后为1,那么与1结果为1,(相信大家都会与运算,hashmap就是用与运算)以此来实现,循环判断有多少个1&#xff0…

cesss

件(最大上传3个附件,每个件(最大上传3个附件,每个件(最大上传3个附件,每个件(最大上传3个附件,每个转载于:https://blog.51cto.com/wuxh868/402629

python知识点1

1.if __name__ main 的作用 在此函数下的代码,只有当该文件运行的时候才能运行。当前文件如果被当做模块被其他文件导入,该函数下的代码就不会被执行。2.__init__方法在类被实例化之前,先使用__init__方法进行一些初始化操作,如…

java语句中switch_Java中的switch-case语句

在codewar里使用了以下switch-case语句,不熟练出错,所以记录一下。class ArithmeticFunction {public static int arithmetic(int a, int b, String operator) {int result0;switch(operator){case "add":resultab;case "subtract":…

使用valgrind检测内存问题

valgrind是一款用于内存调试、内存泄漏检测以及性能分析的软件开发工具。1valgrind安装可以到官网下载最新的源码包:valgrind官网下载,也可以直接使用 c_utils/debug/valgrind 目录提供的 valgrind-3.13.0.tar.bz2 源码包。首先解压源码包tar xjf valgri…

[转]一个人脸检测器

//本文使用到Emgu.CV库,该库是C#语言对OpenCV的封装,以下是一个列子程序的改正版本。using System; using System.Collections.Generic; using System.Text; using Emgu.CV.Structure; using Emgu.CV;namespace VSL.Plugin.TrackingSystem.SimpleTrackin…

项目中cxf和weblogic整合时报错的问题

GJYW项目使用的weblogic版本是10.3.6,cxf使用的版本是3.1.4 在将项目部署到weblogic服务器上时就会报错,通过下面的方式可以解决weblogic和cxf框架在一起报错的问题(解决了本项目报错的问题,未必全部适用):…

下周开幕!给深圳的嵌入式和电子工程师准备的嘉年华来了

我和电子圈老江认识了很久,应该是2012年,小龙第一次参加电子圈年会,那年他年会中奖的奖品送给我。后来,我也加入了电子圈的QQ群,早些年的时候,大家都喜欢在QQ群聊天,后来才慢慢转到微信群。老江…