`第30章 指针输入设备(摇杆) 本期教程主要跟大家讲解指针输入设备,指针输入设备包括触摸屏、鼠标或游戏操纵杆。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_GetState()[size=9.0000pt] | | GUI_PID_StoreState()[size=9.0000pt] | |
上面两个函数的参数都是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[i]);
- Rect.x0 += 60;
- Rect.x1 += 60;
- }
- while (1)
- {
- GUI_Delay(10);
- }
- }
复制代码
主程序比较的简单,只是显示一个比较简单的画面,大家可以在这个界面上操作游标。界面效果如下:
30.4 总结 本期教程就跟大家讲这么多,整体来说内容比较的简单,触摸和鼠标会在后面的教程中再跟大家详细的讲述。
`
|