该程序就如上述所说,调用上一小节的 TOUCH_ReadData()读两次 X 轴和 Y 轴(如果 把 XY 轴,交叉来读,效果更好)。然后求取它们差值(求平均值在TOUCH_ReadData()函 数中已经使用了),判断是否超过理想误差,然后求出它们两个的平均值,最后查看是否超 过 X 轴和 Y 轴的数据上限和数据下限。
4. 触摸物理坐标值转换成 LCD 彩屏坐标
我们使用 XPT2046 读取到了触摸屏的触摸位置之后,想要在 LCD 屏相对应的位置上进 行操作,我们还要将它转换成 LCD 屏的坐标值。比如说,我们在LCD 屏(0, 0)坐标位置 按下,而读取到的物理坐标值(也就是 AD 值)为(100,200),那么我们想要在 LCD 屏(0, 0) 位置进行处理,将要将物理坐标(100,200)转换成 LCD 屏坐标。
那如何转换呢?我们知道,XPT2046 的分辨率为 12 位,也就是说我们读取 X 轴的物理 坐标值(这里我们假设为:Px)和 Y 轴的物理坐标值(这里我们假设为:Py)的值肯定是 在 0~4096 之间。但是我们 LCD 彩屏 X 轴和 Y 轴的像素坐标确是 240X400。(这个值是 PZ6908L 开发板配的 3.5 寸彩屏像素,不过不管多少,我们明白原理就行,为了更好的表示, 在这里我们 LCD 彩屏 X 轴像素坐标我们假设为:Lcdx, LCD 彩屏 Y 轴像素坐标我们假设 为:Lcdy。)那么我们假设当(Px, Py) = (0, 0)时,正好 LCD 彩屏像素坐标的起始坐标(0, 0), 当(Px, Py) = (4096, 4096)时,正好 LCD 彩屏像素坐标的终止坐标(239, 399)。难么我们不难 看出触摸屏的物理坐标跟 LCD 彩屏像素坐标的对应关系为:
Factorx = Lcdx / Px;
Factory = Lcdy / Py;
那么我们就可以求出 Factorx 和 Factory,然后每次读取到 Px 和 Py 之后就可以讲它很轻 松的转换为 Lcdx 和 Lcdy。这是一个很简单的数学关系。
不过呢,事情没有那么理想化,我们在 LCD 像素坐标为(0, 0)读取的触摸屏物理坐标 值不一定是(0,0),在 LCD 像素坐标为最大时,也不一定读取到的是触摸屏的物理坐标最 大值。所以我们要进行一些数据校正,这也是屏幕校正的原因。
什么意思呢?那我们在来解一个数学问题: 我们都知道每个触摸屏物理坐标值都能一一对应一个 LCD 彩屏上面的像素坐标值,也
就是它们是成比例关系的。现在我们知道 LCD 彩屏的 X 轴像素坐标最小值为 Lcdx1,我们 能显示的 LCD 彩屏的 X 轴像素坐标最大值为 Lcdx2。而我们在LCD 彩屏像素坐标 X 轴最 小值处读取的触摸屏 X 轴物理坐标为 Px1,在 LCD 彩屏 X 轴像素坐标最大值处读取的触摸 屏 X 轴的物理坐标为 Px2。那么现在我们知道有一个触摸屏物理坐标值在 Px1 到 Px2 之间 的坐标值为 Px,那么和它对应的 Lcdx 的值是多少呢?
那么我们可以这么解:
Factorx = (Lcdx2 – Lcdx1) / (Px2 – Px1); Lcdx = (Px – Px1) * Factorx; 那么就求得出 Lcdx 是多少了,对吧? 现在我们把它分解出来:
Lcdx = Px * Factorx – Px1 * Factorx;
然后将 Px1*Factorx 替换成一个变量 Offsetx。那么我们现在就可以得到 Lcdx 和 Px 之间 的对应关系式了。而关于 Y 轴也是同理,所以它们从物理坐标到像素坐标的转换关系式:
Lcdx = Px * Factorx – Offsetx;
Lcdy = Py * Factory – Offsety;
而求出 Factor 和 Offset 这两个数的过程就是校正程序应该做的工作了。现在我们理解了