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

2008-02-23 05:32:14来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

动画显示

  动画是无所谓有,无所谓无的,静止的画面走的路多了,也就成了动画。随着时间的变更,在屏幕上显示不同的静止画面,即是动画之本质。所以,在一个嵌入式系统的LCD上欲显示动画,必须借助定时器。没有硬件或软件定时器的世界是无法想像的:

  (1) 没有定时器,一个操作系统将无法进行时间片的轮转,于是无法进行多任务的调度,于是便不再成其为一个多任务操作系统;

  (2) 没有定时器,一个多媒体播放软件将无法运作,因为他不知道何时应该转换到下一帧画面;

  (3) 没有定时器,一个网络协议将无法运转,因为其无法获知何时包传输超时并重传之,无法在特定的时间完成特定的任务。

  因此,没有定时器将意味着没有操作系统、没有网络、没有多媒体,这将是怎样的黑暗?所以,合理并灵活地使用各种定时器,是对一个软件人的最基本需求!

  在80186为主芯片的嵌入式系统中,我们需要借助硬件定时器的中断来作为软件定时器,在中断发生后变更画面的显示内容。在时间显示"xx:xx"中让冒号交替有无,每次秒中断发生后,需调用ShowDot:

  

  void ShowDot()

  {

   static BOOL bShowDot = TRUE; /* 再一次领略static关键字的威力 */

   if(bShowDot)

   {

    showChar(’:’,xPos,yPos);

   }

   else

   {

    showChar(’ ’,xPos,yPos);

   }

   bShowDot = ! bShowDot;

  }

  菜单操作

  无数人为之绞尽脑汁的问题终于出现了,在这一节里,我们将看到,在C语言中哪怕用到一丁点的面向对象思想,软件结构将会有何等的改观!

  笔者曾是个笨蛋,被菜单搞晕了,给出这样的一个系统:

  
需要以键盘上的"← →"键转换菜单焦点,当用户在焦点处于某菜单时,若敲击键盘上的OK、CANCEL键则调用该焦点菜单对应之处理函数。我曾傻傻地这样做着:

  

  /* 按下OK键 */

  void onOkKey()

  {

   /* 判断在什么焦点菜单上按下Ok键,调用相应处理函数 */

   Switch(currentFocus)

   {

    case MENU1:

     menu1OnOk();

     break;

    case MENU2:

     menu2OnOk();

     break;

    …

   }

  }

  /* 按下Cancel键 */

  void onCancelKey()

  {

   /* 判断在什么焦点菜单上按下Cancel键,调用相应处理函数 */

   Switch(currentFocus)

   {

    case MENU1:

     menu1OnCancel();

     break;

    case MENU2:

     menu2OnCancel();

     break;

    …

   }

  }

  终于有一天,我这样做了:

  

  /* 将菜单的属性和操作"封装"在一起 */

  typedef struct tagSysMenu

  {

   char *text; /* 菜单的文本 */

   BYTE xPos; /* 菜单在LCD上的x坐标 */

   BYTE yPos; /* 菜单在LCD上的y坐标 */

   void (*onOkFun)(); /* 在该菜单上按下ok键的处理函数指针 */

   void (*onCancelFun)(); /* 在该菜单上按下cancel键的处理函数指针 */

  }SysMenu, *LPSysMenu;

  当我定义菜单时,只需要这样:

  

  static SysMenu menu[MENU_NUM] =

  {

   {

    "menu1", 0, 48, menu1OnOk, menu1OnCancel

   }

   ,

   {

    " menu2", 7, 48, menu2OnOk, menu2OnCancel

   }

   ,

   {

    " menu3", 7, 48, menu3OnOk, menu3OnCancel

   }

   ,

   {

    " menu4", 7, 48, menu4OnOk, menu4OnCancel

   }

   …

  };

  OK键和CANCEL键的处理变成:

  

  /* 按下OK键 */

  void onOkKey()

  {

   menu[currentFocusMenu].onOkFun();

  }

  /* 按下Cancel键 */

  void onCancelKey()

  {

   menu[currentFocusMenu].onCancelFun();

  }

  程式被大大简化了,也开始具备很好的可扩展性!我们仅仅利用了面向对象中的封装思想,就让程式结构清楚,其结果是几乎能够在无需修改程式的情况下在系统中添加更多的菜单,而系统的按键处理函数保持不变。

  面向对象,真神了!



标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

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

下一篇: 嵌入式程式设计中C/C 代码的优化

热门词条
热门标签