該程序就如上述所說,調用上一小節(jié)的 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 開發(fā)板配的 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 彩屏上面的像素坐標值,也
就是它們是成比例關系的,F(xiàn)在我們知道 LCD 彩屏的 X 軸像素坐標最小值為 Lcdx1,我們 能顯示的 LCD 彩屏的 X 軸像素坐標最大值為 Lcdx2。而我們在LCD 彩屏像素坐標 X 軸最 小值處讀取的觸摸屏 X 軸物理坐標為 Px1,在 LCD 彩屏 X 軸像素坐標最大值處讀取的觸摸 屏 X 軸的物理坐標為 Px2。那么現(xiàn)在我們知道有一個觸摸屏物理坐標值在 Px1 到 Px2 之間 的坐標值為 Px,那么和它對應的 Lcdx 的值是多少呢?
那么我們可以這么解:
Factorx = (Lcdx2 – Lcdx1) / (Px2 – Px1); Lcdx = (Px – Px1) * Factorx; 那么就求得出 Lcdx 是多少了,對吧? 現(xiàn)在我們把它分解出來:
Lcdx = Px * Factorx – Px1 * Factorx;
然后將 Px1*Factorx 替換成一個變量 Offsetx。那么我們現(xiàn)在就可以得到 Lcdx 和 Px 之間 的對應關系式了。而關于 Y 軸也是同理,所以它們從物理坐標到像素坐標的轉換關系式:
Lcdx = Px * Factorx – Offsetx;
Lcdy = Py * Factory – Offsety;
而求出 Factor 和 Offset 這兩個數的過程就是校正程序應該做的工作了。現(xiàn)在我們理解了