完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
发烧友的F407开发板:
将原先用于更新字库的任务,改成键盘扫描功能;GUI功能,是安富莱那边抄过来的: key0对应GUI_KEY_ENTER键值。对话框的WM_KEY 消息处理中,是开印Log。 我发现GUI_StoreKeyMsg能连续工作,而GUI_SendKeyMsg会导致HardFault_Handler。 什么原因,大虾指点! void fontupdata_task(void *pdata) { OS_ERR err; while(1) { if(KEY0 == 0) //KEY0键按下 { OStimeDlyHMSM(0,0,1,0,OS_OPT_TIME_PERIODIC,&err);//延时2s if(KEY0 == 0) //还KEY0键 { //WM_KEY中只是打印来观察,发现 GUI_SendKeyMsg(GUI_KEY_ENTER, 1);//不能连续执行,会进入HardFault_Handler //GUI_StoreKeyMsg(GUI_KEY_ENTER, 1);//能连续执行 } } if(KEY1 == 0) //KEY1键按下 { OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_PERIODIC,&err);//延时2s if(KEY1 == 0) //还KEY1键 { GUI_StoreKeyMsg(GUI_KEY_ESCAPE, 1);//能连续执行 } } if(KEY2 == 0) //KEY2键按下 { OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_PERIODIC,&err);//延时2s if(KEY2 == 0) //还KEY2键 { GUI_StoreKeyMsg(0x41, 1);//能连续执行 } } if(WK_UP == 1) //WK_UP键按下 { OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_PERIODIC,&err);//延时2s if(WK_UP == 1) //还WK_UP键 { GUI_StoreKeyMsg(0x61, 1);//能连续执行 } } OSTimeDlyHMSM(0,0,0,10,OS_OPT_TIME_PERIODIC,&err);//延时10ms } } //************************************************************************** #include #include "DIALOG.h" #include "keypad.h" #include "ILI93xx.h" #include "string.h" #include "stdlib.h" #include "usart.h" #include "pyinput.h" #include "EmWinHZFont.h" #include "led.h" #include "WM.h" #include "usart.h" #define GUI_KEY_ADD (GUI_ID_USER + 1) /* ******************************************************************************************************** * 静态数据 ******************************************************************************************************** */ static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = { { FRAMEWIN_CreateIndirect, "Edit winmode", 0, 90, 90, 140, 130, FRAMEWIN_CF_MOVEABLE}, { EDIT_CreateIndirect, NULL, GUI_ID_EDIT0, 10, 10, 110, 20, 0, 15}, { EDIT_CreateIndirect, NULL, GUI_ID_EDIT1, 10, 40, 110, 20, 0, 15}, { BUTTON_CreateIndirect, "Ok", GUI_ID_OK, 10, 80, 50, 20 }, { BUTTON_CreateIndirect, "Cancel", GUI_ID_CANCEL, 70, 80, 50, 20 }, }; static char * _apExplain[] = { "This sample shows how to use edit widgets with a", "user defined callback function and how to set a", "user defined AddKey function. It selects the", "contents of the edit field on receiving the focus", "and overwrites the contents if a key other than", "a cursor key is pressed.", }; /* ********************************************************************************************************* * 函 数 名: _cbDialog * 功能说明: 对话框的回调函数 * 形 参: pMsg 消息指针 * 返 回 值: 无 ********************************************************************************************************* */ static void _cbDialog(WM_MESSAGE * pMsg) { int i; int NCode; int Id; WM_HWIN hDlg; WM_HWIN hItem; printf("_cbDialog %drn",pMsg->MsgId); //pnhhit add 跟踪观察用 hDlg = pMsg->hWin; switch (pMsg->MsgId) { case WM_INIT_DIALOG: FRAMEWIN_SetFont(pMsg->hWin, &GUI_Font13_ASCII); FRAMEWIN_SetTextAlign(pMsg->hWin, GUI_TA_HCENTER); for (i = 0; i < 2; i++) { hItem = WM_GetDialogItem(hDlg, GUI_ID_EDIT0 + i); // Get the handle of the edit widget //EDIT_AddKey(hItem, GUI_KEY_ADD);//向指定的编辑字段(Edit窗口)添加用户输入。EDIT_AddKey(hItem, 'A'); EDIT_SetText(hItem, "Hello world!"); // Fill widget with text //很奇怪,会选中第一个文本框(hItem=5),而不是第二(hItem=A)个! EDIT_SetSel(hItem, 0, -1); // Select the whole contents of the edit field 选定的字符通常反色显示 //EDIT_SetSel((WM_HWIN)0xA, 0, -1); // 失败 } break; case WM_KEY://对话框接受按键事件,当焦点在文本框,按键触发的不同Key值,如果是有效输入key,对话框收到38消息;如果是无效,将是WM_KEY消息 switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key) { case 0x41://文本框能接受的输入字数有限,后面再按,文本框没反应,对话框也收不到38消息 printf("_cbDialog 0x41 Key2rn");//焦点在行文本框,不会执行,是个有效Key(输入A)。对话框收到38消息 //GUI_EndDialog(hDlg, 1); break; case 0x61://文本框能接受的输入字数有限,后面再按,文本框没反应,对话框也收不到38消息 printf("_cbDialog 0x61 KeyUprn");//焦点在行文本框,不会执行,是个有效Key(输入a)。对话框收到38消息 //GUI_EndDialog(hFrame, 0); break; case GUI_KEY_ESCAPE: printf("_cbDialog GUI_KEY_ESCAPE key1rn"); //焦点在行文本框,会执行,是个无效Key。对话框收到14消息 //GUI_EndDialog(hDlg, 1); break; case GUI_KEY_ENTER: printf("_cbDialog GUI_KEY_ENTER key0rn"); //焦点在行文本框,会执行,是个无效Key。对话框收到14消息 //GUI_EndDialog(hDlg, 0); break; } break; case WM_NOTIFY_PARENT: Id = WM_GetId(pMsg->hWinSrc); // Id of widget NCode = pMsg->Data.v; // Notification code switch (NCode) { case WM_NOTIFICATION_RELEASED: // React only if released if (Id == GUI_ID_OK) { // OK Button GUI_EndDialog(hDlg, 0); } if (Id == GUI_ID_CANCEL) { // Cancel Button GUI_EndDialog(hDlg, 1); } break; } break; default: WM_DefaultProc(pMsg); } } /* ********************************************************************************************************* * 函 数 名: _cbDesktop * 功能说明: 桌面窗口的回调函数 * 形 参: pMsg 消息指针 * 返 回 值: 无 ********************************************************************************************************* */ static void _cbDesktop(WM_MESSAGE * pMsg) { unsigned i; printf("_cbDesktop %drn",pMsg->MsgId); //pnhhit add 跟踪观察用 switch (pMsg->MsgId) { /* 重绘 */ case WM_PAINT: GUI_SetBkColor(GUI_RED); GUI_Clear(); GUI_SetFont(&GUI_Font24_ASCII); GUI_DispStringHCenterAt("WIDGET_EditWinmode", 160, 5); GUI_DispNextLine();//将光标移至下一行的开始。 GUI_SetFont(GUI_DEFAULT_FONT); GUI_DispNextLine(); for (i = 0; i < GUI_COUNTOF(_apExplain); i++) { GUI_DispStringHCenterAt(_apExplain, 160, GUI_GetDispPosY()); GUI_DispNextLine(); } break; } } /* ********************************************************************************************************* * 函 数 名: MainTask * 功能说明: GUI主函数 * 形 参: 无 * 返 回 值: 无 ********************************************************************************************************* */ void keypad_demo(void) { //GUI_Init(); WM_SetCallback(WM_HBKWIN, _cbDesktop); while(1) { /* 创建阻塞式对话框 */ //阻塞式对话框会阻塞执行的线程,默认情况下,它有输入焦点(外部按键GUI_SendKeyMsg将消息发送到这个对话框中),用户必须先关闭它,线程才能继续执行 GUI_ExecDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbDialog, 0, 0, 0); GUI_Delay(1000); } //创建非阻塞式对话框。 输入焦点好像还在对话框上! // GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbDialog, 0, 0, 0); // WM_SetFocus(WM_HBKWIN); //增加这个控制,输入焦点还在对话框上! // while(1) // { // GUI_Delay(1000); // } } /***************************** 安富莱电子 www.armfly.com (END OF FILE) *********************************/ |
|
相关推荐
2个回答
|
|
更新一下,GUI_SendKeyMsg执行结果:GUI_SendKeyMsg(GUI_KEY_ENTER, 1);// 对话框的消息执行第一次WM_KEY后,系统进入会进入HardFault_Handler
|
|
|
|
楼主的问题解决了么 我这个也是上了ucosIII 后 发送GUI_StoreKeyMsg 进hard fault
|
|
|
|
只有小组成员才能发言,加入小组>>
809 浏览 0 评论
1161 浏览 1 评论
2535 浏览 5 评论
2871 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2719 浏览 6 评论
keil5中manage run-time environment怎么是灰色,不可以操作吗?
1100浏览 3评论
198浏览 2评论
464浏览 2评论
378浏览 2评论
M0518 PWM的电压输出只有2V左右,没有3.3V是怎么回事?
459浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-26 03:20 , Processed in 1.104516 second(s), Total 81, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号