1. 程式人生 > >ucgui介面設計 實體按鍵驅動

ucgui介面設計 實體按鍵驅動

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

                

ucgui介面設計&實體按鍵驅動


本文部落格連結:http://blog.csdn.net/jdh99,作者:jdh,轉載請註明.


環境:

主機:WIN8

開發環境:MDK4.72

ucgui版本:3.90

mcu: stm32f103VE


說明:

本程式基於ucgui對話方塊機制設計了一個介面,並用6個實體按鍵對介面進行控制


效果圖:


原始碼:

gui_main.h

/**********************************************************************          主介面模組標頭檔案*      (c)copyright 2014,jdh*        All Right Reserved*新建時間:2014/10/23 by jdh**********************************************************************/
#ifndef _GUI_MAIN_H_#define _GUI_MAIN_H_/**********************************************************************       標頭檔案**********************************************************************/#include "world.h"/**********************************************************************       巨集定義**********************************************************************/
/**********************************************************************       工作間隔*單位:ms**********************************************************************/#define INTERVAL_GUI_MAIN   100  /**********************************************************************       函式**********************************************************************//**********************************************************************       模組載入**********************************************************************/void gui_main_load(void);/**********************************************************************       模組執行**********************************************************************/void gui_main_run(void);/**********************************************************************       設定顯示狀態*引數:enable:0:關閉顯示,1:開啟顯示**********************************************************************/void gui_main_show(uint8_t enable);/**********************************************************************       得到當前的顯示狀態*返回:0:關閉顯示,1:開啟顯示**********************************************************************/uint8_t gui_main_get_show(void);#endif

gui_main.c

