低成本的单色LCD构建菜单界面的方案介绍

低成本的单色lcd在工业领域应用非常广泛,英创公司提供的基于wince平台的em9x60系列板卡均支持外接单色lcd屏,目前应用得比较多的规格包括有lcd320x240、lcd240x128、lcd128x64等。在实际应用中有许多对于菜单界面操作的需求,由于em9x60系列板没有支持标准的windows桌面显示,因此应用程序无法直接利用windowsce的窗口界面、或者基于mfc的对话框作为应用程序的操作界面,而是需要客户根据应用的具体要求自行构建菜单界面,本文将重点介绍这方面的内容。
基于菜单界面操作过程实质一个简单的交互式操作,需要实时响应键盘消息、定时消息等。wince操作系统内部具备有完善的消息处理机制,来实现应用请求消息的实时响应。因此本案例是一个具有windows风格的应用例程,通过窗口的消息传递来实现对于键盘、定时任务的实时响应,从而实现对于菜单界面的操作。
下面分两个部分来介绍该例程:
1、应用程序框架
在windows下进行窗口应用程序编程的优点,程序只对操作系统发给它的通知进行响应,比如收到键盘被按下、定时任务等,而不需要应用程序不断地查询窗口的请求输入。在支持单色lcd的wince系统下也是如此,操作系统在有输入发生时会通知应用程序,操作系统是通过发送消息到应用程序窗口的方式来完成这个通知,虽然该“应用程序窗口”无法正常显示,但是可以通过它来完成消息的传递。本例程采用传统的windows窗口应用程序编程的框架,以方便实现对于外界请求输入的响应,从而实现在单色lcd上菜单界面的操作显示。
在该程序例程中winmain(…)函数也是按照窗口应用程序的过程,首先进行初始化操作,包括对于lcd屏的初始化、菜单界面的初始化操作、加载矩阵键盘驱动等操作;然后是创建窗口;再进入消息循环。如下图所示:
// lcd初始化操作以及加载缺省的菜单界面
i1 = lcd_init( lcd_12864 );
lcd_loadsmallfnt( );
lcd_setmode( 1 ); // set to xor mode
status = menumanager.loadmenu( );
if( status < 0 ) return status;
menumanager.show( );
// 激活基于em9x60板卡isa的矩阵键盘驱动
hdevice = activatedevice( text('drivers\\isa_keypad'), 0);
// 初始化本程序实例,主要是创建窗口等工作
hwndmain = initinstance( hinstance, lpcmdline, ncmdshow );
if( hwndmain == 0 )
return 0x10;// init fail!
// 设置定时器的时间间隔为2秒
settimer( hwndmain, 1, 2000, null );
// 应用程序消息循环
while( getmessage( &msg, null, 0, 0 ) )
{
translatemessage( &msg );
dispatchmessage( &msg );
}
killtimer( hwndmain, 1 );
lcd_unloadsmallfnt( );
其中的消息循环为主线程,循环很简单,调用getmessage函数,从应用程序的消息队列中取得一条来自系统的消息,如果没有消息到来,这个函数就是处于等待状态,相当于这个应用主线程就被阻塞直到消息到来。
菜单例程中响应的系统消息包括:键盘消息(wm_keyup)和定时消息(wm_timer),wince和windows标准系统一样使用了相同的键盘消息处理方式。当一个键按下时,通常是以wm_keydown消息起始,如果按下的键代表一个字符,比如一个字母或数字,在wm_keydown之后还会发送一个wm_char消息,当键被释放时,最终的wm_keyup消息被发送,在这些消息的参数wparam指示了按下键的虚拟键值。为了简化程序,在此例程中对于按键的响应,是等到按键释放的时候,也就是说应用程序只响应wm_keyup消息。定时消息则可以通过函数settimer( … )来实现,该函数同时也设置了定时事件、以及定时间隔。
消息的响应是通过定义mainmessage表格,将消息值和消息处理例程函数关联起来。如:
const struct decodeuint mainmessages[] =
{
{ wm_keyup, dokeysmain },
{ wm_timer, dotimermain },
{ wm_destroy, dodestroymain }
};
// 键盘消息wm_keyup ..处理函数
lresult dokeysmain( hwnd hwnd, uint wmsg, wparam wparam, lparam lparam )
{
switch( wparam )
{
case 0x33:// 移动键
menumanager.key_shift( );
break;
case 0x36:// 确认键
menumanager.key_enter( );
break;
}
return 0;
}
// 定时消息wm_timer处理函数
lresult dotimermain( hwnd hwnd, uint wmsg, wparam wparam, lparam lparam )
{
menumanager.update( );
return 0;
}
2、菜单界面设计
在本例程中主要是针对一个基于lcd128x64显示终端所设计的二级菜单显示界面,功能键有两个:移动键(key_shift)和确认键(key_enter),通过移动键选择菜单项,确认键来进入下一级,或者返回上一级菜单。
菜单的显示和管理是通过c++方式来实现,class item定义菜单中各个菜单项的显示特性以及操作特性;class menu定义了菜单的特性,其中包含又对于菜单中各个菜单项管理的功能;class menumanager是一个菜单管理类,这个类实现了对于各个菜单的管理和操作特性,相当于一个人机交互界面的功能。它们定义分别在 item.h menu.h文件中。
为了增加菜单设计的灵活性,对于各个菜单界面的显示内容采用了读取配置文件的方式,即在配置文件中定义各个菜单的显示名称和显示位置,如:
// item的类型 显示名称 x位置 y位置 下一级菜单名称
item=301 终端参数 0 0 menu1
item=301 实时数据 0 16 menu2
item=301 终端状态 0 32 menu3
item=301 显示配置 0 48 menu4
item=301 扩展菜单 64 0 menu5
item=301 扩展菜单 64 16 menu6
item=301 扩展菜单 64 32 menu7
item=301 扩展菜单 64 48 menu8
根据该配置文件所形成的菜单如下:

青桔单车逆袭:青桔单车三年成全国第一,如何持续C位
亚马逊宣布与Anthropic展开战略合作,共同推进生成式AI发展
Heyue贴片电解电容125℃车用系列的介绍
如何避免PCB板上操作过程中引起的机械裂纹
一文告诉你这20家企业为什么来光亚展?
低成本的单色LCD构建菜单界面的方案介绍
导线精灵——导线覆冰智能识别监测装置
工业以太网协议与应用关键技术
vivo APEX 2020有哪些值得期待的地方
VOC和PM2.5传感器对睡眠的帮助
人工智能技术的进程能否加快,可编程芯片才是关键
JPEG2000核心算法的研究及DSP实现
三星A40s全面评测 续航能力在整个手机界中是数一数二的水平
压力变送器的现场标定测试
车刀的实验
TI开发出一系列全集成式SAR型ADC
免费换电的猛犸电动已入驻深圳海岸城
创想三维新品首发 Ender-3 Max核心技术全面升级
一文分享OCS实现方法
再创新高!华为数据中心交换机市场份额43.85%,蝉联第一!