英创信息技术ARM9 Linux智能终端菜单界面设计介绍

描述

  低成本的单色LCD在工业领域应用非常广泛,英利公司提供的基于嵌入式Linux平台的EM9160支持外接单色LCD屏,目前应用得比较多的规格包括有LCD320x240、LCD240x128、LCD128x64、LCD160x160等。在实际应用中有许多对于菜单界面操作的需求,需要客户根据应用的具体要求自行构建菜单显示界面,本文将重点介绍这方面的内容。

  基于菜单界面操作过程实质一个简单的交互式操作,需要实时响应键盘消息、定时消息等。嵌入式Linux操作系统是一个实时多任务系统,可以利用多线程的方式来实现各个应用请求的响应。在本案例是通过创建多个线程的方式来实现对于键盘、定时任务的实时响应,从而实现对于菜单界面的操作。

  下面分两个部分来介绍该例程:

  1、应用程序框架

  为了便于程序的设计和管理,利用了Linux多任务的编程优势,利用内核的任务调度机制,采用面向对象的C++编程将各个应用功能模块化。在该例程中需要实现的响应功能:键盘和定时任务的响应,在应用程序中通过创建两个线程来实现。

  在该程序例程中main(…)函数,首先进行初始化操作,包括对于LCD屏的初始化、菜单界面的初始化操作等;然后是创建键盘处理线程、再进入主线程,主线程的功能主要是处理定时任务,在本方案中实现的是定时显示界面刷新。如下图所示:

  Linux

  // LCD显示屏的初始化操作

  i1 = LCD_Init( LCD_160160 );

  if( i1《0 )

  {

  printf( ‘LCD Init fail!\n’ );

  }

  LCD_LoadSmallFnt( );

  LCD_SetMode( 1 ); // set to XOR mode

  LCD_SetFont( 12 ); // 设置汉字显示为12点阵模式

  // 加载缺省菜单界面

  status = MenuManager.LoadMenu( );

  if( status 《 0 )

  {

  printf( ‘status=%d\n’, status);

  return status;

  }

  MenuManager.Show( );

  MenuManager.Update();

  // 打开键盘设备,并启动键盘处理线程

  KeyManager.Open( );

  for( ExitFlag=0; ; )

  {

  if( ExitFlag )

  {

  break;

  }

  // 延时1S 执行一次显示刷新操作

  sleep( 1 );

  MenuManager.Update( );

  }

  // 关闭键盘设备,并卸载键盘处理线程

  KeyManager.Close( );

  LCD_DeInit( );

  return 0;

  其中的主线程很简单,只是定时处理的任务,直接调用sleep(1)函数阻塞等待。

  键盘处理线程主要检查是否有键按下,一旦有键按下则读取相应的键码值,并作相应的响应处理。当一个键按下时,EM9160内核中的键盘驱动程序将得到的有效键码存储在内部的缓冲区中,应用程序可直接通过read函数读取键码。

  应用程序打开矩阵键盘驱动程序的方法还是打开相应的设备文件,如下:

  key_fd = open(‘/dev/em9x60_keypad’, O_RDONLY | O_NONBLOCK);

  以下为读取键码值并作相应的处理代码:

  FD_ZERO(&fs_read);

  FD_SET(key_fd,&fs_read);

  time.tv_sec = 0;

  time.tv_usec = 100000; //timeout = 100ms

  fs_sel = select(key_fd+1, &fs_read, NULL, NULL, &time);

  if(fs_sel)

  {

  //data available, so get it!

  len = read(key_fd, &KeyCode, sizeof(KeyCode));

  if(len 》 0)

  {

  //printf(‘len=%d KeyCode= 0x%x\r\n’, len, KeyCode);

  switch( KeyCode )

  {

  case 0x011b:

  KeyCmd = ESC;

  MenuManager.Key_ESC( );

  break;

  case 0x1c0d:

  KeyCmd = ENTER;

  MenuManager.Key_ENTER( );

  break;

  case 0x0635:

  KeyCmd = UP;

  MenuManager.Key_SHIFT( 1 );

  break;

  case 0x0938:

  KeyCmd = DOWN;

  MenuManager.Key_SHIFT( 0 );

  break;

  case 0x0837:

  KeyCmd = LEFT;

  break;

  case 0x0939:

  KeyCmd = RIGHT;

  break;

  }

  }

  }

  2、菜单界面设计

  在本例程中主要是针对一个基于LCD160x160显示终端所设计的二级菜单显示界面,功能键有六个:Key_ESC、Key_Enter以及Key_UP、Key_Down、Key_Left、Key_Right键,通过Key_UP、Key_Down键选择菜单项,Key_Enter确认键来进入下一级,Key_ESC返回上一级菜单。

  菜单的显示和管理是通过C++方式来实现,Class Item定义菜单中各个菜单项的显示特性以及操作特性;Class Menu定义了菜单的特性,其中包含又对于菜单中各个菜单项管理的功能;Class MenuManager是一个菜单管理类,这个类实现了对于各个菜单的管理和操作特性,相当于一个人机交互界面的功能。它们定义分别在 Item.h Menu.h文件中。

  为了增加菜单设计的灵活性,对于各个菜单界面的显示内容采用了读取配置文件的方式,即在配置文件中定义各个菜单的显示名称和显示位置,如:

  // item的类型 显示名称 X位置 Y位置 下一级菜单名称

  item=101 D1 0 0

  item=100 D0 100 0

  item=301 测量点数据显示 0 32 menu1

  item=301 参数设置与查看 0 48 menu2

  item=301 终端管理与维护 0 64 menu3

  根据该配置文件所形成的显示菜单如下:

  Linux

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分