/**********************************************************************          主介面模組主檔案*      (c)copyright 2014,jdh*        All Right Reserved*新建時間:2014/10/23 by jdh**********************************************************************//**********************************************************************       標頭檔案**********************************************************************/#include "gui_main.h"/**********************************************************************       巨集定義**********************************************************************/#define ID_FRAMEWIN              (GUI_ID_USER + 0x10)#define ID_BUTTON_OK             (GUI_ID_USER + 0x11)#define ID_BUTTON_CANCEL            (GUI_ID_USER + 0x12)#define ID_BUTTON_UP             (GUI_ID_USER + 0x13)#define ID_BUTTON_DOWN             (GUI_ID_USER + 0x14)#define ID_BUTTON_LEFT             (GUI_ID_USER + 0x15)#define ID_BUTTON_RIGHT             (GUI_ID_USER + 0x16)#define ID_TEXT_MATCH            (GUI_ID_USER + 0x17)#define ID_TEXT_RSSI             (GUI_ID_USER + 0x18)#define ID_LISTBOX_FUNC            (GUI_ID_USER + 0x19)/**********************************************************************       資料結構**********************************************************************//**********************************************************************       按鍵狀態**********************************************************************/struct _Key_State{ uint8_t ok; uint8_t cancel; uint8_t up; uint8_t down; uint8_t left; uint8_t right;};/**********************************************************************       靜態變數**********************************************************************//**********************************************************************       介面控制代碼**********************************************************************/static WM_HWIN Handle_Gui;/**********************************************************************       資源表**********************************************************************/static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {  { FRAMEWIN_CreateIndirect,  "Frame3",  ID_FRAMEWIN,    0, 0, 240, 320, 0, 0x0},  { BUTTON_CreateIndirect,   "OK",   ID_BUTTON_OK,   5, 255, 40, 20, 0, 0x0},  { BUTTON_CreateIndirect,   "Button",  ID_BUTTON_DOWN,  95, 280, 40, 20, 0, 0x0},  { BUTTON_CreateIndirect,   "UP",   ID_BUTTON_UP,   95, 255, 40, 20, 0, 0x0},  { BUTTON_CreateIndirect,   "CANCEL",  ID_BUTTON_CANCEL,  185, 255, 40, 20, 0, 0x0},  { BUTTON_CreateIndirect,   "RIGHT",  ID_BUTTON_RIGHT,  140, 270, 40, 20, 0, 0x0},  { BUTTON_CreateIndirect,   "LEFT",  ID_BUTTON_LEFT,  50, 270, 40, 20, 0, 0x0},  { TEXT_CreateIndirect,   "Match",  ID_TEXT_MATCH,   140, 15, 80, 20, 0, 0x0},  { TEXT_CreateIndirect,   "RSSI",  ID_TEXT_RSSI,   140, 40, 80, 20, 0, 0x0},  { LISTBOX_CreateIndirect,  "Listbox",  ID_LISTBOX_FUNC,  5, 10, 120, 220, 0, 0x0},  // USER START (Optionally insert additional widgets)  // USER END};/**********************************************************************       上次工作時間**********************************************************************/static struct _Time Time_Last = {    .s = 0,    .ms = 0,    .us = 0};/**********************************************************************       按鍵狀態**********************************************************************/static struct _Key_State Key_State = { .ok = 0, .cancel = 0, .up = 0, .down = 0, .left = 0, .right = 0};/**********************************************************************       當前顯示狀態*0:未顯示,1顯示**********************************************************************/static uint8_t State_Show = 1;/**********************************************************************       靜態函式**********************************************************************//**********************************************************************       回撥函式**********************************************************************/static void _cbDialog(WM_MESSAGE * pMsg);/**********************************************************************       定時工作**********************************************************************/static void slot_tick(void);/**********************************************************************       按鍵處理**********************************************************************/static void deal_key(void);/**********************************************************************       函式**********************************************************************//**********************************************************************       模組載入**********************************************************************/void gui_main_load(void)//新建介面 Handle_Gui = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate),           _cbDialog, WM_HBKWIN, 0, 0);}/**********************************************************************       模組執行**********************************************************************/void gui_main_run(void)struct _Time time;  //判斷當前是否顯示 if (State_Show == 0) {  return; }        //得到當前時間    get_time(&time);    //判斷是否到工作時間 if (sub_time(time,Time_Last) >= INTERVAL_GUI_MAIN * 1000)    {        //更新時間        Time_Last = time;                //定時工作        slot_tick();    }}/**********************************************************************       設定顯示狀態*引數:enable:0:關閉顯示,1:開啟顯示**********************************************************************/void gui_main_show(uint8_t enable){ State_Show = enable; if (enable) {  WM_ShowWindow(Handle_Gui); } else {  WM_HideWindow(Handle_Gui); }}/**********************************************************************       得到當前的顯示狀態*返回:0:關閉顯示,1:開啟顯示**********************************************************************/uint8_t gui_main_get_show(void){ return State_Show;}/**********************************************************************       定時工作**********************************************************************/static void slot_tick(void)//按鍵處理 deal_key();}/**********************************************************************       按鍵處理**********************************************************************/static void deal_key(void){ WM_HWIN hItem;  //按鍵掃描    //inf_key_scan();  //判斷關機鍵是否按下 if (inf_key_detect_hold(KEY_CANCEL)) {  if (Key_State.cancel == 0)  {   Key_State.cancel = 1;      //按下狀態   hItem = WM_GetDialogItem(Handle_Gui, ID_BUTTON_CANCEL);   BUTTON_SetState(hItem,BUTTON_STATE_HASFOCUS | BUTTON_STATE_PRESSED);      //關機   inf_power_set(OFF);  } } else {  if (Key_State.cancel == 1)  {   Key_State.cancel = 0;      //初始化按鍵   hItem = WM_GetDialogItem(Handle_Gui, ID_BUTTON_CANCEL);   BUTTON_SetState(hItem,BUTTON_STATE_HASFOCUS);      //開機   inf_power_set(ON);  } }  //判斷下鍵是否按下 if (inf_key_detect_hold(KEY_DOWN)) {  if (Key_State.down == 0)  {   Key_State.down = 1;      //初始化按鍵   hItem = WM_GetDialogItem(Handle_Gui, ID_BUTTON_DOWN);   BUTTON_SetState(hItem,BUTTON_STATE_HASFOCUS | BUTTON_STATE_PRESSED);      //傳送按鍵訊號   WM_NotifyParent(hItem,WM_NOTIFICATION_CLICKED);  } } else {  if (Key_State.down == 1)  {   Key_State.down = 0;      //初始化按鍵   hItem = WM_GetDialogItem(Handle_Gui, ID_BUTTON_DOWN);   BUTTON_SetState(hItem,BUTTON_STATE_HASFOCUS);  } }  //判斷上鍵是否按下 if (inf_key_detect_hold(KEY_UP)) {  if (Key_State.up == 0)  {   Key_State.up = 1;      //初始化按鍵   hItem = WM_GetDialogItem(Handle_Gui, ID_BUTTON_UP);   BUTTON_SetState(hItem,BUTTON_STATE_HASFOCUS | BUTTON_STATE_PRESSED);      //傳送按鍵訊號   WM_NotifyParent(hItem,WM_NOTIFICATION_CLICKED);  } } else {  if (Key_State.up == 1)  {   Key_State.up = 0;      //初始化按鍵   hItem = WM_GetDialogItem(Handle_Gui, ID_BUTTON_UP);   BUTTON_SetState(hItem,BUTTON_STATE_HASFOCUS);  } }  //判斷測試鍵是否按下 if (inf_key_detect_hold(KEY_OK)) {  if (Key_State.ok == 0)  {   Key_State.ok = 1;      //初始化按鍵   hItem = WM_GetDialogItem(Handle_Gui, ID_BUTTON_OK);   BUTTON_SetState(hItem,BUTTON_STATE_HASFOCUS | BUTTON_STATE_PRESSED);      //傳送按鍵訊號   WM_NotifyParent(hItem,WM_NOTIFICATION_CLICKED);  } } else {  if (Key_State.ok == 1)  {   Key_State.ok = 0;      //初始化按鍵   hItem = WM_GetDialogItem(Handle_Gui, ID_BUTTON_OK);   BUTTON_SetState(hItem,BUTTON_STATE_HASFOCUS);  } }}/**********************************************************************       回撥函式**********************************************************************/static void _cbDialog(WM_MESSAGE * pMsg) { WM_HWIN hItem; int     NCode; int     Id; // USER START (Optionally insert additional variables) // USER END char str[20] = {0}; switch (pMsg->MsgId)  { case WM_INIT_DIALOG:  {   //初始化窗體   //增加小按鍵   FRAMEWIN_AddCloseButton(pMsg->hWin, FRAMEWIN_BUTTON_RIGHT, 0);   FRAMEWIN_AddMaxButton(pMsg->hWin, FRAMEWIN_BUTTON_RIGHT, 1);   FRAMEWIN_AddMinButton(pMsg->hWin, FRAMEWIN_BUTTON_RIGHT, 2);   FRAMEWIN_SetFont(pMsg->hWin, &GUI_FontHZ12);   sprintf(str,"腳鐐測試系統Ver%d by jdh",VERSION_SOFT);   FRAMEWIN_SetText(pMsg->hWin,str);      //初始化列表框   hItem = WM_GetDialogItem(pMsg->hWin, ID_LISTBOX_FUNC);   //設定為焦點   WM_SetFocus(hItem);   //設定內容   LISTBOX_SetFont(hItem, &GUI_FontHZ12);   LISTBOX_AddString(hItem, "對碼繫結");   LISTBOX_AddString(hItem, "頻點選擇");   LISTBOX_AddString(hItem, "通話測試");   LISTBOX_AddString(hItem, "GPRS測試");   LISTBOX_AddString(hItem, "GPS測試");   LISTBOX_AddString(hItem, "125K測試");   SCROLLBAR_CreateAttached(hItem, SCROLLBAR_CF_VERTICAL);      //初始化按鍵   hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_OK);   BUTTON_SetFont(hItem, &GUI_FontHZ12);   BUTTON_SetText(hItem,"測試");      hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_CANCEL);   BUTTON_SetFont(hItem, &GUI_FontHZ12);   BUTTON_SetText(hItem,"關機");      hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_UP);   BUTTON_SetFont(hItem, &GUI_FontHZ12);   BUTTON_SetText(hItem,"上");      hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_DOWN);   BUTTON_SetFont(hItem, &GUI_FontHZ12);   BUTTON_SetText(hItem,"下");      hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_LEFT);   BUTTON_SetFont(hItem, &GUI_FontHZ12);   BUTTON_SetText(hItem,"");      hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_RIGHT);   BUTTON_SetFont(hItem, &GUI_FontHZ12);   BUTTON_SetText(hItem,"");      //初始化文字   hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_MATCH);   TEXT_SetFont(hItem, &GUI_FontHZ12);   TEXT_SetText(hItem,"未繫結腳鐐");      hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_RSSI);   TEXT_SetFont(hItem, &GUI_FontHZ12);   TEXT_SetText(hItem,"");      break;  } case WM_NOTIFY_PARENT:  {   Id = WM_GetId(pMsg->hWinSrc);   NCode = pMsg->Data.v;   switch(Id)    {   case ID_BUTTON_OK:     {     switch(NCode)      {     case WM_NOTIFICATION_CLICKED:      {       //獲得當前列表數目       hItem = WM_GetDialogItem(pMsg->hWin, ID_LISTBOX_FUNC);       int a = LISTBOX_GetSel(hItem);       sprintf(str,"%d",a);              hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_RSSI);       TEXT_SetText(hItem,str);                     hItem = WM_GetDialogItem(pMsg->hWin, ID_LISTBOX_FUNC);       LISTBOX_GetItemText(hItem,a,str,20);              hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_MATCH);       TEXT_SetText(hItem,str);       break;      }     case WM_NOTIFICATION_RELEASED:      {       break;      }     }          break;    }   case ID_BUTTON_DOWN:    {     switch(NCode)      {     case WM_NOTIFICATION_CLICKED:      {       //傳送按鍵訊號       GUI_SendKeyMsg(GUI_KEY_DOWN, 1);       break;      }     case WM_NOTIFICATION_RELEASED:      {       break;      }     }     break;    }   case ID_BUTTON_UP:     {     switch(NCode)      {     case WM_NOTIFICATION_CLICKED:      {       //傳送按鍵訊號       GUI_SendKeyMsg(GUI_KEY_UP, 1);       break;      }     case WM_NOTIFICATION_RELEASED:      {       break;      }     }     break;    }   case ID_BUTTON_CANCEL:    {     switch(NCode)      {     case WM_NOTIFICATION_CLICKED:      {       break;      }     case WM_NOTIFICATION_RELEASED:      {       break;      }     }     break;    }   case ID_BUTTON_RIGHT:    {     switch(NCode)      {     case WM_NOTIFICATION_CLICKED:      {       break;      }     case WM_NOTIFICATION_RELEASED:      {       break;      }     }     break;    }   case ID_BUTTON_LEFT:    {     switch(NCode)      {     case WM_NOTIFICATION_CLICKED:      {       break;      }     case WM_NOTIFICATION_RELEASED:      {       break;      }     }     break;    }   case ID_LISTBOX_FUNC:    {     switch(NCode)      {     case WM_NOTIFICATION_CLICKED:      {       break;      }     case WM_NOTIFICATION_RELEASED:      {       break;      }     }     break;    }   }   break;  } default:  {   WM_DefaultProc(pMsg);   break;  } }}

           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述