嵌入式 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)函数阻塞等待。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwsgwg.html