STM32F407VET6移植emwin5.3(含Touch)(二)——移植touch

触摸需要添加的函数是GUI_X_Touch_Analog.c,见上一节。
触摸的整体思路是,
1.GUI至少10ms一次调用GUI_TOUCH_Exec();这个函数,来实时刷新按键。
2.GUI_TOUCH_Exec();中调用
int  GUI_TOUCH_X_MeasureX(void);
int  GUI_TOUCH_X_MeasureY(void);
来读取触摸的AD物理坐标。
3.在GUI_TOUCH_Exec();中,通过用在初始化时的校准函数得到的系数计算得出实际的坐标值。
4.调用结构体GUI_PID_STATE,将坐标值等四个信息存进去。
5.按键任务中调用
int GUI_TOUCH_GetState(GUI_PID_STATE * pState);
来得到实际的逻辑坐标信息。
所以首先我们要准备好触摸的驱动,读出来的X轴AD值判断在不在触摸区域内。如果在区域内,就再读取Y轴值。然后将坐标AD值传递给GUI。传递函数用的是 void GUI_TOUCH_StoreState(int x, int y);然后GUI_TOUCH_Exec();这个函数会将x,y值取出来计算后调用一个结构体,在GUI_Type.h里面。定义如下:
typedef struct {
int x,y;
U8 Pressed;
U8 Layer;
} GUI_PID_STATE;
前两个参数是坐标AD值,第三个参数是是否有按下。当它为1时表示有触摸按下,会调用其他的,此时就会把实际的坐标传递进去。最后一个参数Layer是层的意思,代表的是当前触摸的是第几层窗口。
举个例子

TOUCH_X()和TOUCH_Y()这两个就是触摸硬件驱动。需要注意的是,当检测不到触摸时,要将x,y赋值为-1,表示没有按键按下。
我们需要在初始化的时候有一个校准过程,调用的函数是
int GUI_TOUCH_Calibrate(int Coord, int Log0, int Log1, int Phys0, int Phys1);
其中Coord为0时代表的是X轴,为1时代表的是Y轴。第二个和第三个代表的是逻辑地址,第四个和第五个代表的是物理地址。在emWin5.3的说明书中用了这个例子:

上面的四个定义常量,就是我们校准时候得到的触摸AD值。可以用常量直接定义,这些常量来自于我们的经验值。也可以做一个校准过程,比如先点左上角再点右下角这些,校准的时候算出来这些值,将这些值保存在EEPROM中,每次开机的时候再调用这些参数校准。有了这些 系数,GUI_TOUCH_Exec();中就可以将物理坐标转换为逻辑坐标并保存在结构体中。
然后我们需要在我们的按键任务中得到坐标结构体并做处理:
while(1) {
GUI_PID_STATE State;
GUI_TOUCH_GetState(&State);
if (State.Pressed == 1) {
//GUI_FillCircle(State.x, State.y, 3);
}
GUI_Delay(10);
}
其中GUI_TOUCH_GetState()得到的就是逻辑坐标信息。如果有按下,判断键值并传递 消息即可。
在GUI_X_Touch_Analog.c中还有两个函数,
void GUI_TOUCH_X_ActivateX(void);
void GUI_TOUCH_X_ActivateY(void);
这两个函数是为了验证x和y是否正确的用的,说明书里面说可以用着两个函数输出两个方波,用示波器观察来验证。我们直接用仿真来验证
附上emWin5.3说明书中关于这一块儿的建议:

这里面有很多优化的地方,比如触摸得到AD值得算法,怎么保证计算出来的坐标是准确的,且不会抖动,是一个很值得探讨的问题。

猜你喜欢

转载自blog.csdn.net/qq_22822111/article/details/80251853