[STM32F4] 【STM32F469I试用】+emWin实战应用①LED控制界面

[复制链接]
 楼主| 湛只为无双 发表于 2016-1-14 14:50 | 显示全部楼层 |阅读模式
本帖最后由 湛只为无双 于 2016-1-14 15:42 编辑

首先给大家展示实际的效果图。这个是进入界面的截图:
Screen08.bmp

当点击上面的三个LED方框时,能够更改LED灯的状态:
Screen10.bmp
当点击下面的滑块的时候,会禁止上面的方框,并且以一定频率进行三个流水灯:
Screen09.bmp
那么在这个里面所设计的STemWin界面就是这样的了:
①、首先先设定好默认的字库,字库的底层驱动请看我之前的一片帖子,里面有相关的介绍和移植,在这个帖子里我也会给出我的工程源码和HEX文件供大家参考。
  1. FRAMEWIN_SetDefaultTextAlign(GUI_TA_VCENTER|GUI_TA_CENTER);
  2. FRAMEWIN_SetDefaultFont(&GUI_FontHZ16);
  3. BUTTON_SetDefaultFont(&GUI_FontHZ16);
  4. DROPDOWN_SetDefaultFont(&GUI_FontHZ16);
  5. TEXT_SetDefaultFont(&GUI_FontHZ16);
②、使用GUI_CreateDialogBox创建所需要的界面各个元素,函数的调用为:
  1. LED2=1;LED3=1;LED4=1;
其中_aDialogLEDCreate的常量定义为:
  1. static const GUI_WIDGET_CREATE_INFO _aDialogLEDCreate[] = {
  2.     { FRAMEWIN_CreateIndirect,  "LED控制界面设计",    0,                       0,  0,  800,480,0,0},
  3.     { CHECKBOX_CreateIndirect,  "LED2",              GUI_ID_CHECK0,           380,106,78, 16, 0,0},
  4.     { CHECKBOX_CreateIndirect,  "LED3",              GUI_ID_CHECK1,           380,160,78, 16, 0,0},
  5.     { CHECKBOX_CreateIndirect,  "LED4",              GUI_ID_CHECK2,           380,214,78, 16, 0,0},
  6.     { SLIDER_CreateIndirect,     NULL,               GUI_ID_SLIDER0,          240,300,395,43, 0,0}
  7. };
