完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
转stemwin教程
本期教程主要跟大家讲解指针输入设备,指针输入设备包括触摸屏、鼠标或游戏操纵杆。STemWin基础版包括模拟触摸屏的驱动、PS2鼠标驱动和示例游戏操纵杆驱动。只要有适当的驱动,也可以使用其他类型的触摸屏和鼠标设备。本期教程要讲的是指针输入设备中的摇杆,触摸屏和鼠标会在后面有专门的教程。 30. 1 描述 30. 2 指针输入设备(API) 30. 3 五向摇杆操作游标 30. 4 总结 30.1 描述 指针输入设备指鼠标、触摸屏、游戏操纵杆等设备。单个应用中可以使用多个指针输入设备,以支持鼠标/触摸屏/游戏操纵杆的同时使用。一般地,指针输入设备(PID)驱动所做的是在检测到事件(如移动鼠标或者按下触摸屏等)时调用GUI_PID_StoreState()程序。窗口管理器负责对PID事件作出正确反应;如果未使用窗口管理器,则由应用负责对PID事件作出反应。 |
|
相关推荐
|
|
30.2 指针输入设备(API)
下表按字母顺序列出了指针输入设备程序。详细描述如下。 注:该API由PID驱动使用;如果使用emWin自带的PID驱动,则代码中无需调用这些程序。
上面两个函数的参数都是GUI_PID_STATE * pState。GUI_PID_STATE结构的定义如下: typedef struct { int x, y; U8 Pressed; U8 Layer; } GUI_PID_STATE; 各个参数表示的意义如下: |
|
|
|
|
|
30.2 指针输入设备(API)
下表按字母顺序列出了指针输入设备程序。详细描述如下。 注:该API由PID驱动使用;如果使用emWin自带的PID驱动,则代码中无需调用这些程序。
上面两个函数的参数都是GUI_PID_STATE * pState。GUI_PID_STATE结构的定义如下: typedef struct { int x, y; U8 Pressed; U8 Layer; } GUI_PID_STATE; 各个参数表示的意义如下: |
|
|
|
|
|
30.3 五向摇杆操作游标
下面给大家演示一下通过开发板上面带的五向摇杆来操作屏幕上的游标。五向摇杆的驱动请看安富莱STM32-V5开发板_用户手册的第20章:按键FIFO教程。五项摇杆操作游标的程序主要分为两部分: Ø 摇杆任务 Ø STemWin主任务 摇杆任务的程序: 复制代码 /* ********************************************************************************************************* * 函 数 名: AppTaskUserIF * 功能说明: 此函数主要用于得到按键的键值。 * 形 参:p_arg 是在创建该任务时传递的形参 * 返 回 值: 无 优 先 级:2 ********************************************************************************************************* */ static void AppTaskUserIF(void *p_arg) { uint8_t uKeyCode; int16_t TimeAcc = 10; /* 动态的加速数值 */ GUI_PID_STATE State;(1) int16_t Max; (void)p_arg; /* 避免编译器报警 */ while (1) { bsp_KeyScan(); uKeyCode = bsp_GetKey(); if(uKeyCode != KEY_NONE) { if(uKeyCode == KEY_1_DOWN) { BSP_OS_SemPost(&SEM_SYNCH); } /* 计算得到新的坐标值 */ GUI_PID_GetState(&State);(2) if (uKeyCode == JOY_DOWN_L) (3) { State.x -= TimeAcc; } if (uKeyCode == JOY_DOWN_R) (4) { State.x += TimeAcc; } if (uKeyCode == JOY_DOWN_U) (5) { State.y -= TimeAcc; } if (uKeyCode == JOY_DOWN_D) (6) { State.y += TimeAcc; } /* 确定坐标还在屏幕的范围内 */ (7) if (State.x < 0) { State.x = 0; } if (State.y < 0) { State.y = 0; } Max = LCD_GetXSize() - 1; if (State.x >= Max) { State.x = Max; } Max = LCD_GetYSize() - 1; if (State.y > Max) { State.y = Max; } State.Pressed = (uKeyCode == JOY_DOWN_OK ) ? 1: 0;(8) GUI_PID_StoreState(&State); (9) } BSP_OS_TimeDlyMs(10); } } |
|
|
|
|
|
1. 定义一个GUI_PID_STATE类型的变量。
2. 获取当前游标所在的位置。 3. 如果是摇杆左键按下,将游标向左移动10个像素。 4. 如果是摇杆右键按下,将游标向右移动10个像素。 5. 如果是摇杆上键按下,将游标向上移动10个像素。 6. 如果是摇杆下键按下,将游标向下移动10个像素。 7. 防止摇杆移动的游标超出屏幕范围。 8. 如果是摇杆OK键按下,将使能按下状态。 9. 存储PID的当前状态。 |
|
|
|
|
|
STemWin主任务程序如下:
复制代码 #include "includes.h" #include "MainTask.h" int i; char acText[] = "www.armfly.com www.armfly.taobao.com Eric2013"; GUI_RECT Rect = {10, 10, 59, 59}; GUI_WRAPMODE aWm[] = {GUI_WRAPMODE_NONE, GUI_WRAPMODE_CHAR, GUI_WRAPMODE_WORD}; /* ********************************************************************************************************* * 函 数 名: MainTask * 功能说明: GUI主函数 * 形 参:无 * 返 回 值: 无 ********************************************************************************************************* */ void MainTask(void) { GUI_Init(); GUI_CURSOR_Show(); GUI_SetTextMode(GUI_TM_TRANS); for (i = 0; i < 3; i++) { GUI_SetColor(GUI_BLUE); GUI_FillRectEx(&Rect); GUI_SetColor(GUI_WHITE); GUI_DispStringInRectWrap(acText, &Rect, GUI_TA_LEFT, aWm); Rect.x0 += 60; Rect.x1 += 60; } while (1) { GUI_Delay(10); } } |
|
|
|
|
|
205 浏览 0 评论
求助一下关于51系列单片机的Timer0的计时问题,TH0、TL0+1的时间是怎么算的?
1253 浏览 1 评论
【RA-Eco-RA4E2-64PIN-V1.0开发板试用】开箱+Keil环境搭建+点灯+点亮OLED
848 浏览 0 评论
【敏矽微ME32G070开发板免费体验】使用coremark测试敏矽微ME32G070 跑分
853 浏览 0 评论
【敏矽微ME32G070开发板免费体验】开箱+点灯+点亮OLED
1073 浏览 2 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12009 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 13:12 , Processed in 0.803138 second(s), Total 87, Slave 68 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号