嵌入式系统汉字输入
- 格式:doc
- 大小:63.00 KB
- 文档页数:10
第17期2023年9月无线互联科技Wireless Internet TechnologyNo.17September,2023作者简介:张晓明(1985 ),男,陕西礼泉人,高级工程师,本科;研究方向:航空电子技术㊂嵌入式系统下的矢量汉字显示技术张晓明(中航西安飞机工业集团股份有限公司,陕西西安710089)摘要:嵌入式系统下的汉字显示一直是软件开发的难点,由于一般只支持点阵汉字,并支持矢量汉字,已经不能满足综合模块化航电架构下大屏显示和触摸控制的要求㊂文章通过分析基于贝塞尔曲线显示矢量汉字的原理,综合比较选择插值补偿系数,结合具体实例进行了测试验证㊂结果表明,采用该方法能够实现包括宋体㊁黑体等各种字体和字号的高质量显示,对汉字旋转㊁缩放变换后显示效果不失真,满足了大屏触控模式下对汉字缩放的显示要求㊂关键词:嵌入式系统;点阵汉字;矢量汉字;贝塞尔曲线;汉字轮廓中图分类号:TP311.5㊀㊀文献标志码:A 0㊀引言㊀㊀嵌入式系统由于资源有限,大多只支持点阵汉字,不支持矢量汉字[1]㊂点阵字库采用.c 文件方式储存信息,每个字信息都包含在一个数据结构中,其中包含了字体的所有点信息,字体显示时根据宽高将点信息直接送入显存显示㊂这种方式的字体实现简单㊁显示速度快㊂随着综合模块化航电(Integrated Modular Av -ionics,IMA)架构的发展[2],大屏显示和触摸控制已成为主流,不仅要求画面中汉字能清晰显示,更提出了自由旋转和缩放的新要求㊂目前,传统的基于点阵汉字的实现方法存在一些局限性,点阵汉字每种字体和字号均需对应的字库文件,如显示宋体(16ˑ16㊁24ˑ24㊁32ˑ32)㊁黑体(16ˑ16㊁24ˑ24㊁32ˑ32)就需要6个不同的字库文件,维护管理十分麻烦;点阵汉字显示画面进行旋转和缩放变换时,汉字产生模糊失真,效果不佳㊂为适应大屏触摸控制下对汉字的显示要求,本文摒弃了传统的基于点阵的汉字显示方式,提出一种基于贝塞尔曲线的矢量汉字显示方法㊂1㊀贝塞尔曲线显示汉字原理1.1㊀获取汉字轮廓㊀㊀矢量字体中的每一个字形是通过数学曲线来描述的,它包含了字形边界上的关键点,连续的导数信息等,矢量字体主要包括Type1㊁TrueType㊁OpenType 和CFF 等格式,采用几何学中的二次/三次贝塞尔样条曲线及直线来描述字体的外形轮廓㊂由于每个字符的轮廓信息是根据字形索引来存放的,而字形索引又通过字符的Unicode 编码来获取,所以首先需要先设置字符的编码格式,假如某些嵌入式系统的默认的字符编码是GBK,因此还需要将GBK 转换为Unicode,然后通过Unicode 编码值来获取字形索引,最后就可以在字库文件中得到字符的轮廓数据㊂1.2㊀汉字轮廓分析㊀㊀汉字轮廓的贝塞尔曲线由起始点㊁终止点和控制点组成,描述如下:(1)FT_CURVE_TAG_ON:点在贝塞尔曲线上,为起始点或终止点,其他的点为OFF 点,表明该点不在贝塞尔曲线上,为贝塞尔曲线的控制点㊂(2)FT_CURVE_TAG_CONIC:二次贝塞尔曲线控制点,一条二次贝塞尔曲线由一个起始点㊁一个终止点和一个控制点确定,如图1所示㊂(3)FT_CURVE_TAG_CUBIC:三次贝塞尔曲线控制点,一条三次贝塞尔曲线由一个起始点㊁一个终止点和两个控制点确定,如图2所示㊂图1㊀二次贝塞尔曲线汉字轮廓的贝塞尔曲线插值补偿按以下3种情况进行处理㊂(1)轮廓线的点为FT_CURVE_TAG_ON,仅将该点记录至锚点集,相当于一次贝塞尔曲线(即线段),不用作插值处理㊂图2㊀三次贝塞尔曲线(2)轮廓线的点为FT_CURVE_TAG_CONIC:计算并更新起始点和终止点,分为以下两种情况:若该控制点已经是轮廓线的第一个点,则起始点为轮廓线的最后一个点,否则为锚点集的上一个点㊂若该控制点为轮廓线的最后一个点,则终止点为锚点集第一个点,否则为轮廓线下一个点㊂进行二次贝塞尔曲线插值,分为以下两种情况:若轮廓线下一个点为FT_CURVE_TAG_ON,起始点和终止点按(1)条处理,然后进行二次贝塞尔插值补偿;若轮廓线下一个点仍为FT_CURVE_TAG_ CONIC,则终止点为该2个控制点的中值,然后进行二次贝塞尔曲线插值补偿㊂二次贝塞尔曲线插值公式为:B(t)=(1-t)2P0+2t(1-t)P1+t2P2,tɪ[0,1];其中:P0为起始点,P1为控制点,P2为终止点,t 为补偿系数,一般取0.2㊂(3)轮廓线点为FT_CURVE_TAG_CUBIC:将该控制点作为第一个控制点,计算并更新起始点和终止点,分为以下几种情况:若该控制点已经是轮廓线的第一个点,则起始点为轮廓线的最后一个点,否则为锚点集的上一个点;若该控制点为轮廓线倒数第二个点,第二个控制点为最后一个点,终止点为锚点集第一个点,否则为轮廓线下一个点;其他情况皆无效㊂本研究进行3次贝塞尔曲线插值;3次贝塞尔曲线插值公式为:B(t)=(1-t)3P0+3t(1-t)2P1+3(1-t)t2P2+ (1-t)3P3,tɪ[0,1];其中:P0为起始点,P1为控制点1,P2为控制点2,P3为终止点,t为补偿系数,一般取0.2㊂1.3㊀显示矢量汉字㊀㊀循环逐个分析汉字串的每一个汉字,将汉字转为相应的Unicode编码值㊂在矢量字体的字形索引库中进行索引查找,获得字形轮廓数据集㊂根据实际缩放或旋转需要,对汉字轮廓数据集进行相应的旋转㊁缩放等变换,然后遍历轮廓数据集中的每条封闭的轮廓线,对轮廓线的起始点㊁终止点㊁控制点进行不同的处理,进行贝塞尔一次/二次/三次插值补偿㊂对补偿后的轮廓线进行栅格化处理[3],将可能存在的凹边形分解为多个凸边形,直至遍历完所有的轮廓数据集,最后调用GDI或OpenGL等图形接口将已栅格化的数据进行渲染[4-5],完成汉字的显示,详细处理流程如图3所示㊂图3㊀矢量汉字显示处理流程2 实例分析2.1㊀测试环境㊀㊀采用定制设计的显示处理板进行测试验证㊂其中,CPU为ARM Cortex-M4嵌入式处理器,显示设备为10寸触摸控制屏㊂2.2㊀测试结果2.2.1㊀汉字轮廓显示㊀㊀以汉字 航 为例,分别以宋体和黑体且贝塞尔插值系数t取1.0㊁0.5和0.2按本方法进行测试验证,测试验证结果如图4所示㊂其中黑色线㊁蓝色线和红色线分别描述了汉字轮廓线中线段和二/三次贝塞尔曲线分布及插值情况,分析可见,贝塞尔插值系数取1.0和0.5时,汉字轮廓过渡不平滑,显示效果差㊂贝塞尔插值系数取0.2时,汉字轮廓平滑,显示效果满足要求,而如果取值更小时,平滑效果改良不明显,计算量反而大幅增加㊂2.2.2㊀缩放及旋转显示㊀㊀按本方法对汉字 航 宋体正常显示(字号20,t= 0.2)进行缩放及旋转测试,缩放及旋转测试结果如图分析可见,本方法通过贝塞尔曲线的矢量数据变换,完成汉字的显示㊁旋转和缩放,其显示效果不会发生任何模糊和失真㊂2.2.3㊀传统显示汉字与本方法显示汉字对比㊀㊀使用ARM Cortex -M4图形接口进行渲染后的汉字效果如图6所示㊂图4㊀矢量汉字轮廓图5㊀矢量汉字缩放及旋转图6㊀显示效果对比㊀㊀分析可见,传统方法对汉字进行旋转和缩放必然模糊失真,如进一步缩放,效果将完全模糊根本不可辨认;而本方法对汉字进行任意旋转㊁缩放均能保持良好㊁平滑的显示效果㊂3 结语㊀㊀嵌入式系统由于资源有限,一般只支持点阵汉字,不支持矢量汉字,本文提出了一种基于贝塞尔曲线的矢量汉字显示方法㊂该方法首先分析了矢量汉字的显示原理,在矢量字体文件中通过汉字编码值获取轮廓线,然后基于贝塞尔曲线进行插值补偿,插值补偿系数根据插值计算量和显示效果综合权衡取值,最后在基于ARM Cortex-M4嵌入式处理器的显示处理板上进行了测试验证㊂结果表明,该方法能够实现包括宋体㊁黑体等各种字体和字号的高质量显示,无需反复生成字库文件;对汉字进行任意次旋转㊁缩放变换后,汉字显示效果不失真㊁不模糊,满足了综合模块化航电架构下大屏触摸控制的显示要求,该矢量汉字显示方法不仅适用于STM32㊁ARM等嵌入式裸机系统,同样适用于VxWorks㊁FreeRTOS㊁QNX㊁uClinux 等主流嵌入式操作系统㊂参考文献[1]凌云锋.VxWorks5.5平台下矢量字体显示的实现[J].计算机系统应用,2011(7):203-206.[2]杨军祥,杨涛,李成文,等.综合模块化航空电子核心系统技术研究[J].航空计算技术,2017(3): 106-110.[3]陈振杰,周琛,李飞雪,等.矢量多边形栅格化算法快速并行化方法研究[J].遥感信息,2014(5): 3-8.[4]王汐,蒋林,张敏.GDI函数硬件加速器设计与实现[J].微电子学与计算机,2014(5):44-47. [5]侯冬曼,陈武喝,马佳洪.基于OpenGL的虚拟仿真实验设计[J].实验室研究与探索,2019(6): 89-92.(编辑㊀王永超)Vector Chinese character display technology in embedded systemZhang XiaomingAVIC Xi an Aircraft Insdustry Group Co. Ltd. Xi an710089 ChinaAbstract The display of Chinese characters in embedded system has always been a difficult point in software development.Because it generally only supports dot matrix Chinese characters and vector Chinese characters it can no longer meet the requirements of large-screen display and touch control under the integrated modular avionics architecture.In this paper the principle of displaying vector Chinese characters based on Bezier curve is analyzed and the interpolation compensation coefficient is comprehensively compared and bined with specific examples the results show that this method can realize high-quality display of various fonts and font sizes including Song Ti and Bold and the display effect is not distorted after Chinese characters are rotated and scaled which meets the display requirements of Chinese characters in large-screen touch mode.Key words embedded system dot matrix Chinese characters vector Chinese characters bessel curve Chinese character outline。
单片机中文拼音输入法的设计及实现
柏琳;丁维明
【期刊名称】《工业控制计算机》
【年(卷),期】2005(18)7
【摘要】介绍单片机拼音输入法,由单片机采用折半查找算法定位其在"拼音-首汉字位移表"中的位置,检出对应的首汉字位移,映射按拼音排序的"汉字内码表",根据其内码计算出其字模在"字模表"中位置,并将字模检出送至LCD显示.
【总页数】3页(P48-49,51)
【作者】柏琳;丁维明
【作者单位】东南大学动力工程系,210096;东南大学动力工程系,210096
【正文语种】中文
【中图分类】TP3
【相关文献】
1.浅谈单片机中文输入法系统的设计与实现 [J], 王鹏
2.嵌入式系统下中文拼音输入法的设计与实现 [J], 李晨
3.手机中文拼音输入法的设计与实现 [J], 曲卫华
4.基于QT_E的嵌入式软键盘和中文拼音输入法的设计与实现 [J], 吴静;叶桦;林志勇;;;
5.应用于低性能单片机的拼音输入法设计与实现 [J], 王江;李丽英;刘明德
因版权原因,仅展示原文概要,查看原文内容请购买。
1引言随着嵌入式系统应用领域的不断拓展[1],越来越多的嵌入式设备要求实现中文汉字的输入与显示。
目前应用于智能终端最为广泛的是美国特捷通讯的T9输入法,其次有Mo-torola 的iTAP 输入法和Ericson 的字能输入法等[2]。
尽管市场上还有许多输入法,且它们的功能也十分强大,但是它们大多对硬件要求较高,几乎不支持没有操作系统的嵌入式产品。
而在低端市场,单片机往往需要花费大部分资源来完成输入法功能,这不免导致系统主功能缺少足够的资源可供调用,出现头重脚轻的状况。
因此,研究一种实用且低成本的中文输入法是非常有市场前景和必要性的。
2设计思路单片机中的输入法的传统思路是:选用较大容量的EE-PROM 存放汉字字库,汉字内码则装入FLASH 中,这样虽然可以实现输入法功能,但是其造成了主控芯片的资源大量浪费,FLASH 不能用来存放更多的系统功能代码。
而后,虽然出现了带字库的LCD ,但其做法大都是选择具有较大程序存储器的微处理器,以便存储拼音到字型码的映射表,这样虽然可以解决FLASH 不足的问题,但是成本大幅提高,产品竞争力将随之下降。
本文的设计思路是:采用已附带汉字字库的点阵液晶,直接略去字库所需的内存;然后将汉字内码保存到EEPROM ,而内码大小远小于相应的字库内容,在此处我们可以节省出大量空间。
主控只需要在拼音与内码之间建立一种对应关系,最后通过键盘选择要输入的汉字并显示在液晶屏上。
3硬件设计本系统按功能可划分为输入、处理、存储和输出四个部分[3]。
对于拼音输入法来说,至少需要实现26个字母键、10个数字键、ESC 键、OK 键、MENU 键、MODE 键、UP 键和DOWN 键,可以自制或选择标准键盘。
处理器选用NXP 的LPC2103芯片,它的最高工作速度可达70MHz ,拥有32KB 的片内FLASH 程序存储器和8K 的片内SRAM [4],能够满足大部分嵌入式系统的需求[5],特别适用于访问控制和指纹打卡机等小型应用中,如果在该芯片上开发输入法,作者经过实验测试得到以下结论:使用传统方法时片内FLASH 和RAM 均存在内存不够的问题,改进方案是去掉字模部分,引入带字模的液晶显示器,这样就节约了大量的主控芯片的FLASH 空间,但由于字库内码仍然存放在RAM 中,LPC2103的RAM 依然不足,所以这里采用24c256作为存储器,搭配以ST7920为控制器的液晶,最后发现完成输入法功能后,系统仅使用了主控3KByte FALSH,4KByte RAM ,使得存储量小的主控也能胜任调整后的拼音输入法。
基于单片机的中文输入系统设计(程序+电路原理图+PCB图)精品☆摘要随着我国嵌入式技术的迅猛发展,中文汉字的输入与显示在高端电子产品以及智能终端中的应用越来越广泛。
目前广泛应用于数字终端的中文输入法是Nokia的T9输入法、Motorola的iTAP输入法和Erics-son的字能输入法。
目前,以LCD和数字键盘实现的人机交互式界...<p>摘 要<br />随着我国嵌入式技术的迅猛发展,中文汉字的输入与显示在高端电子产品以及智能终端中的应用越来越广泛。
目前广泛应用于数字终端的中文输入法是Nokia的T9输入法、Motorola 的iTAP输入法和Erics-son的字能输入法。
目前,以LCD和数字键盘实现的人机交互式界面在智能终端中广泛采用,在不同的应用场合,对人机界面的要求也不同,一些情况下只要求简单参数的显示和选择,而在一些信息终端中,还要求文字的输入。
<br />本设计方案在A T89C55WD平台上构造简易的拼音输入法,输入形式是用户通过数字键盘输入一个数字串,LCD显示出该数字串对应的各种拼音让用户进行选择,拼音数组中的每一个元素都指向一个同音汉字串。
用户在同音汉字串中选择一个汉字就可以得到该汉字的GB2312编码。
通过这个GB2312码可以在汉字点阵字模库中检索到该汉字字模的起始位置,最后用带字库的128×64点阵式LCD模块为输出显示设备,实现汉字、英文字母、数字,标点符号等文本信息的输入。
<br /><br />关键字:A T89C55WD;拼音输入法;TSA-3液晶;中文字库原理<br /><br />Abstract<br />With the rapid development of embedding technology, the inputting and displaying of the Chinese character in high-end electronic products, as well as the application of intelligent terminals are widely used more and more. At present, the number of terminals are widely used in the inputting method of Chinese character which are Nokia's T9 inputting method, Motorola's iTAP inputting method and Erics-son's words inputting method. At present, LCD and digital keyboard to achieving the man-machine interactive interface are widely used in intelligent terminals. Indifferent applications, the requirements of human-computer interface is different, some cases require only some simple showing and choosing of parameters, and some information terminals, as well as require the inputting about text. <br />The design in A T89C55WD single-chip platform makes up simple phonetic inputtingmethod, the inputting form is to enter a number string through the numeric keypad by users, the system shows the number of strings which corresponds to the alphabet ,choosing by users, the array of a homonym elements point to a string of Chinese characters. when users choose r a Chinese character can be encoded in the GB2312 Chinese characters. It can retrieve the starting position of the character matrix through the GB2312 Chinese character dot-matrix code matrix in the database . Finaly the 128 × 64 dot matrix LCD module is used for the output showing device, to realize the inputting about the Chinese characters, English letters, numbers, punctuation marks, text input and so on.<br /> <br />Key words: A T89C55WD; Pinyin input method; TSA-3 LCD; Chinese font Principle<br /> <br />1.1 设计任务<br />(1)用单片机作为主控制器;<br />(2)用LCD显示出来;<br />(3)具有全拼输入法功能;<br />(4)具有英文、数字和标点符号的输入功能;<br />(5)具有模糊音输入功能;<br />(6)具有五笔、笔画或区位码输入法功能(选做)。
嵌入式GUI 方案比较一.嵌入式GUI 概况概况随着嵌入式系统的广泛应用,PDA 、机顶盒、DVD/VCD 播放机及WAP 手机已经迅速普及。
图形用户界面(GUI )的广泛流行,是当今计算机技术的重大成就之一。
嵌入式GUI 为嵌入式系统提供了一种应用于特殊场合的人机交互接口。
它极大地方便了非专业用户的使用,因此实时嵌入式系统对GUI 的需求越来越明显,而这一切均要求有一个高性能、高可靠的GUI 的支持。
的支持。
综上所述,GUI 在嵌入式系统或者实时系统中的地位将越来越重要,这些系统对 GUI 的基本要求包括:的基本要求包括:1.轻型、占用资源少。
.轻型、占用资源少。
2.高性能。
.高性能。
3.高可靠性。
.高可靠性。
4.可配置。
.可配置。
二.目前,主流的嵌入式Linux 系统的GUI 解决方案有:解决方案有:1. MicroWindows MicroWindows 是一个著名的开放源码的嵌入式GUI 软件。
MicroWindows提供了现代图形窗口系统的一些特性。
MicroWindows MicroWindows APIAPI 接口支持类Win32 API ,接口试图和Win32完全兼容。
它还实现了一些Win32用户模块功能。
MicroWindows 采用分层设计方法,以便不同的层面能够在需要的时候改写,基本上用本上用 C 语言实现。
MicroWindows 能够在没有任何操作系统或其他图形系统的支持下运行,它能对裸显示设备进行直接操作。
这样,MicroWindows 就显得十分小巧,便于移植到各种硬件和软件系统上。
MicroWindows 已经支持已经支持 Intel 16位和32位CPU 、MIPS R4000 以及以及 ARM 芯片;但作为一个窗口系统,该项目提供的窗口处理功能还需要进一步完善,提供的窗口处理功能还需要进一步完善,比如控件或构件的实现还很不完备,比如控件或构件的实现还很不完备,比如控件或构件的实现还很不完备,键键盘和鼠标等的驱动还很不完善。
信息技术XINXUISHU2021年第2期基于P300的便携式中文输入系统黄国阳,何军,毛剑波(合肥工业大学电子科学与应用物理学院,合肥230601)摘要:目前有关中文BCI输入系统的研究仅有拼音输入和笔画输入两种,且都克服不了中文输入速率较低、不便携等问题。
据此提出了基于P300的五笔中文输入系统。
此系统通过低成本0penBCI 套件,使用Wi-Fi协议传输脑电数据,在移动设备上实现刺激界面,并使用卷积神经网络处理脑电信号。
实验表明,该系统具有高中文输入速率、高准确率以及便携化等特点。
关键词:脑机接口;脑电信号;P300电位;OpenBCI;嵌入式系统中图分类号:TP335;R318.04文献标识码:A文章编号:1009-2552(2021)02-0056-06DOI:10.13274/ki.hdzj.2021.02.010Portable Chinese input system based on P300HUANG Guo-yang,HE Jun,MAO Jian-bo(School of Electronic Science and Applied Physics,Hefei University of Technology,Hefei230601,China) Abstract:Currently there has been merely two types of input methods used in the proposed Chinese-based BCI input system:Pinyin input and stroke input.Furthermore,both of them cannot overcome the problems such as low Chinese input rate and being unportable・To solve the problems,a Wubi Chinese input system is proposed on the basis of P300.This system use the low-cost OpenBCI suite,use the Wi-Fi protocol to transmit computer data,the stimulation interface is realized on mobile devices,and Convolutional Neural Network is used to process EEG signal・The experimental results show that the system has the characteristics of high Chinese input rate,high accuracy and portability.Key words:brain-computer interface;EEG signal;P300potential;OpenBCI;embedded systemo引言语言拼写是脑机接口(BCI,Brain-Computer Interface)的典型应用。
有关汉字编码、拼⾳输⼊法⼤搜罗机内码国标码区位码计算机处理汉字信息的前提条件是对每个汉字进⾏编码,这些编码统称为汉字编码。
汉字信息在系统内传送的过程就是汉字编码转换的过程。
汉字交换码:汉字信息处理系统之间或通信系统之间传输信息时,对每⼀个汉字所规定的统⼀编码,我国已指定汉字交换码的国家标准“信息交换⽤汉字编码字符集——基本集”,代号为GB 2312—80,⼜称为“国标码”。
国标码:所有汉字编码都应该遵循这⼀标准,汉字机内码的编码、汉字字库的设计、汉字输⼊码的转换、输出设备的汉字地址码等,都以此标准为基础。
GB 2312—80就是国标码。
该码规定:⼀个汉字⽤两个字节表⽰,每个字节只有7位,与ASCII码相似。
区位码:将GB 2312—80的全部字符集组成⼀个94×94的⽅阵,每⼀⾏称为⼀个“区”,编号为0l~94;每⼀列称为⼀个“位”,编号为0l~94,这样得到GB 2312—80的区位图,⽤区位图的位置来表⽰的汉字编码,称为区位码。
机内码:为了避免ASCII码和国标码同时使⽤时产⽣⼆义性问题,⼤部分汉字系统都采⽤将国标码每个字节⾼位置1作为汉字机内码。
这样既解决了汉字机内码与西⽂机内码之间的⼆义性,⼜使汉字机内码与国标码具有极简单的对应关系。
汉字机内码、国标码和区位码三者之间的关系为:区位码(⼗进制)的两个字节分别转换为⼗六进制后加20H得到对应的国标码;机内码是汉字交换码(国标码)两个字节的最⾼位分别加1,即汉字交换码(国标码)的两个字节分别加80H得到对应的机内码;区位码(⼗进制)的两个字节分别转换为⼗六进制后加A0H得到对应的机内码。
汉字编码简明对照表中⽂转换为完整拼⾳算法原理分析汉字编码原理1.国家标准汉字代码体系汉字字数繁多,属性丰富,因⽽汉字代码体系也较复杂,包括:(1)汉字机内码。
它们是汉字在计算机汉字系统内部的表⽰⽅法,是计算机汉字系统的基础代码。
(2)汉字交换码。
它们是国标汉字(如机内码)进⾏信息交换的代码标准。
UCDOS中的点阵字库HZK12,HZK16,HZK24,ASC12,ASC16[转]2009年03月10日星期二 13:40如何在嵌入式系统中使用大量的汉字和字符呢?DOS前辈们经过艰辛的努力,将制作好的字模放到了一个个标准的库中以免去后辈的麻烦,这就是点阵字库文件。
一般我们使用16*16的点阵宋体字库,所谓16*16,是每一个汉字在纵、横各16点的区域内显示的。
不过后来又有了HZK12、HZK24,HZK32和HZK48字库及黑体、楷体和隶书字库。
虽然汉字库种类繁多,但都是按照区位的顺序排列的。
前一个字节为该汉字的区号,后一个字节为该字的位号。
每一个区记录94个汉字,位号则为该字在该区中的位置。
因此,汉字在汉字库中的具体位置计算公式为:94*(区号-1)+位号-1。
减1是因为数组是以0为开始而区号位号是以1为开始的。
这仅为以汉字为单位该汉字在汉字库中的位置,那么,如何得到以字节为单位得到该汉字在汉字库中的位置呢?只需乘上一个汉字字模占用的字节数即可,即:(94*(区号-1)+位号-1)*一个汉字字模占用字节数,而按每种汉字库的汉字大小不同又会得到不同的结果。
以16*16点阵字库为例,计算公式则为:(94*(区号-1)+(位号-1))*32。
汉字库文该从该位置起的32字节信息即记录了该字的字模信息。
☆打印字库文件和HZK12如果你有UCDOS的HZK24S(宋体)、HZK24K(楷体)或HZK24H (黑体),你还可以使用不同字体的大字模汉字了。
HZK24系列是24*24的点阵字库,每字模占用3*24字节。
如果你按照HZK16的显示方法的话,你会看到......呵呵,字被放倒了。
这是因为该类字库与一般的汉字库不同,这类大字模汉字库是专供打印的打印字库,为了打印的方便将字模都放倒了,你使用时,只要将字模的位信息纵横转置显示即可。
例如你如果定义为mat[24][3]则应该这样输出:for(i=0;i<24;i++)for(j=0;j<24;j++)if((0x80>>i%8)&mat[j][i/8]) /*转置显示*/putpixel(j+x,y+i,color);还有一类字库HZK12,虽然属于标准字库类型,但如果你将它的字模当作12*12位计算的话,根本无法正常显示汉字。
论文独创性声明本人郑重声明:1.坚持以“求实、创新”的科学精神从事研究工作。
2.本论文是我个人在导师指导下进行的研究工作和取得的研究成果。
3.本论文中除引文外,所有实验、数据和有关材料均是真实的。
4.本论文中除引文和致谢的内容外,不包含其他人或其它机构已经发表或撰写过的研究成果。
5.其他同志对本研究所做的贡献均已在论文中作了声明并表示了谢意作者签名:日期:摘要本论文设计的是T9汉字输入法,能实现汉字的读写功能。
它主要以AT89C51系类单片机作为微控制器,以STC12C5A60S2单片机为核心。
用户通过拼音按键自动搜索字库中与按键相匹配的用户所想要的汉字,在显示屏上显示字库中相匹配的汉字,并保存在AT24C64存储卡中。
本设计主要由四大模块组成,第一块是是4*4的矩阵按键,它是本设计的输入口,用户必须要通过按键表达他想表达的汉字。
二模块是STC12C5A60S2型号单片机,它主要功能是存储我所需要的汉字字库和主程序,链接各个模块之间的枢纽。
第三模块是128*64的显示模块,主要是显示用户通过按键表达用户需要的汉字。
第四模块是存储模块,它是用于硬件数据保护的写保护,存储用户所搜寻到的汉字。
最后经过链接和调试后能实现T9输入法的汉字调用,汉字显示及存储功能,最终实现手机中T9输入法的功能。
关键词:51单片机;4*4矩阵按键;12864显示屏;at24c64存储技术AbstractThe design of the T9 Chinese input method primarily AT89C51 microcontroller as the system class microcontroller to STC12C5A60S2 microcontroller core. User through the alphabet keys and buttons automatically search for the font that matches the user wants characters, display font that matches the characters on the screen and stored in AT24C64 memory card. This design consists of four modules, the first piece is a 4 * 4 matrix keys, it is the design of the input port, the user must express his characters want to express through the key. Two modules are STC12C5A60S2 type microcontroller, which main function is the storage I need Chinese character, hub link between the various modules. The third module is 128 * 64 display module, the main characters are displayed user needs expressed by the users through the key. The fourth module is a memory module, it is write-protected, the hardware store user data protection for the search to the characters. Finally, after linking and debugging can be realized characters call T9 input method, Chinese character display and storage capabilities, and ultimately the function of the phone T9 input method.Keywords:51 single; 4 * 4 matrix keypad; 12864 display; at24c64 storage technology目录1.绪论 (1)1.1 课题研究的背景和意义 (1)1.2 目前国内外研究现状 (1)1.3本课题设计的主要工作和任务 (2)2.T9输入法系统方案介绍与设计 (2)2.1 T9输入法介绍 (2)2.2 T9输入法的设计原理图 (3)3.系统硬件设计 (4)3.1 单片机模块 (4)3.1.1 单片机的概述 (4)3.1.2简介STC12C5A60S2 (4)3.1.3.复位电路 (6)3.1.4 时钟电路 (7)3.2显示模块 (7)3.2.1 128*64显示屏介绍 (7)3.2.2 12864显示屏管脚图和技术参数 (8)3.3 4*4矩阵按键模块 (9)3.3.1矩阵按键介绍 (9)3.3.2 4*4矩阵按键原理 (10)3.4 AT24C64存储模块 (10)3.4.1 AT24C64存储芯片介绍 (10)3.4.2 AT24C64存储模块电路图 (11)3.4.3 AT24C64存储芯片管脚图 (12)4.系统软件设计 (13)4.1 系统总流程图 (14)4.2 矩阵和显示模块流程图 (15)4.2.1 4*4矩阵模块流程图 (15)4.2.2 显示模块流程图 (16)4.3 KEIL开发环境 (17)结论 (18)系统实物调试 (19)参考文献 (22)致谢 (23)附录A 总电路图 (24)附录B 源程序 (25)1.绪论1.1 课题研究的背景和意义现今的资讯时代,电子设备发展速度很快,学习工作都需要电脑,手机来处理,而在我们常用的语言文字中,中文是最通用的,几乎做任何事情都要使用到中文,文书处理,书信来往,即时通讯,学校作业,毕业论文,推理资料,商业简讯…等等,都有绝大的比例是靠中文输入,所以有快速的中文输入工具,将是提升工作效率,帮助学习,加强人际沟通的重要事项,学一种好的中文输入法,实在是优点很多,也是现代人不可或缺的一项输入法技能。
嵌入式系统显示多国语言文字的高效方法嵌入式系统经常需要在不同的语言环境下显示文字,这对于全球化的产品来说尤为重要。
本文将介绍如何实现在嵌入式系统中高效地显示多国语言文字的方法。
一、字符编码与字体管理在多国语言环境下,字符编码和字体管理是显示多国语言的基础。
为了能够正确地显示不同语言的文字,首先需要选择适当的字符编码。
常见的字符编码标准有UTF-8、UTF-16、GB2312等,根据不同的需求选择合适的编码方式。
同时,合理管理字体库也是非常重要的。
嵌入式系统需要提前准备适当的字体文件,以支持各种语言的字形。
字体文件可以通过外部存储设备或者内部存储设备进行管理,并在系统初始化时进行加载和配置。
二、多语言字符串资源管理为了高效地显示多国语言文字,需要进行多语言字符串资源的管理。
一种常见的做法是使用外部资源文件存储各种语言的字符串,通过在程序中动态加载对应的语言资源,实现多语言显示的功能。
外部资源文件可以使用常见的文本格式,如XML、JSON等。
每个字符串资源都需要标注对应的语言标识,以便系统在运行时根据当前语言环境加载对应的字符串。
同时,为了提高性能,可以将字符串资源进行预编译,以避免运行时解析和加载字符串。
三、语言环境切换与显示适配嵌入式系统需要提供语言环境切换的功能,以便用户能够根据自己的需求选择合适的语言显示。
语言环境切换可以通过系统设置或者应用程序界面实现,用户选择语言后,系统需要重新加载对应的语言资源并更新显示内容。
显示适配也是非常重要的一环。
由于不同语言的文字长度和大小可能有所差异,需要对界面进行适当的调整,以确保文字能够完整显示并保持良好的可读性。
这可以通过自适应布局和字体大小调整等方法实现。
四、文化习惯与本地化支持除了文字的显示外,嵌入式系统还应该考虑不同文化习惯和本地化支持的问题。
例如,日期、时间、货币等信息的格式显示应该根据用户的语言习惯进行相应调整,以提供更好的用户体验。
同时,对于一些特殊的语言,如阿拉伯语、希伯来语等,其文字方向与大部分语言不同,系统也需要进行相应的适配,以确保这些语言的文字能够正确地显示。
/bbs/viewthread.php?tid=8868&extra=page%3D21.简单知识中文输入发我不多说,大家都用过,目前嵌入式系统中比较典型的中文输入法有诺基亚的T9 、摩托罗拉的 i T A P 、爱立信的字能等,这些输入法的输入设备一般是数字键0 ~ 9和一些功能键组成。
除了支持中文的拼音和笔画外还支持诸如日文、韩文等其他国家的语言。
中文输入法可分为拼音输入和笔画输入。
一般情况下拼音输入法相对笔画输入法,重码率要高,但简单易用,(再加个模式识别进行手写输入就更高级了,呵呵),我这里也是拼音输入,由于空间有效,不支持联想功能.2. 硬软件硬件用的NXP的2138,LCD是台湾雄铎科技的,240*160,软件用的zlg的模板,uc2.52版,按键布局与手机一样,如"2"键为abc,"3"为def,等等3.前期准备3.1网上有许多的资料,给出了键盘数字组合对应的拼音组合和汉字组合,我也利用这个,如{"2","a",(char *)PY_mb_a},{"24","ai",(char *)PY_mb_ai},{"26","an",(char *)PY_mb_an},{"26","ao",(char *)PY_mb_ao},{"22","ba",(char *)PY_mb_ba},{"24","bi",(char *)PY_mb_bi},const char PY_mb_a[] ={"阿啊"};const char PY_mb_ai[] ={"矮蔼艾爱隘碍霭"};但有个问题,这个网上流传的拼音-汉字组合中汉字非常少,对于输入是远远不够的,比如说"汶川"的汶就没有,而且没有多音字,例如"还"的拼音属于"huan",你打"还"就没有,这对于输入是不可以接收的,下面我讲一下我的解决方法.3.2寻找所有汉字的拼音,这个如果打开字典一个一个的输,恐怕没有一个月是干不成了,庆幸的是有人替我们做好了,在万能五笔输入法中有一个拼音记录文件,几乎包括了所有的汉字,拿来所用py_gb.rar (264.6 KB)这个文件中,有许多词组,是我们不需要的,需要剔掉,但手工的方式工作量太大,这里我们发挥计算机比较傻的优势来做这件事,用到一些VC的基本知识,相信大家都有这个能力CStdioFile read_file,read_new_file;CStdioFile write_file;CString my_str,temp_str,tf="";read_file.Open( "py_gb.txt", CFile::modeRead,NULL ) ;write_file.Open( "new_py_gb.txt", CFile::modeCreate | CFile::modeWrite,NULL ) ;while (read_file.ReadString(my_str)){int i = my_str.Find(" ");if ((my_str.GetLength() - i) > 3){/* 是词组 */continue;}else{/* 保存到文件 */write_file.WriteString(my_str);write_file.WriteString("\n");}}read_file.Close();write_file.Close();原理也非常简单,如果是词组,汉字的个数肯定大于1,在vc中,一个ASCII占一个字节,一个汉字占两个字节,整理后的文件如下new_py_gb.rar (65.71 KB)3.3在文件new_py_gb.txt中,列出了每个字的拼音,如a 啊a 阿a 呵a 吖a 嗄a 腌a 锕a 錒aes 厑ai 爱ai 矮ai 挨ai 哎ai 碍ai 癌ai 艾ai 唉ai 哀ai 蔼到这里又产生一个问题,必须将所有的同音汉字组合在一起,例如拼音为a的,应该这样a啊阿呵吖嗄腌锕錒vc程序如下:read_file.Open( "py_file.c", CFile::modeRead,NULL ) ;read_new_file.Open("new_py_gb.txt", CFile::modeRead,NULL);write_file.Open( "zhenli.txt", CFile::modeCreate | CFile::modeWrite,NULL ) ;while (read_file.ReadString(my_str)){int i = my_str.Find(",");int j = my_str.Find(",",i);temp_str = my_str.Mid(i + 2, j - 3);CString save_str = temp_str;while (read_new_file.ReadString(tf)){int ll = tf.Find(" ");if (tf.Left(ll) == temp_str){save_str += tf.Right(2);}}write_file.WriteString(save_str );write_file.WriteString("\n");read_new_file.SeekToBegin();}原理就是把所有拼音相同的字组合在一起,这个过程比较慢,需要耐心等待,不要以为程序死掉了,呵呵,生成的zhenli.txt文件如下:a啊阿呵吖嗄腌锕錒e饿哦额鹅蛾扼俄讹阿遏峨娥恶厄鄂锇谔垩锷阏萼苊轭婀莪鳄颚腭愕呃噩鹗屙亚亜亞伪佮侉偔偽僞僫匎匼卾吪呝咢咹哑唖啈啊啐啞噁囐囮垭埡堊堨堮妸妿姶娾娿媕屵岋峉峩崿庵廅悪惡戹搕搤搹擜曷枙椏櫮欸歞歹歺洝涐湂玀珴琧痷皒睋砈砐砨砵硆硪磀礘胺蒍蕚蘁蚅蝁覨訛詻誐諤譌讍豟軛軶輵迗遌遻邑鈋鋨鍔鑩閜閼阨阸隘頞頟額顎餓餩騀鬲魤魥鰐鰪鱷鴳鵈鵝鵞鶚齃齶齾…………3.4又产生一个新问题,里面的字太多了,许多生僻的字连GB2312编码中都没有,这些字对于应用是没有用的,必须剔除,于是:找到GB2312编码的所有汉字啊阿埃挨哎唉哀皑癌蔼矮艾碍爱隘鞍氨安俺按暗岸胺案肮昂盎凹敖熬翱袄傲奥懊澳芭捌扒叭吧笆八疤巴拔跋靶把耙坝霸罢爸白柏百摆佰败拜稗斑班搬扳般颁板版扮拌伴瓣半办绊邦帮梆榜膀绑棒磅蚌镑傍谤苞胞包褒剥GB2312.rar (11.01 KB)为了方便,做进一步的整理,将一个段位的所有字放到一行中:啊阿埃挨哎唉哀皑癌蔼矮艾碍爱隘鞍氨安俺按暗岸胺案肮昂盎凹敖熬翱袄傲奥懊澳芭捌扒叭吧笆八疤巴拔跋靶把耙坝霸罢爸白柏百摆佰败拜稗斑班搬扳般颁板版扮拌伴瓣半办绊邦帮梆榜膀绑棒磅蚌镑傍谤苞胞包褒剥薄雹保堡饱宝抱报暴豹鲍爆杯碑悲卑北辈背贝钡倍狈备惫焙被奔苯本笨崩绷甭泵蹦迸逼鼻比鄙笔彼碧蓖蔽毕毙毖币庇痹闭敝弊必辟壁臂避陛鞭边编贬扁便变卞辨辩辫遍标彪膘表鳖憋别瘪彬斌濒滨宾摈兵冰柄丙秉饼炳read_file.Open( "gb2312.txt", CFile::modeRead,NULL ) ;write_file.Open( "gb2312_new.txt", CFile::modeCreate | CFile::modeWrite,NULL ) ;int i = 0;while (read_file.ReadString(my_str)){if (my_str == ""){continue;}i++;tf += my_str;if (i == 6){write_file.WriteString(tf);write_file.WriteString("\n");i = 0;tf = "";}}gb2312_new.rar (471 Bytes)3.5对比GB2312中有的汉字,依次查找zhenli.txt中的每个汉字是否是有效的,在这里我做了个假设,如果一个拼音下的某个汉字不存在,z则其后的汉字也不存在,即e饿哦额鹅蛾扼俄讹阿遏峨娥恶厄鄂锇谔垩锷阏萼苊轭婀莪鳄颚腭愕呃噩鹗屙亚亜亞伪佮侉偔偽僞僫匎匼卾吪呝咢咹哑唖啈啊啐啞噁囐囮垭埡中,“亜”不存在,则其后的字都剔除,这样是合理的,以为即使某个字存在,他的拼音现在也不用了read_file.Open( "gb2312_new.txt", CFile::modeRead,NULL ) ;read_new_file.Open("zhenli.txt", CFile::modeRead,NULL);write_file.Open( "valid_chinese.txt", CFile::modeCreate | CFile::modeWrite,NULL ) ;CString gb2312_buffer="";while (read_file.ReadString(my_str)){gb2312_buffer+=my_str;}while (read_new_file.ReadString(my_str)){int i = 0;char * p_str = my_str.GetBuffer(0);CString used_in_str="";/* 去掉行首的拼音*/while (!(*p_str & 0x80)){p_str++;i++;}used_in_str = my_str.Left(i);temp_str = my_str.Right(my_str.GetLength()-i); for (i = 0;i < temp_str.GetLength();i++,i++){tf = temp_str.Mid(i,2);/* 在GB2312的文件中查找是否存在*/ if (-1 == (gb2312_buffer.Find(tf))){/* 没发现此字,则认为后续的字都不存在*/ write_file.WriteString(used_in_str);write_file.WriteString("\n");break;}used_in_str+=tf;}}生成的文件为a啊阿呵吖嗄腌锕e饿哦额鹅蛾扼俄讹阿遏峨娥恶厄鄂锇谔垩锷阏萼苊轭婀莪鳄颚腭愕呃噩鹗屙m呒n嗯o哦喔噢…………附件valid_chinese.rar(13.49 KB)2008-5-25 10:28, 下载次数: 833.6将valid_chines.txt中的格式向py_file.txt中的格式靠拢read_file.Open( "py_file.txt", CFile::modeReadWrite,NULL ) ;read_new_file.Open("valid_chinese.txt", CFile::modeRead,NULL);write_file.Open("new_py_file.txt", CFile::modeWrite | CFile::modeCreate,NULL);while (read_new_file.ReadString(my_str)){int i = 0;char * p_str = my_str.GetBuffer(0);CString used_in_str="";/* 去掉行首的拼音 */while (!(*p_str & 0x80)){p_str++;i++;}used_in_str = my_str.Right(my_str.GetLength() - i);/* 将第一个字去py_file.txt中寻找,找到后将本字符串替换到文件中 */tf = used_in_str.Left(2);CString ss;read_file.SeekToBegin();while (read_file.ReadString(ss)){if (ss.Find(tf) != -1){/* 找到第一个"位置 */CString new_ss = ss.Left(ss.Find("\"") + 1);new_ss += used_in_str;new_ss += "\"};\n";write_file.WriteString(new_ss);break;}}}但发现有一个新问题,依照上面的算法,如果多音字在行首,则会出现下面的问题:比如:在valid_chinese.txt中hai还海害咳氦孩骇咳骸亥嗨醢胲侅咍咴嗐嚡塰拸欬烸猲絯還郂酼閡阂頦颏餀饚駭駴liao了料撩聊撂疗廖燎辽僚寥镣潦钌蓼尥寮缭獠鹩嘹佬僇劳勞嫽尞尦屪嵺嶚嶛廫憀憭摎敹暸樛漻炓爎爒璙療瞭窷竂簝繚膋膫蟉蟟蟧豂賿蹘蹽轑遼鄝釕鏐鐐镠镽飂飉髎鷯chang长唱常场厂尝肠畅昌敞倡偿猖裳鲳氅菖惝嫦徜鬯阊怅伥昶苌娼仧倀倘僘償儻兏厰嘗嚐場塲尙尚廠悵晿暢棖椙淌淐焻玚琩瑒瑺瓺甞畼脹腸膓萇蟐裮誯鋹鋿錩鏛锠長镸閶闛韔鯧鱨鲿鼚而在py_file.txt中const char PY_mb_huan[] ={"欢还环桓缓幻宦唤换涣患焕痪豢"};这样就可能将huan变为hai,幸亏这样的情况只有以上三个,所以手工调整一下即可还有一个特例就是“揣”的拼音需要特殊考虑,得到的文件如下:new_py_file.rar (13.9 KB)最后,就是再整理了,/* 按照数字的顺序重新排列数据 */read_new_file.Open("final-1.txt", CFile::modeRead,NULL);write_file.Open("final-2.txt", CFile::modeWrite | CFile::modeCreate,NULL);CString str2="",str3="",str4="",str5="",str6="",str7="",str8="",str9="";while (read_new_file.ReadString(my_str)){char * left_char = my_str.GetBuffer(0);left_char += 2;my_str += "\n";switch(*left_char){case '2':str2 += my_str;break;case '3':str3 += my_str;break;case '4':str4 += my_str;break;case '5':str5 += my_str;break;case '6':str6 += my_str;break;case '7':str7 += my_str;break;case '8':str8 += my_str;break;case '9':str9 += my_str;break;default:break;}}write_file.WriteString(str2); write_file.WriteString(str3); write_file.WriteString(str4); write_file.WriteString(str5);write_file.WriteString(str6);write_file.WriteString(str7);write_file.WriteString(str8);write_file.WriteString(str9);目的是将拼音按数字顺序重新排列,以加快搜索速度{"2","a",(char *)PY_mb_a},{"2","b",(char *)PY_mb_bu},{"2","c",(char *)PY_mb_ca},{"24","ai",(char *)PY_mb_ai},{"26","an",(char *)PY_mb_an},{"26","ao",(char *)PY_mb_ao},{"22","ba",(char *)PY_mb_ba},{"24","bi",(char *)PY_mb_bi},{"26","bo",(char *)PY_mb_bo},{"28","bu",(char *)PY_mb_bu},{"22","ca",(char *)PY_mb_ca},{"23","ce",(char *)PY_mb_ce},{"24","ci",(char *)PY_mb_ci},{"28","cu",(char *)PY_mb_cu},{"264","ang",(char *)PY_mb_ang},{"224","bai",(char *)PY_mb_bai},{ final-1.rar (2.28 KB)final-2.rar (2.44 KB)最后,就是按照输入的数字顺序,遍历数组,得到相应的拼音和汉字串,我就不多啰嗦了,明天到单位,我把真实的终端拍个照片发上来给大家看一下。