单片机作业1_为OLED制作汉字字库_第1部分

本文探讨了汉字编码的历史,包括ASC-Ⅱ、GB2312、GBK、GB18030,以及点阵编码HZK16。详细解释了汉字在电脑上的存储方式,如如何通过GB2312编码计算HZK16的偏移量,并介绍了在OLED12864显示屏上显示汉字的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

想法:使用 EEPROM 或 Flash 来存储 hzk16 字库,使用 OLED12864 显示汉字。

1 字符集的含义

C语言有种数据类型叫做 “char” 型,这种类型的数据使用 8-bit 二进制数(0~127)来为数字、英文字母、标点符号和常用符号编码,编出来的一个码表叫做 “ASC-Ⅱ”码表,也就是“美国信息交换标准代码”,一共128个字符。
在这里插入图片描述

在这里插入图片描述

上面这个表表,也可以算是一种 “字符集”。所谓的“字符集”,就是对 “英文、汉语、日语等各国语言文字和符号” 以二进制编码表示的“码”的集合。

我国使用的是 GB2312 来对汉字进行编码,后来扩展到了GBK字符集,能表示更多的字符啦!GB2312字符集中有汉字 6763 个,符号 682 个;其中,一级汉字有 3755 个,按拼音升序排列,二级汉字有 3008 个,按偏旁部首排列。
在这里插入图片描述

国际上通用的一个集成世界各国语言的标准叫做“Unicode”,使用**4 bytes(32 bits)**编码,这个标准超级大,超级大,超级大!!!通常情况下,根据你所使用的语言,截取标准 Unicode 里面某一部分来使用即可!那用什么方式,怎么从 Unicode 字符集里面取出需要的字符呢?这就有好多种方式啦,其中有一种是“UTF-8”!
在这里插入图片描述

1.1 定长编码原理

Unicode 的编号肯定超级大,直接用定长的方式取出来,是不是有点浪费空间呢???如果你所用的语言字符编码在 Unicode 字符集中比较低的位置,高位的那些个 0 根本没有用啊!!!
在这里插入图片描述

1.2 UTF-8变长编码原理

每次传送8位,可变字长编码。
在这里插入图片描述

第1个 第2个 第3个 第4个
0x0000 0000 ~ 0x0000 007F 0xxx xxxx
0x0000 0080 ~ 0x0000 07FF 110xxxxx 10xxxxxx
0x0000 0800 ~ 0x0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx
0x0001 0000 ~ 0x0010 FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

在这里插入图片描述

1.3 GB2312

我们汉字那么多,究竟如何编码的呢?
我们使用分区管理,共94个区,每个区94个位,共8836个码位!(想想矩阵键盘,如果按键特别多,可以用矩阵方式排列,用“行列扫描”或者“线反转”方法识别)

分区 说明
01~09 汉字外的 682 字符
10~15 空白区
16~55 3755个常用汉字,按拼音升序排列
56~87 3008个二级汉字,按部首/笔画排列
88~94 空白区

01~09 乱七八糟字符

在这里插入图片描述

16~55 一级汉字

在这里插入图片描述

56~87 一级汉字

在这里插入图片描述

2 汉字在电脑上存储方式

在这里插入图片描述

#include <stdio.h>
int main(int argc, char *argv[]){
   

    printf("0x%x", '侃');
    return 0;
}

在这里插入图片描述

问题:为啥高低位都要+0xA0?
0xA0换算成十进制是160,而ASCⅡ是从0~127,可以兼容ASCⅡ码?是这个原因吗???那为啥不加0x80,非要+0xA0?

3 新型汉字编码

3.1 GBK编码1995

我国的汉字太多了,需要进一步对GB2312字符集进行扩充,因此出现了GBK字符集:

  • ① 高位不再+0xA0
  • ② 空白区都用上!

扩展了将近20000个汉字和符号!

3.2 GB18030编码2000

把“少数民族”的字符也加进来!这个就叫GB18030字符集!

3.3 各种汉字标准历史

国家标准全文公开系统:
http://openstd.samr.gov.cn/bzgk/gb/
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

标准 时间 汉字数量 编码方式 说明
GB2312 1980 6763 双字节
GB12345 1990 6866 双字节
GBK 1995 21,003 双字节 过渡产物,兼容GB2312,已被GB18030替代
BIG5 2003 13,060 双字节 繁体字编码方案,CNS11643中文标准交换码的附录
GB18030 2005 70,244 单字节、双字节、四字节分段 加入各种少数民族的语言

4 点阵编码HZK16

显示屏其实就是一个很大的LED点阵!!!

GB2312 字符集的“点阵字模”数据就是HZK16(16x16点阵)。

GB2312编码如下:注意,索引从 “1” 开始

