首页 新闻资讯 技术资料 论坛 网站地图
通信产品 CPLD/FPGA 嵌入式系统 存储器 医疗电子 嵌入式开发新闻 嵌入式硬件
电子元器件搜索:
IC库存(8958万) PDF资料(329万) IC价格 IC求购 资讯 技术资料
维库电子市场网是知名的电子元器件交易网站, 为电子生产企业提供IC库存和技术资料查询服务。
位置: 首页 > 详细信息
  [转帖]C语言嵌入式系统编程屏幕操作(上)
出处:嵌入式技术网 时间: 2007-09-18
embedu 发布于 2007-9-15 10:23:07
1.汉字处理
现在要解决的问题是,嵌入式系统中经常要使用的并非是完整的汉字库,往往只是需要提供数量有限的汉字供必要的显示功能。例如,一个微波炉的LCD上没有必要提供显示“电子邮件”的功能;一个提供汉字显示功能的空调的LCD上不需要显示一条“短消息”,诸如此类。但是一部手机、小灵通则通常需要包括较完整的汉字库。
如果包括的汉字库较完整,那么,由内码计算出汉字字模在库中的偏移是十分简单的:汉字库是按照区位的顺序排列的,前一个字节为该汉字的区号,后一个字节为该字的位号。每一个区记录94个汉字,位号则为该字在该区中的位置。因此,汉字在汉字库中的具体位置计算公式为:94*(区号-1)+位号-1。减1是因为数组是以0为开始而区号位号是以1为开始的。只需乘上一个汉字字模占用的字节数即可,即:(94*(区号-1)+位号-1)*一个汉字字模占用字节数,以16*16点阵字库为例,计算公式则为:(94*(区号-1)+(位号-1))*32。汉字库中从该位置起的32字节信息记录了该字的字模信息。
对于包含较完整汉字库的系统而言,我们可以以上述规则计算字模的位置。但是如果仅仅是提供少量汉字呢?譬如几十至几百个?最好的做法是:
定义宏:
# 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[32];  /* 字模点阵 */
}Unicode;
#define CHINESE_CHAR_NUM …    /* 汉字数量 */
字模的存储用数组:
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, 0x01, 0x00, 0x01, 0x00}
      },
      {
             EX_FONT_CHAR("")
             EX_FONT_UNICODE_VAL(0x4e91)
             {0x00, 0x00, 0x00, 0x30, 0x3f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0xff, 0xfe, 0x03, 0x00, 0x07, 0x00,


0x06, 0x40, 0x0c, 0x20, 0x18, 0x10, 0x31, 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, 0x40, 0x20, 0x40, 0x20, 0x40, 0x20, 0x40}
      }
}
要显示特定汉字的时候,只需要从数组中查找内码与要求汉字内码相同的即可获得字模。如果前面的汉字在数组中以内码大小顺序排列,那么可以以二分查找法更高效的查找到汉字的字模。
这是一种很有效的组织小汉字库的方法,它可以保证程序有很好的结构。
2.系统时间显示
NVRAM中可以读取系统的时间,系统一般借助NVRAM产生的秒中断每秒读取一次当前时间并在LCD上显示。关于时间的显示,有一个效率问题。因为时间有其特殊性,那就是60秒才有一次分钟的变化,60分钟才有一次小时变化,如果我们每次都将读取的时间在屏幕上完全重新刷新一次,则浪费了大量的系统时间。
一个较好的办法是我们在时间显示函数中以静态变量分别存储小时、分钟、秒,只有在其内容发生变化的时候才更新其显示。
extern  void DisplayTime(…)
{
    static BYTE byHour,byMinute,bySecond;
    BYTE byNewHour, byNewMinute, byNewSecond;
    byNewHour = GetSysHour();
    byNewMinute = GetSysMinute();
    byNewSecond = GetSysSecond();
    
    if(byNewHour!= byHour)
    {
…        /* 显示小时 */
byHour = byNewHour;
}
    if(byNewMinute!= byMinute)
    {
…        /* 显示分钟 */
byMinute = byNewMinute;
}
    if(byNewSecond!= bySecond)
    {
…        /* 显示秒钟 */
bySecond = byNewSecond;
}
}
这个例子也可以顺便作为C语言中static关键字强大威力的证明。当然,在C++语言里,static具有了更加强大的威力,它使得某些数据和函数脱离“对象”而成为“类”的一部分,正是它的这一特点,成就了软件的无数优秀设计。

超值提供ARM开发板、开发套件!
可全国邮购,快递免费送货上门,可提供发票,价格优惠!
送FTP资料下载,还有QQ群、MSN群在线交流。
联系人:赵剑勇
手机:13581501210
QQ: 313638714 
MSN: jin--yong@hotmail.com
淘宝:http://shop34302523.taobao.com
CORNOR 发布于 2007-9-18 13:31:40
好贴!!顶了
关闭】 【打印
相关专题  
传感控制
AD/DA
SOPC
软件开发
接口电路
军工/航空航天
测试测量
嵌入式硬件
数控系统
汽车电子
IC设计
电源系列
工业控制
嵌入式系统
嵌入式软件
安防产品
消费电子
综合电子技术
计算机外设
CPLD/FPGA
嵌入式开发新闻
存储器
医疗电子
开发工具
通信产品

© 2007 百斯嵌入式开发网 网站地图