c语言点阵汉字放大缩小_正点原子【STM32-F407探索者】第四十五章 汉字显示实验...

本文介绍了如何在STM32F4单片机上使用外部FLASH和SD卡存储汉字点阵库,实现汉字显示。首先讲解汉字显示原理,包括汉字内码系统和点阵数据解析。然后详细描述了硬件设计,包括字库制作、外部FLASH和SD卡的使用。接着,重点讲述了软件设计,包括字库更新和显示函数的实现。最后,提供了下载验证的过程,展示如何在开发板上实现汉字显示并更新字库。
摘要由CSDN通过智能技术生成

1)资料下载:点击资料即可下载

2)对正点原子Linux感兴趣的同学可以加群讨论:935446741

3)关注正点原子公众号,获取最新资料更新

63ba47a70dce353bdee668082b6f5b51.png

汉字显示在很多单片机系统都需要用到,少则几个字,多则整个汉字库的支持,更有甚者 还要支持多国字库,那就更麻烦了。本章,我们将向大家介绍,如何用 STM32F4 控制 LCD 显 示汉字。在本章中,我们将使用外部 FLASH 来存储字库,并可以通过 SD 卡更新字库。STM32F4 读取存在 FLASH 里面的字库,然后将汉字显示在 LCD 上面。本章分为如下几个部分:

45.1 汉字显示原理简介

45.2 硬件设计

45.3 软件设计

45.4 下载验证

45.1 汉字显示原理简介

常用的汉字内码系统有 GB2312,GB13000,GBK,BIG5(繁体)等几种,其中 GB2312

支持的汉字仅有几千个,很多时候不够用,而 GBK 内码不仅完全兼容 GB2312,还支持了繁体

字,总汉字数有 2 万多个,完全能满足我们一般应用的要求。

本实例我们将制作三个 GBK 字库,制作好的字库放在 SD 卡里面,然后通过 SD 卡,将字

库文件复制到外部 FLASH 芯片 W25Q128 里,这样,W25Q128 就相当于一个汉字字库芯片了。

汉字在液晶上的显示原理与前面显示字符的是一样的。汉字在液晶上的显示其实就是一些

点的显示与不显示,这就相当于我们的笔一样,有笔经过的地方就画出来,没经过的地方就不

画。所以要显示汉字,我们首先要知道汉字的点阵数据,这些数据可以由专门的软件来生成。

只要知道了一个汉字点阵的生成方法,那么我们在程序里面就可以把这个点阵数据解析成一个

汉字。

知道显示了一个汉字,就可以推及整个汉字库了。汉字在各种文件里面的存储不是以点阵

数据的形式存储的(否则那占用的空间就太大了),而是以内码的形式存储的,就是

GB2312/GBK/BIG5 等这几种的一种,每个汉字对应着一个内码,在知道了内码之后再去字库

里面查找这个汉字的点阵数据,然后在液晶上显示出来。这个过程我们是看不到,但是计算机

是要去执行的。

单片机要显示汉字也与此类似:汉字内码(GBK/GB2312)→查找点阵库→解析→显示。

所以只要我们有了整个汉字库的点阵,就可以把电脑上的文本信息在单片机上显示出来了。

这里我们要解决的最大问题就是制作一个与汉字内码对得上号的汉字点阵库。而且要方便单片

机的查找。每个 GBK 码由 2 个字节组成,第一个字节为 0X81~0XFE,第二个字节分为两部分,

一是 0X40~0X7E,二是 0X80~0XFE。其中与 GB2312 相同的区域,字完全相同。

我们把第一个字节代表的意义称为区,那么 GBK 里面总共有 126 个区(0XFE-0X81+1),

每个区内有 190 个汉字(0XFE-0X80+0X7E-0X40+2),总共就有 126*190=23940 个汉字。我

们的点阵库只要按照这个编码规则从 0X8140 开始,逐一建立,每个区的点阵大小为每个汉字

所用的字节数*190。这样,我们就可以得到在这个字库里面定位汉字的方法:

当 GBKL<0X7F 时:Hp=((GBKH-0x81)*190+GBKL-0X40)*(size*2);

当 GBKL>0X80 时:Hp=((GBKH-0x81)*190+GBKL-0X41)*(size*2);

其中 GBKH、GBKL 分别代表 GBK 的第一个字节和第二个字节(也就是高位和低位),size

代表汉字字体的大小(比如 16 字体,12 字体等),Hp 则为对应汉字点阵数据在字库里面的起 始地址(假设是从 0 开始存放)。

这样我们只要得到了汉字的 GBK 码,就可以显示这个汉字了。从而实现汉字在液晶上的显示。

上一章,我们提到要用 cc936.c,以支持长文件名,但是 cc936.c 文件里面的两个数组太大

了(172KB),直接刷在单片机里面,太占用 flash 了,所以我们必须把这两个数组存放在外部

flash。cc936 里面包含的两个数组 oem2uni 和 uni2oem 存放 unicode 和 gbk 的互相转换对照表,

这两个数组很大,这里我们利用 ALIENTEK 提供的一个 C 语言数组转 BIN(二进制)的软件:

C2B 转换助手 V1.1.exe,将这两个数组转为 BIN 文件,我们将这两个数组拷贝出来存放为一个

新的文本文件,假设为 UNIGBK.TXT,然后用 C2B 转换助手打开这个文本文件,如图 45.1.1

所示:

2dab58a59afa384a9a5308283fb8f099.png
图 45.1.1 C2B 转换助手

然后点击转换,就可以在当前目录下(文本文件所在目录下)得到一个 UNIGBK.bin 的文

件。这样就完成将 C 语言数组转换为.bin 文件,然后只需要将 UNIGBK.bin 保存到外部 FLASH 就实现了该数组的转移。

在 cc936.c 里面,主要是通过 ff_convert 调用这两个数组,实现 UNICODE 和 GBK 的互转, 该函数原代码如下:

WCHAR ff_convert ( /* Converted code, 0 means conversion error */

WCHAR src, /* Character code to be converted */

UINT

dir

/* 0: Unicode to OEMCP, 1: OEMCP to Unicode */

)

{

const WCHAR *p;

WCHAR c;

int i, n, li, hi;

if (src < 0x80) {

/* ASCII */

c = src;

} else {

if (dir) {

/* OEMCP to unicode */

p = oem2uni;

hi = sizeof(oem2uni) / 4 - 1;

} else {

/* Unicode to OEMCP */

p = uni2oem;

hi = sizeof(uni2oem) / 4 - 1;

}

li = 0;

for (n = 16; n; n--) {

i = li + (hi - li) / 2;

if (src == p[i * 2]) break;

if (src > p[i * 2]) li = i;

else hi = i;

}

c = n ? p[i * 2 + 1] : 0;

}

return c;

}

此段代码,通过二分法(16 阶)在数组里面查找 UNICODE(或 GBK)码对应的 GBK(或

UNICODE)码。当我们将数组存放在外部 flash 的时候,将该函数修改为:

WCHAR ff_convert ( /* Converted code, 0 means conversion error */

WCHAR src,

/* Character code to be converted */

UINT

dir

/* 0: Unicode to OEMCP, 1: OEMCP

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值