一种低功耗的便携式人机界面系统
接口,可以很方便与SST25VF080B连接通信。所以我们采用SPI Flash来完成对汉字字库的存储,字库存储部分的硬件电路接口图如图3所示。
![](../img/eep/emb/emb-15425yj2a1xnzjot.jpg)
3 系统软件设计
系统软件包括字库的调用和TFT液晶显示软件设计两个部分,字库调用主要是通过STM32F103RBT6的SPI接口调用存储在SST25VF080B中的中文字库。TFT液晶显示部分主要是通过STM32F103RBT6通用I/O口模拟16位的8080并口,实现对液晶显示器的驱动,在软件设计的过程中需要注意一个问题。就是不同字库编码的标准时不一样的,所以在解码时略有不同,常用的汉字字库有GB2312字库和GBK字库两种。
3.1 GB2312字库和GBK字库
GB2312收录简化汉字及符号、字母、日文假名等共7 445个图形字符,其中汉字占6 763个。GB2312规定“对任意一个图形字符都采用两个字节表示,每个字节均采用七位编码表示”,习惯上称第一个字节为“高字节”,第二个字节为“低字节”。GB2312—80包含了大部分常用的一、二级汉字,和9区的符号。该字符集是几乎所有的中文系统和国际化的软件都支持的中文字符集,这也是最基本的中文字符集。其编码范围是高位0xa1~0xfe,低位也是0xa1~0xfe;汉字从0xb0a1开始,结束于0xf7fe。GB2312将代码表分为94个区,对应第一字节(0xa1~0xfe);每个区94个位(0xa1~0xfe),对应第二字节,两个字节的值分别为区号值和位号值加32(20H),因此也称为区位码。01~09区为符号、数字区,16~87区为汉字区(0xb0~0xf7),10~15区、88~94区是有待进一步标准化的空白区。GB2312将收录的汉字分成两级:第一级是常用汉字计3755个,置于16~55区,按汉语拼音字母/笔形顺序排列:第二级汉字是次常用汉字计3 008个,置于56~87区,按部首/笔画顺序排列。故而GB2312最多能表示6763个汉字。
而GBK内码完全兼容GB2312,同时支持繁体字,总汉字数有2万多个,编码格式如下,每个GBK码由2个字节组成,第一个字节为0X81~0XFE,第二个字节分为两部分,一是0X40~0X7E,二是0X80~0XFE。其中与GB2312相同的区域,字完全相同。把第一个字节代表的意义称为区,那么GBK里面总共有126个区(0XFE~0X81+1),每个区内有190个汉字(0XFE~0X80+0X7E~0X40+2),总共就有126x190=23 940个汉字。点阵库只要按照这个编码规则从0X8140开始,逐一建立,每个区的点阵大小为每个汉字所用的字节数乘以190。这样,就可以得到在这个字库里面定位汉字的方法:
当GBKL0X7F时:Hp=((GBKH-0x81)×190+GBKL-0X40)×(sizex2);
当GBKL>0X80时:Hp=((GBKH-0x81)×190+GBKL-0X41)×(sizex2);
其中GBKH、GBKLL分别代表GBK的第一个字节和第二个字节(也就是高位和低位),size代表汉字字体的大小(比如16字体,12字体等),Hp则为对应汉字点阵数据在字库里面的起始地址。3.2 系统软件流程
对于GBK字库和GB2312字库,他们的解码部分部分略有不同,这个区别主要是由于他们的编码方式不同引起的,对于GBK字库,解码的方式如下:
![](../img/eep/emb/emb-15426nym2tjknz00.jpg)
其中qh、ql分别代表GBK的第一个字节和第二个字节(也就是高位和低位),size代表汉字字体的大小(比如16字体,12字体等),foffset则为对应汉字点阵数据在字库里面的起始地址。
系统启动以后,首先完成时钟的初始化,采用外部8 MHz的晶振作为输入时钟,内部锁相环将时钟倍频到72 MHz作为系统时钟,完成GPIO的初始化,作为LCD驱动IO的通用IO口的时钟设置为50 MHz的推挽模式,接着完成硬件SPI1的初始化,SPI时钟频率设置为18 MHz,接着完成液晶的初始化,此过程是通过发送特定的命令序列来实现的,然后刷新显示背景颜色,设置字体颜色,通过上面的程序完成字库中汉字点阵序列的查询,将汉字点阵送液晶屏显示。
系统软件设计的流程图如图4所示。
![](../img/eep/emb/emb-15427rnqdlm3fisy.jpg)
采用方法还不但可以实现标准字体的显示,还可以根据系统要求,采用专用软件生成各种需要的字体,为设计多样性的人机界面系统提供了一种可行的方案。
4 结论
采用SPI Flash来存储汉字字库,通过彩色TFT液晶屏显示,有效地扩展了应用的范围,经过实验验证,本系统的设计方法完全达到设计要求。
- Linux嵌入式系统开发平台选型探讨(11-09)
- VxWorks实时操作系统下MPC8260ATM驱动的实现(11-11)
- VXWORKS内核分析(11-11)
- Linux内核解读入门(11-09)
- linux文件系统基础(02-09)
- 基于Winodws CE的嵌入式网络监控系统的设计与实现(03-05)