打印
[STM32F4]

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

[复制链接]
4175|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 湛只为无双 于 2016-1-14 15:42 编辑

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


当点击上面的三个LED方框时,能够更改LED灯的状态:

当点击下面的滑块的时候,会禁止上面的方框,并且以一定频率进行三个流水灯:

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

static void InitDialog(WM_MESSAGE * pMsg)
{
    WM_HWIN hWin = pMsg->hWin;
    //
    //FRAMEWIN
    //
    FRAMEWIN_AddCloseButton(hWin, FRAMEWIN_BUTTON_RIGHT, 0);
    //
    //GUI_ID_CHECK0
    //
    CHECKBOX_SetText(WM_GetDialogItem(hWin,GUI_ID_CHECK0),"LED2");
    //
    //GUI_ID_CHECK1
    //
    CHECKBOX_SetText(WM_GetDialogItem(hWin,GUI_ID_CHECK1),"LED3");
    //
    //GUI_ID_CHECK2
    //
    CHECKBOX_SetText(WM_GetDialogItem(hWin,GUI_ID_CHECK2),"LED4");
    //
    //GUI_ID_SLIDER0
    //
    SLIDER_SetRange(WM_GetDialogItem(hWin,GUI_ID_SLIDER0),10,200);
    SLIDER_SetValue(WM_GetDialogItem(hWin,GUI_ID_SLIDER0),10);

}

/*********************************************************************
*
*       Dialog callback routine
*/
static void _cbLEDCallback(WM_MESSAGE * pMsg)
{
    int NCode, Id;
    WM_HWIN hWin = pMsg->hWin;
        WM_HWIN hItem;
        int v,i;
    switch (pMsg->MsgId)
    {
        case WM_INIT_DIALOG:
            InitDialog(pMsg);
            break;
        case WM_NOTIFY_PARENT:
            Id = WM_GetId(pMsg->hWinSrc);
            NCode = pMsg->Data.v;        
            switch (Id)
            {
                                case GUI_ID_CHECK0:
                    switch(NCode)
                    {
                        case WM_NOTIFICATION_RELEASED:
                                                        LED2^=1;
                            break;
                    }
                    break;
                case GUI_ID_CHECK1:
                    switch(NCode)
                    {
                        case WM_NOTIFICATION_RELEASED:
                            LED3^=1;
                                                        break;
                    }
                    break;
                case GUI_ID_CHECK2:
                    switch(NCode)
                    {
                        case WM_NOTIFICATION_RELEASED:
                            LED4^=1;
                                                        break;
                    }
                    break;
                case GUI_ID_SLIDER0:
                    switch(NCode)
                    {
                        case WM_NOTIFICATION_RELEASED:
                            hItem = WM_GetDialogItem(pMsg->hWin, GUI_ID_SLIDER0);
                                                        v = SLIDER_GetValue(hItem);
                                                        WM_DisableWindow(WM_GetDialogItem(pMsg->hWin, GUI_ID_CHECK0));
                                                        WM_DisableWindow(WM_GetDialogItem(pMsg->hWin, GUI_ID_CHECK1));
                                                        WM_DisableWindow(WM_GetDialogItem(pMsg->hWin, GUI_ID_CHECK2));
                                                        WM_DisableWindow(hItem);
                                                       
                                                        i=10;
                                                        while(i--)
                                                        {
                                                                LED2=0;
                                                                GUI_Delay(v);
                                                                LED2=1;
                                                                LED3=0;
                                                                GUI_Delay(v);
                                                                LED3=1;
                                                                LED4=0;
                                                                GUI_Delay(v);
                                                                LED4=1;
                                                        }
                                                       
                                                        WM_EnableWindow(hItem);
                                                        WM_EnableWindow(WM_GetDialogItem(pMsg->hWin, GUI_ID_CHECK0));
                                                        WM_EnableWindow(WM_GetDialogItem(pMsg->hWin, GUI_ID_CHECK1));
                                                        WM_EnableWindow(WM_GetDialogItem(pMsg->hWin, GUI_ID_CHECK2));
                                                        LED2=1;LED3=1;LED4=1;
                                                        CHECKBOX_SetState(WM_GetDialogItem(pMsg->hWin, GUI_ID_CHECK0),0);
                                                        CHECKBOX_SetState(WM_GetDialogItem(pMsg->hWin, GUI_ID_CHECK1),0);
                                                        CHECKBOX_SetState(WM_GetDialogItem(pMsg->hWin, GUI_ID_CHECK2),0);
                                                        break;
                    }
                    break;
            }
            break;
        default:
            WM_DefaultProc(pMsg);
    }
}
重点需要看的是,对话框的初始化函数里面所声明的内容:
//
//FRAMEWIN
//
FRAMEWIN_AddCloseButton(hWin, FRAMEWIN_BUTTON_RIGHT, 0);
//
//GUI_ID_CHECK0
//
CHECKBOX_SetText(WM_GetDialogItem(hWin,GUI_ID_CHECK0),"LED2");
//
//GUI_ID_CHECK1
//
CHECKBOX_SetText(WM_GetDialogItem(hWin,GUI_ID_CHECK1),"LED3");
//
//GUI_ID_CHECK2
//
CHECKBOX_SetText(WM_GetDialogItem(hWin,GUI_ID_CHECK2),"LED4");
//
//GUI_ID_SLIDER0
//
SLIDER_SetRange(WM_GetDialogItem(hWin,GUI_ID_SLIDER0),10,200);
SLIDER_SetValue(WM_GetDialogItem(hWin,GUI_ID_SLIDER0),10);
首先是对Framewin添加关闭按钮,并且设置关闭按钮在右侧,然后一次设置CHECKBOX的文本内容,最后设置滑块的范围和初始值的大小。
④、对话框对外界触发事件的响应过程:
当用户释放了CHECKBOX方框和滑块以后,要进行对应的响应工作。
其中第一个是对CHECKBOX的响应:当每次检测到用户对控件进行操作中,对CHECKBOX释放过程后,根据对应的不同控件完成LED的翻转操作,也就是实现了对LED灯的控制作用,这是最简单的STemWin应用。
case GUI_ID_CHECK0:
        switch(NCode)
        {
                case WM_NOTIFICATION_RELEASED:
                        LED2^=1;
                        break;
        }
        break;
