摘要: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

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

嵌入式的汉字原来是这样显示的?相关推荐

  1. Java Web项目中HTML文件中的汉字在浏览器中显示乱码的解决方案

    今天在做一个Java Web项目的时候,html中的汉字在浏览器中显示为乱码,分析其可能原因有: (1)html文件属性中有默认的编码方式,如果它的设置与html文档中content charset属 ...

  2. 【嵌入式系统开发16】基于OLED屏显和汉字点阵编码原理显示姓名学号,湿度温度,滚动长字符

    要求 理解OLED屏显和汉字点阵编码原理,使用STM32F103的SPI或IIC接口实现以下功能: 显示自己的学号和姓名: 显示AHT20的温度和湿度: 上下或左右的滑动显示长字符,比如"H ...

  3. 液晶显示器汉字字模存储及显示

    一.3 种汉字字模存储和提取的方法 1.字模存放在程序存储器中; 这种方法较为常用,针对程序不大或单片机无外部扩展数据存储区功能的情况. 2.通过外扩的EEPROM 存储汉字字模数据,将其作为外部数据 ...

  4. 嵌入式Linux下Qt的中文显示

    一般情况下,嵌入式Qt界面需要中文显示,下面总结自己在项目中用到的可行的办法 1,下载一种中文简体字体,比如我用的是"方正准圆简体",把字体文件放在ARM开发板系统的Qt字库中,即 ...

  5. 【正点原子I.MX6U-MINI应用篇】6、嵌入式Linux在LCD屏幕上显示字符

    一.原始方式: 取模显示字符 LCD显示屏是由width * height个像素点构成的,显示字符,一个非常容易想到的方法便是对字符取模,然后在LCD屏上打点显示字符:如果大家以前学习过单片机,想必接 ...

  6. 嵌入式产品如何支持阿拉伯文显示---看这一篇就够了

    在国际化大潮流之下,很多嵌入式系统产品,需要支持阿拉伯语言,可很多人却为之烦恼,我遇到了同样的烦恼,因此在网上搜索了很多关于阿拉伯字库及阿拉伯语言显示的资料,经过实战,整理了这篇文章.资料. 阿拉伯语 ...

  7. emwin 使用外部字库_emWin – 汉字字库生成及显示 | 学步园

    使用了emWin之后,除了画图形或bmp之外,另外一个大头就是显示字符了.字符包括ASCII码,当然最重要的就是汉字显示了. 这里就介绍如何生成自定义的汉字字库,以及如何显示在TFT屏幕上. 硬件准备 ...

  8. emWin - 汉字字库生成及显示

    使用了emWin之后,除了画图形或bmp之外,另外一个大头就是显示字符了.字符包括ASCII码,当然最重要的就是汉字显示了. 这里就介绍如何生成自定义的汉字字库,以及如何显示在TFT屏幕上. 硬件准备 ...

  9. C# 汉字字符取模韩语日语意大利语俄语法语西班牙兼并葡萄牙等 任意语言 任意大小 任意字体 任意排列 字符汉字取模及显示编码unicode

    视频演示:https://www.bilibili.com/video/BV1N54y117is/ 软件下载 功能:支持汉字.字符.韩语.日语.意大利语.俄语等任意语言,任意大小,任意字体,任意排列方 ...

最新文章

  1. Use MVS Dsbame convensions. windows下ftp.exe客户端上传错误
  2. Windows Phone 8初学者开发—第22部分:用演示图板创建卷盘的动画
  3. ISP线路类型【整理】
  4. jQuery,Ashx发送站内信
  5. php访问mysql工具类
  6. 千鸟弹幕机器人_千鸟熊猫TV直播弹幕机器人软件
  7. 将Amazon Cognito与单页面应用程序(Vue.js)集成
  8. 《H5 移动营销设计指南》 读书笔记整理
  9. RedisCacheManager设置Value序列化器技巧
  10. ❤️基于Java的方式配置Spring
  11. vb还是python强大-vb和python哪个速度快
  12. 嵌入式c语言 c语言_C和嵌入式C有什么区别?
  13. word/excel 通配符
  14. HTML5中如何实现rpx布局
  15. 玩转python(一)——微信远程控制电脑
  16. 全国三级地区(省市县)数据表设计
  17. Java-UDP通信(实现多发多收、广播、组播)
  18. 关于声纹识别数据集VoxCeleb2下载问题--
  19. 用JS写右下角烦人的弹窗小广告
  20. 浪潮云存储服务器及操作系统认识,浪潮云海OS操作系统

热门文章

  1. CAD中样条曲线Spline怎样才能分解成多段弧arc?
  2. Python电影观众数量回归分析 随机森林 可视化 实验报告
  3. C/C++实现http下载文件
  4. opencv 识别长方形_opencv识别正方形(矩形)代码(转)
  5. 设计一个抽象类图形类,在该类中包含有至少两个抽象方法求周长和求面积,分别定义圆形类、长方形类、正方形类、三角形类来继承图形类,并实现上述两个方法
  6. 使用MD5进行加密解密【代码实现】
  7. 我喜欢的一篇关于家庭教育的文章
  8. javase printwriter 打印流
  9. MapReduce明星搜索指数统计,找出人气王
  10. 大规模MIMO的信道互易性,信道信息反馈