固定的常量定义有了各个控件的相关说明。
③、在创建对话框的时候包含有对话框的回调函数,回调函数才是本次设计的重点,回调函数完成了对话框的初始化:
  1. /*****************************************************************
  2. **      FunctionName:void InitDialog(WM_MESSAGE * pMsg)
  3. **      Function: to initialize the Dialog items
  4. **                                                      
  5. **      call this function in _cbCallback --> WM_INIT_DIALOG
  6. *****************************************************************/

  7. static void InitDialog(WM_MESSAGE * pMsg)
  8. {
  9.     WM_HWIN hWin = pMsg->hWin;
  10.     //
  11.     //FRAMEWIN
  12.     //
  13.     FRAMEWIN_AddCloseButton(hWin, FRAMEWIN_BUTTON_RIGHT, 0);
  14.     //
  15.     //GUI_ID_CHECK0
  16.     //
  17.     CHECKBOX_SetText(WM_GetDialogItem(hWin,GUI_ID_CHECK0),"LED2");
  18.     //
  19.     //GUI_ID_CHECK1
  20.     //
  21.     CHECKBOX_SetText(WM_GetDialogItem(hWin,GUI_ID_CHECK1),"LED3");
  22.     //
  23.     //GUI_ID_CHECK2
  24.     //
  25.     CHECKBOX_SetText(WM_GetDialogItem(hWin,GUI_ID_CHECK2),"LED4");
  26.     //
  27.     //GUI_ID_SLIDER0
  28.     //
  29.     SLIDER_SetRange(WM_GetDialogItem(hWin,GUI_ID_SLIDER0),10,200);
  30.     SLIDER_SetValue(WM_GetDialogItem(hWin,GUI_ID_SLIDER0),10);

  31. }

  32. /*********************************************************************
  33. *
  34. *       Dialog callback routine
  35. */
  36. static void _cbLEDCallback(WM_MESSAGE * pMsg)
  37. {
  38.     int NCode, Id;
  39.     WM_HWIN hWin = pMsg->hWin;
  40.         WM_HWIN hItem;
  41.         int v,i;
  42.     switch (pMsg->MsgId)
  43.     {
  44.         case WM_INIT_DIALOG:
  45.             InitDialog(pMsg);
  46.             break;
  47.         case WM_NOTIFY_PARENT:
  48.             Id = WM_GetId(pMsg->hWinSrc);
  49.             NCode = pMsg->Data.v;        
  50.             switch (Id)
  51.             {
  52.                                 case GUI_ID_CHECK0:
  53.                     switch(NCode)
  54.                     {
  55.                         case WM_NOTIFICATION_RELEASED:
  56.                                                         LED2^=1;
  57.                             break;
  58.                     }
  59.                     break;
  60.                 case GUI_ID_CHECK1:
  61.                     switch(NCode)
  62.                     {
  63.                         case WM_NOTIFICATION_RELEASED:
  64.                             LED3^=1;
  65.                                                         break;
  66.                     }
  67.                     break;
  68.                 case GUI_ID_CHECK2:
  69.                     switch(NCode)
  70.                     {
  71.                         case WM_NOTIFICATION_RELEASED:
  72.                             LED4^=1;
  73.                                                         break;
  74.                     }
  75.                     break;
  76.                 case GUI_ID_SLIDER0:
  77.                     switch(NCode)
  78.                     {
  79.                         case WM_NOTIFICATION_RELEASED:
  80.                             hItem = WM_GetDialogItem(pMsg->hWin, GUI_ID_SLIDER0);
  81.                                                         v = SLIDER_GetValue(hItem);
  82.                                                         WM_DisableWindow(WM_GetDialogItem(pMsg->hWin, GUI_ID_CHECK0));
  83.                                                         WM_DisableWindow(WM_GetDialogItem(pMsg->hWin, GUI_ID_CHECK1));
  84.                                                         WM_DisableWindow(WM_GetDialogItem(pMsg->hWin, GUI_ID_CHECK2));
  85.                                                         WM_DisableWindow(hItem);
  86.                                                        
  87.                                                         i=10;
  88.                                                         while(i--)
  89.                                                         {
  90.                                                                 LED2=0;
  91.                                                                 GUI_Delay(v);
  92.                                                                 LED2=1;
  93.                                                                 LED3=0;
  94.                                                                 GUI_Delay(v);
  95.                                                                 LED3=1;
  96.                                                                 LED4=0;
  97.                                                                 GUI_Delay(v);
  98.                                                                 LED4=1;
  99.                                                         }
  100.                                                        
  101.                                                         WM_EnableWindow(hItem);
  102.                                                         WM_EnableWindow(WM_GetDialogItem(pMsg->hWin, GUI_ID_CHECK0));
  103.                                                         WM_EnableWindow(WM_GetDialogItem(pMsg->hWin, GUI_ID_CHECK1));
  104.                                                         WM_EnableWindow(WM_GetDialogItem(pMsg->hWin, GUI_ID_CHECK2));
  105.                                                         LED2=1;LED3=1;LED4=1;
  106.                                                         CHECKBOX_SetState(WM_GetDialogItem(pMsg->hWin, GUI_ID_CHECK0),0);
  107.                                                         CHECKBOX_SetState(WM_GetDialogItem(pMsg->hWin, GUI_ID_CHECK1),0);
  108.                                                         CHECKBOX_SetState(WM_GetDialogItem(pMsg->hWin, GUI_ID_CHECK2),0);
  109.                                                         break;
  110.                     }
  111.                     break;
  112.             }
  113.             break;
  114.         default:
  115.             WM_DefaultProc(pMsg);
  116.     }
  117. }
重点需要看的是,对话框的初始化函数里面所声明的内容:
  1. //
  2. //FRAMEWIN
  3. //
  4. FRAMEWIN_AddCloseButton(hWin, FRAMEWIN_BUTTON_RIGHT, 0);
  5. //
  6. //GUI_ID_CHECK0
  7. //
  8. CHECKBOX_SetText(WM_GetDialogItem(hWin,GUI_ID_CHECK0),"LED2");
  9. //
  10. //GUI_ID_CHECK1
  11. //
  12. CHECKBOX_SetText(WM_GetDialogItem(hWin,GUI_ID_CHECK1),"LED3");
  13. //
  14. //GUI_ID_CHECK2
  15. //
  16. CHECKBOX_SetText(WM_GetDialogItem(hWin,GUI_ID_CHECK2),"LED4");
  17. //
  18. //GUI_ID_SLIDER0
  19. //
  20. SLIDER_SetRange(WM_GetDialogItem(hWin,GUI_ID_SLIDER0),10,200);
  21. SLIDER_SetValue(WM_GetDialogItem(hWin,GUI_ID_SLIDER0),10);