区号 GB2312编码 说明
01~09 +0xA0 = 0xA1~0xA9 汉字外的 682 字符
10~15 - 空白区
16~55 +0xA0 = 0xB0 ~ 0xD7 3755个常用汉字,按拼音升序排列
56~87 +0xA0 = 0xD8 ~ 0xF7 3008个二级汉字,按部首/笔画排列
88~94 - 空白区

GB2312 每个区 94 个汉字;HZK每个汉字对应 32 个字节数据;

当我们得到一个汉字,比如“我”的GB2312码(0xCED2)

索引从0开始 每区94字
区号 0xCE 0xCE-1 (0xCE-1)*94
位号 0xD2 0xD2-1 (0xD2-1)

4.1 HZK16x16

  • HZK16_16 中的绝对偏移量(1个汉字用 32 bytes):
    o f f s e t = [ ( 0 x C E − 1 ) × 94 + ( 0 x
### 回答1: 51单片机OLED显示汉字的方法有很多种。以下是其中一种简单的方法: 首先,需要准备一个OLED显示屏,并连接到51单片机的相应引脚上。然后,我们可以通过库函数来实现OLED显示汉字。 首先,需要将汉字数据转换为字模数据。可以使用一些在线字模转换工具来将汉字转换为相应的字模数据。将字模数据保存到一个数组中。 然后,在51单片机的代码中,使用OLED显示屏的库函数来逐个写入字模数据。可以使用类似OLED_WriteByte()的函数来逐个写入字模数据。将写入的字模数据按照显示的位置写入相应的位置。 还需要设置字体大小和显示位置,可以使用类似OLED_Set_Pos()和OLED_Set_FontSize()的函数来设置。 最后,通过调用OLED刷新函数,将显示的内容刷新到OLED显示屏上即可。 需要注意的是,不同的OLED显示屏可能有不同的库函数和使用方法,所以上述方法只是一种参考。具体的实现需要根据具体的OLED显示屏和库函数来进行调整。 以上是一种简单的51单片机OLED显示汉字的方法。当然,还可以通过其他更复杂的方法来实现,比如使用汉字点阵库来显示汉字等。 ### 回答2: 51单片机是一种常用的单片机,它具有强大的控制能力和广泛的应用领域。而OLED(Organic Light Emitting Diode)显示屏则是一种新型的显示技术,具有发光、高对比度、快速响应等特点。 要在51单片机上实现OLED显示汉字,首先需要一个支持OLED显示的驱动库,我们可以选择一些开源的库或者自行编写驱动代码。这些驱动库通常提供了一系列的函数,可以方便地控制OLED屏幕的初始化、显示设置和数据写入等操作。 接下来,我们需要将要显示的汉字数据转换为相应的点阵码。每个汉字由多个点阵组成,每个点阵由若干个像素点构成。具体转换方法可以参考一些专门的字库软件,通过输入汉字并选择相应的字体,可以得到每个汉字对应的点阵码。 在程序中,我们可以定义一个数组来存储汉字点阵码。通过调用驱动库中的函数,将点阵码写入OLED屏幕的显示缓存区中,然后再将显示缓存区的内容刷新到实际的屏幕上,即可实现OLED显示汉字的效果。 当然,为了方便操作和显示,我们还可以通过设置字库表,将汉字与其对应的点阵码进行一一映射,这样在程序中只需输入汉字即可自动转换为相应的点阵码,简化了操作。 总的来说,51单片机结合OLED显示屏,通过选择适合的驱动库和转换方法,可以实现汉字的显示。这样,我们可以在各种项目中使用这种技术,给用户提供更直观、更友好的界面体验。 ### 回答3: 51单片机是一种常用于嵌入式系统中的微控制器,它具有低成本、低功耗、易学易用等特点,在很多应用领域都得到了广泛的应用。而OLED(Organic Light-Emitting Diode)则是一种新型的显示技术,具有发光亮度高、色彩饱和度好等优势。 要在51单片机上实现OLED显示汉字,主要需要以下步骤: 1.准备相应的硬件设备:51单片机主板、OLED显示屏、连接线等。 2.编写相关的软件程序:利用51单片机的开发环境(如Keil C等),编写程序实现汉字的显示。需要涉及到汉字的点阵库、字库文件的定义,在程序中进行调用和实现。 3.利用相关的库函数:通过编写代码调用相关的库函数,实现汉字的显示。可以利用51单片机相关的库函数或者第三方的库函数,在程序中进行调用和使用。 4.进行OLED显示屏的初始化:提前进行OLED显示屏的初始化设置,包括屏幕的尺寸、亮度、显示位置等参数。 5.编写显示程序:根据需求编写相应的显示程序,将需要显示的汉字传输到OLED显示屏上。 通过以上步骤的实施,就可以在51单片机上实现OLED显示汉字。需要注意的是,考虑到51单片机的存储容量限制,能够显示的汉字数量可能会受到一定的限制,需要根据具体的要求和需求进行合理的选择和设计。 希望以上回答对您有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值