打印

C 语言嵌入式系统编程屏幕操作

[复制链接]
729|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
engao|  楼主 | 2016-1-31 17:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    现在要解决的问题是,嵌入式系统中经常要使用的并非是完整的汉 字库,往往只是需要提供数量有限的汉字供必要的显示功能。例如,一个微波炉的LCD上没有必要提供显示"电子邮件"的功能;一个提供汉字显示功能的空调的LCD上不需要显示一条"短消息",诸如此类。但是一部手机、小灵通则通常需要包括较完整的汉字库。
沙发
engao|  楼主 | 2016-1-31 17:33 | 只看该作者
如果包括的汉字库较完整,那么,由内码计算出汉字字模在库中的偏移是十分简单的:汉字库是按照区位的顺序排列的,前一个字节为该汉字的区号,后一个字节为该字的位号。每一个区记录94个汉字,位号则为该字在该区中的位置。因此,汉字在汉字库中的具体位置计算公式为:94*( 区号-1)+ 位号-1 。减1 是因为数组是以0 为开始而区号位号是以1 为开始的。只需乘上一个汉字字模占用的字节数即可,即:(94*(区号-1)+ 位号-1)* 一个汉字字模占用字节数,以 16*16点阵字库为例,计算公式则为:(94*(区号-1)+(位号-1))*32。汉字库中从该位置起的32字节信息记录了该字的字模信息。

使用特权

评论回复
板凳
dianz| | 2016-1-31 17:34 | 只看该作者
对于包含较完整汉字库的系统而言,我们可以以上述规则计算字模的位置。但是如果仅仅是提供少量汉字呢?譬如几十至几百个?最好的做法是:

使用特权

评论回复
地板
zya888| | 2016-1-31 17:35 | 只看该作者
    定义宏:
# define EX_FONT_CHAR(value)   
# define EX_FONT_UNICODE_VAL(value) (value),
# define EX_FONT_ANSI_VAL(value) (value),

  定义结构体:
typedef struct _wide_unicode_font16x16   
{
  WORD value; /* 内码 */
  BYTE data [3 2]; /*  字模点阵 */
}Unicode;
#define CHINESE_CHAR_NUM … /*  汉字数量 */

使用特权

评论回复
5
quangg| | 2016-1-31 17:36 | 只看该作者
字模的存储用数组:
Unicode chinese[CHINESE_CHAR_NUM] =
{
{
EX_FONT_CHAR(" 业")
EX_FONT_UNICODE_VAL(0x4e1a)
{0x04, 0x40, 0x04, 0x40, 0x04, 0x40, 0x04, 0x44, 0x44, 0x46, 0x24, 0x4c, 0x24, 0x48, 0x14,
0x50 , 0x1c, 0x50, 0x14, 0x60, 0x04, 0x40, 0x04, 0x40, 0x04, 0x44, 0xff, 0xfe, 0x00, 0x00,
0x00, 0x00}
},
{
EX_FONT_CHAR(" 中")
EX FONT UNICODE VAL( 0x4e2d)
{0x01, 0x00, 0x01, 0x00, 0x21, 0x08, 0x3f, 0xfc, 0x21, 0x08, 0x21, 0x08, 0x21, 0x08, 0x21,
0x08, 0x21, 0x08,   
0x3f, 0xf8, 0x21,  0x08, 0x01, 0x00, 0x01,  0x00, 0x01, 0x00, 0x 01, 0x00, 0x01, 0x00}
},
{
EX_FONT_CHAR(" 云")
EX_FONT_UNICODE_VAL(0x4e91)
{0x00, 0x00, 0x00, 0x30, 0x3f, 0xf8, 0x00, 0x 00, 0x00, 0x00, 0x00, 0x0c, 0xff, 0xfe, 0x03,
0x00, 0x07, 0x00,   

0x06, 0x40, 0x0c, 0x20, 0x18, 0x10, 0 x31 , 0xf8, 0x7f, 0x0c, 0x20, 0x08, 0x00, 0x00}
},
{
EX_FONT_CHAR(" 件")
EX_FONT_UNICODE_VAL(0x4ef6)
{0x10, 0x40, 0x1a, 0x40, 0x13, 0x40, 0x32, 0x40, 0x23, 0xfc, 0x64 , 0x40, 0xa4, 0x40, 0x28,
0x40, 0x2f, 0xfe,   

0x20, 0x40, 0x20, 0x40,  0x20, 0x40, 0x20, 0x 40, 0x20, 0x40, 0x20, 0x40, 0x20, 0x40}
}
}

使用特权

评论回复
6
zya888| | 2016-1-31 17:36 | 只看该作者
要显示特定汉字的时候,只需要从数组中查找内码与要求汉字内码相同的即可获得字模。如果前面的汉字在数组中以内码大小顺序排列,那么可以以二分查找法更高效的查找到字的字模。

使用特权

评论回复
7
quangg| | 2016-1-31 17:36 | 只看该作者
这是一种很有效的组织小汉字库的方法,它可以保证程序有很好的结构。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

34

主题

400

帖子

0

粉丝