大学生
最后登录1970-1-1
在线时间 小时
注册时间2013-5-1
|
本帖最后由 Alice2013 于 2013-6-23 13:15 编辑
先简单的说下原理,详细的可以看附件。
程序采用的是两点矫正,下面以X轴为例说明(X轴和Y轴是分别算的):
1 程序给出左上角和右下角的两个坐标(也就是逻辑坐标X1,X2)。
2 手去分别触摸的话会得到ADC采样的数值(也就是物理坐标Y1,Y2)。
3 先回忆一下初中的知识,根据初中学的直线方程
y = ax + b ..........................................................(1)
两点确定一条直线,代入坐标数值(X1,Y1),(X2,Y2), 从而可以求得a和b的数值。
a = (Y1 - Y0) / (X1 - X0)....................................... .....(2)
b = Y0 - (Y1 - Y0) * X0/(X1 - X0) 或 Y1 - (Y1 - Y0) * X1/(X1 - X0).. (3)
y = Y0 + (Y1 - Y0) * (x - X0) / (X1 - X0) (ucGUI用的是这个)...... (4)
y = Y1 + (Y1 - Y0) * (x - X1) / (X1 - X0) (或者使用这个)..........(5)
这样的话,给定逻辑坐标就能确定物理坐标,给定物理坐标也能确定逻辑坐标
4 ucGUI 又是如何矫正的呢,采用下面的函数
xyMinMax[Coord].Min= _Log2Phys(l0, Log0, Log1, Phys0, Phys1);
// Coord = 0 矫正X Coord = 1 矫正Y
xyMinMax[Coord].Max = _Log2Phys(l1, Log0,Log1, Phys0, Phys1);
_Log2Phys的作用就是上面的公式 (4),当然公式(5)也是可以的。
当x = 0时得到
GUI_TOUCH_AD_LEFT = xyMinMax[Coord == 0 ].Min = Y0 + (Y1 - Y0) * (0 - X0) / (X1 - X0)
当x = LCD_SIZEX时
GUI_TOUCH_AD_RIGHT = xyMinMax[Coord == 0 ].Max = Y0 + (Y1 - Y0) * ( LCD_SIZEX - X0) / (X1 - X0)
同理可以得到
GUI_TOUCH_AD_BOTTOM
GUI_TOUCH_AD_TOP
5. 实际应用的时候会调用下面的函数将物理坐标转换成逻辑坐标
有了上面的说明,下面的函数也很好的解释了(以X轴为例进行说明)。
只不过现在的两个坐标变成了
(0,xyMinMax[GUI_COORD_X].Min),(GUI_TOUCH_XSIZE - 1,xyMinMax[GUI_COORD_X].Max)
从而得到新的坐标变换公式
b = xyMinMax[GUI_COORD_X].Min
a = (xyMinMax[GUI_COORD_X].Max - xyMinMax[GUI_COORD_X].Min)/ (GUI_TOUCH_XSIZE - 1)
x = (y - b) / a = (y - xyMinMax[GUI_COORD_X].Min) * (GUI_TOUCH_XSIZE - 1) /
(xyMinMax[GUI_COORD_X].Max - xyMinMax[GUI_COORD_X].Min)
由这个公式就可以得到逻辑坐标,下面计算X,Y轴就是采用的这个公式
staticint _AD2X(int adx);// Convert physical value into coordinates.
staticint _AD2Y(int ady);// Convert physical value into (logical) coordinates.
staticint _AD2X(int adx) {
I32 r = adx - xyMinMax[GUI_COORD_X].Min;
r *= GUI_TOUCH_XSIZE - 1;
return r / (xyMinMax[GUI_COORD_X].Max -xyMinMax[GUI_COORD_X].Min);
}
staticint _AD2Y(int ady) {
I32 r = ady - xyMinMax[GUI_COORD_Y].Min;
r *= GUI_TOUCH_YSIZE - 1;
return r/(xyMinMax[GUI_COORD_Y].Max -xyMinMax[GUI_COORD_Y].Min);
}
ucGUI中的中的设备驱动解析(作者:UCGUI,上过http://www.UCGUI.com论坛的应该都知道)。
UCGUI中的中的设备驱动解析.zip
(32.16 KB, 下载次数: 270)
注释好的程序,方便大家调试。
TOUCH_Calibrate.zip
(2.49 KB, 下载次数: 290)
程序的图片如下,和官方DEMO里面的一样。
|
|