手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>C/C++>列表

C语言嵌入式系统编程之屏幕操作 (1)

来源:互联网 作者:west263.com 时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!
汉字处理

  现在要解决的问题是,嵌入式系统中经常要使用的并非是完整的汉字库,往往只是需要提供数量有限的汉字供必要的显示功能。例如,一个微波炉的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}

  }

  }

  要显示特定汉字的时候,只需要从数组中查找内码和需要汉字内码相同的即可获得字模。假如前面的汉字在数组中以内码大小顺序排列,那么能够以二分查找法更高效的查找到汉字的字模。

  这是一种很有效的组织小汉字库的方法,他能够确保程式有很好的结构。

  系统时间显示

  从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具备了更加强大的威力,他使得某些数据和函数脱离"对象"而成为"类"的一部分,正是他的这一特点,成就了软件的无数优秀设计。



文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

热点关注
IDC资讯 虚拟主机 域名注册 托管租用 vps主机 智能建站
网站运营 建站经验 策划盈利 搜索优化 网站推广 免费资源
网站联盟 联盟新闻 联盟介绍 联盟点评 网赚技巧
行业资讯 业界动态 搜索引擎 网络游戏 门户动态 电子商务 广告传媒
网络编程 Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术 Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷 Internet Explorer
网页制作 FrontPages Dreamweaver Javascript css photoshop fireworks Flash
程序设计 Java技术 C/C++ VB delphi
网络知识 网络协议 网络安全 网络管理 组网方案 Cisco技术
操作系统 Win2000 WinXP Win2003 Mac OS Linux FreeBSD
返回首页 |关于我们 | 联系我们 | 付款方式 | 创业联盟 | 价格总览 | 资讯中心 | 友情链接 | 网站地图 | 招贤纳士 | RSS