首先是对Framewin添加关闭按钮,并且设置关闭按钮在右侧,然后一次设置CHECKBOX的文本内容,最后设置滑块的范围和初始值的大小。
④、对话框对外界触发事件的响应过程:
当用户释放了CHECKBOX方框和滑块以后,要进行对应的响应工作。
其中第一个是对CHECKBOX的响应:当每次检测到用户对控件进行操作中,对CHECKBOX释放过程后,根据对应的不同控件完成LED的翻转操作,也就是实现了对LED灯的控制作用,这是最简单的STemWin应用。
  1. case GUI_ID_CHECK0:
  2.         switch(NCode)
  3.         {
  4.                 case WM_NOTIFICATION_RELEASED:
  5.                         LED2^=1;
  6.                         break;
  7.         }
  8.         break;
  9. case GUI_ID_CHECK1:
  10.         switch(NCode)
  11.         {
  12.                 case WM_NOTIFICATION_RELEASED:
  13.                         LED3^=1;
  14.                         break;
  15.         }
  16.         break;
  17. case GUI_ID_CHECK2:
  18.         switch(NCode)
  19.         {
  20.                 case WM_NOTIFICATION_RELEASED:
  21.                         LED4^=1;
  22.                         break;
  23.         }
  24.         break;

另外一个响应是对滑块释放的操作,在对滑块释放后,首先获取到滑块释放后的所对应的数值大小,然后禁用上面的三个CHECKBOX和滑块自身,然后根据GUI_Delay();操作延时,进行流水灯的闪烁,其中延时的大小是由滑块的数值所决定的。在流水灯循环10次以后,使能三个CHECKBOX控件和滑块控件,恢复LED状态为熄灭,并将CHECKBOX的状态设置为0。这样完成了一次自动化的操作,输入对STemWin控件的高级应用。
  1. case GUI_ID_SLIDER0:
  2.         switch(NCode)
  3.         {
  4.                 case WM_NOTIFICATION_RELEASED:
  5.                         hItem = WM_GetDialogItem(pMsg->hWin, GUI_ID_SLIDER0);
  6.                         v = SLIDER_GetValue(hItem);
  7.                         WM_DisableWindow(WM_GetDialogItem(pMsg->hWin, GUI_ID_CHECK0));
  8.                         WM_DisableWindow(WM_GetDialogItem(pMsg->hWin, GUI_ID_CHECK1));
  9.                         WM_DisableWindow(WM_GetDialogItem(pMsg->hWin, GUI_ID_CHECK2));
  10.                         WM_DisableWindow(hItem);
  11.                        
  12.                         i=10;
  13.                         while(i--)
  14.                         {
  15.                                 LED2=0;
  16.                                 GUI_Delay(v);
  17.                                 LED2=1;
  18.                                 LED3=0;
  19.                                 GUI_Delay(v);
  20.                                 LED3=1;
  21.                                 LED4=0;
  22.                                 GUI_Delay(v);
  23.                                 LED4=1;
  24.                         }
  25.                        
  26.                         WM_EnableWindow(hItem);
  27.                         WM_EnableWindow(WM_GetDialogItem(pMsg->hWin, GUI_ID_CHECK0));
  28.                         WM_EnableWindow(WM_GetDialogItem(pMsg->hWin, GUI_ID_CHECK1));
  29.                         WM_EnableWindow(WM_GetDialogItem(pMsg->hWin, GUI_ID_CHECK2));
  30.                         LED2=1;LED3=1;LED4=1;
  31.                         CHECKBOX_SetState(WM_GetDialogItem(pMsg->hWin, GUI_ID_CHECK0),0);
  32.                         CHECKBOX_SetState(WM_GetDialogItem(pMsg->hWin, GUI_ID_CHECK1),0);
  33.                         CHECKBOX_SetState(WM_GetDialogItem(pMsg->hWin, GUI_ID_CHECK2),0);
  34.                         break;
  35.         }
  36.         break;
最后就完成了第一个很简单的设计,功能简单,便于坛友们进一步学习STemWin的操作。





 楼主| 湛只为无双 发表于 2016-1-14 14:50 | 显示全部楼层
本帖最后由 湛只为无双 于 2016-1-14 16:03 编辑

这一层公布相关工程源码,基于keil5.15的IDE:
STM32F469_DemoPublic.zip (4.52 MB, 下载次数: 134)
然后是可以直接下载的HEX文件:
HEX文件_使用ST-LINK Utility v3.8.0下载.zip (1.57 MB, 下载次数: 30) 以及视频演示程序,包含有全部的演示过程,后续的几个例子,源码中同样也包含有。

 楼主| 湛只为无双 发表于 2016-1-14 14:52 | 显示全部楼层
占楼 稍后编辑 稍后编辑   
294479435 发表于 2016-10-15 14:56 | 显示全部楼层
很厉害啊,我看了楼主代码,没有找到LCD显示驱动呢,望指教
西街耳呦 发表于 2017-5-8 19:57 | 显示全部楼层
楼主,我的屏幕显示怎么部分乱码,求楼主指教
无标题.png
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

171

帖子

9

粉丝
快速回复 在线客服 返回列表 返回顶部