十年之前,随着NXP带内置LCD控制器系列LPC的推出,emWin成了当年的“流量小鲜肉”。如今,MCU越做越高端,GUI应用越来越多,GUI软件也如雨后春笋般涌现,emWin变成“老腊肉”了。而且,乍看也会觉得这个话题“如何实现按键窗体消息响应”,很基础很简单呢——是很基础但或许并不如想象那么简单。
emWin是一款由Segger公司提供的,用于嵌入式系统的GUI(图形用户界面)软件。它是属于中间件,即不依赖于处理器和显示控制器。
在我们提供的有内置LCD控制器的MCU的SDK中,都提供了emWin的例程。
emWin是可根据应用需求配置搭建的。且配套提供了些小工具,比如图形转C文件,可视化开发工具等等……
本文介绍内容和窗体管理有关,而emWin的窗体管理基本框架是窗体消息处理机制,简单说,就是某个窗体内的事务处理,都是将各个事件作为窗体消息来响应执行,比如,本文要聊的按键响应。
先问问各位,上图是不是就是本文要介绍的“按键”呢?—— 非也。
虽然点击屏幕上按钮的交互更“时尚”,但是不少产品也提供了外部按键来结合GUI窗体进行人机交互。
这可通过emWin提供的以下API:
GUI_SendKeyMsg(int Key, int Pressed)来进行。它的参数定义如下:
参数 |
描述 |
Key |
可以是自定义的任何按键码;也可以是emWin默认的 |
Pressed |
按键状态。 |
1:按下状态;
0:释放状态
其中的按键码正是来自硬件驱动层,这个emWin API和硬件驱动层接口,驱动层扫描到按键事件,获取到按键码,即可赋给Key参数,通过此API将按键消息传递给窗体。
static void WinCallback(WM_MESSAGE* pMsg)
{
WM_KEY_INFO* key_flag;
switch (pMsg->MsgId)
{
case WM_CREATE:
{
……
}
break;
case WM_PAINT:
{
……
}
break;
case WM_KEY:
{
key_flag = (WM_KEY_INFO * )(pMsg->Data.p);
{
switch(key_flag->PressedCnt)
{ /*注:对应于由GUI_SendKeyMsg()传递的按键状态*/
case 0:
{
}
break;
case 1: /*按下状态*/
switch(key_flag->Key) /*以下响应各个按键事件消息*/
{
case KEY_CODE1:
{
/*对按键码KEY_CODE1进行处理*/
}
…… (以下省略)
实际上,以上对外部按键的窗体消息响应实现方法,同样适用于其他类似的外部输入事件,比如旋钮的实现方法也一样,在硬件驱动层获取到旋钮码值后,通过以上方式传递和响应处理。
评论