ucgui介面設計 實體按鍵驅動
阿新 • • 發佈:2018-11-15
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!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; } }}