case GUI_ID_CHECK1:
        switch(NCode)
        {
                case WM_NOTIFICATION_RELEASED:
                        LED3^=1;
                        break;
        }
        break;
case GUI_ID_CHECK2:
        switch(NCode)
        {
                case WM_NOTIFICATION_RELEASED:
                        LED4^=1;
                        break;
        }
        break;

另外一个响应是对滑块释放的操作,在对滑块释放后,首先获取到滑块释放后的所对应的数值大小,然后禁用上面的三个CHECKBOX和滑块自身,然后根据GUI_Delay();操作延时,进行流水灯的闪烁,其中延时的大小是由滑块的数值所决定的。在流水灯循环10次以后,使能三个CHECKBOX控件和滑块控件,恢复LED状态为熄灭,并将CHECKBOX的状态设置为0。这样完成了一次自动化的操作,输入对STemWin控件的高级应用。
case GUI_ID_SLIDER0:
        switch(NCode)
        {
                case WM_NOTIFICATION_RELEASED:
                        hItem = WM_GetDialogItem(pMsg->hWin, GUI_ID_SLIDER0);
                        v = SLIDER_GetValue(hItem);
                        WM_DisableWindow(WM_GetDialogItem(pMsg->hWin, GUI_ID_CHECK0));
                        WM_DisableWindow(WM_GetDialogItem(pMsg->hWin, GUI_ID_CHECK1));
                        WM_DisableWindow(WM_GetDialogItem(pMsg->hWin, GUI_ID_CHECK2));
                        WM_DisableWindow(hItem);
                       
                        i=10;
                        while(i--)
                        {
                                LED2=0;
                                GUI_Delay(v);
                                LED2=1;
                                LED3=0;
                                GUI_Delay(v);
                                LED3=1;
                                LED4=0;
                                GUI_Delay(v);
                                LED4=1;
                        }
                       
                        WM_EnableWindow(hItem);
                        WM_EnableWindow(WM_GetDialogItem(pMsg->hWin, GUI_ID_CHECK0));
                        WM_EnableWindow(WM_GetDialogItem(pMsg->hWin, GUI_ID_CHECK1));
                        WM_EnableWindow(WM_GetDialogItem(pMsg->hWin, GUI_ID_CHECK2));
                        LED2=1;LED3=1;LED4=1;
                        CHECKBOX_SetState(WM_GetDialogItem(pMsg->hWin, GUI_ID_CHECK0),0);
                        CHECKBOX_SetState(WM_GetDialogItem(pMsg->hWin, GUI_ID_CHECK1),0);
                        CHECKBOX_SetState(WM_GetDialogItem(pMsg->hWin, GUI_ID_CHECK2),0);
                        break;
        }
        break;
最后就完成了第一个很简单的设计,功能简单,便于坛友们进一步学习STemWin的操作。





沙发
湛只为无双|  楼主 | 2016-1-14 14:50 | 只看该作者
本帖最后由 湛只为无双 于 2016-1-14 16:03 编辑

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

使用特权

评论回复
板凳
湛只为无双|  楼主 | 2016-1-14 14:52 | 只看该作者
占楼 稍后编辑 稍后编辑   

使用特权

评论回复
地板
294479435| | 2016-10-15 14:56 | 只看该作者
很厉害啊,我看了楼主代码,没有找到LCD显示驱动呢,望指教

使用特权

评论回复
5
西街耳呦| | 2017-5-8 19:57 | 只看该作者
楼主,我的屏幕显示怎么部分乱码,求楼主指教

无标题.png (331.42 KB )

无标题.png

使用特权

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

本版积分规则

15

主题

171

帖子

9

粉丝