打印
[ZLG-ARM]

ARM9 嵌入式Linux智能终端菜单界面程序设计

[复制链接]
2180|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
高亮登录|  楼主 | 2012-1-17 17:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
低成本的单色LCD在工业领域应用非常广泛,英利公司提供的基于嵌入式Linux平台的EM9160支持外接单色LCD屏,目前应用得比较多的规格包括有LCD320x240、LCD240x128、LCD128x64、LCD160x160等。在实际应用中有许多对于菜单界面操作的需求,需要客户根据应用的具体要求自行构建菜单显示界面,本文将重点介绍这方面的内容。         基于菜单界面操作过程实质一个简单的交互式操作,需要实时响应键盘消息、定时消息等。嵌入式Linux操作系统是一个实时多任务系统,可以利用多线程的方式来实现各个应用请求的响应。在本案例是通过创建多个线程的方式来实现对于键盘、定时任务的实时响应,从而实现对于菜单界面的操作。
        下面分两个部分来介绍该例程:
1、应用程序框架
        为了便于程序的设计和管理,利用了Linux多任务的编程优势,利用内核的任务调度机制,采用面向对象的C++编程将各个应用功能模块化。在该例程中需要实现的响应功能:键盘和定时任务的响应,在应用程序中通过创建两个线程来实现。
        在该程序例程中main(…)函数,首先进行初始化操作,包括对于LCD屏的初始化、菜单界面的初始化操作等;然后是创建键盘处理线程、再进入主线程,主线程的功能主要是处理定时任务,在本方案中实现的是定时显示界面刷新。如下图所示:
        // 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;
                        }
                }
        }

相关帖子

沙发
高亮登录|  楼主 | 2012-1-17 17:55 | 只看该作者
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

        根据该配置文件所形成的显示菜单如下:
        本文中所介绍的例程仅仅适用于英利EM9160嵌入式工控板,均有源码提供。感兴趣的客户可以发邮件到公司技术支持邮箱 support@emlinix.com索取相关代码。

使用特权

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

本版积分规则

0

主题

117

帖子

1

粉丝