目前Touch demo中的触摸屏校正算法,是采用了Carlos E. Vidales写的一种折算方法。基本原理是在屏上面取三个点分别是上部中间,中部右侧以及下部中间,然后做校正。具体的折算原理,请参考如下的链接:
英语原文:
http://www.embedded.com/design/configurable-systems/4023968/How-To-Calibrate-Touch-Screens
中文版:
http://www.eet-china.com/ART_8800302522_480101_TA_9c35bff5.HTM
例程中已经带了校正算法的源代码,如果像我一样,理解的还不是很透彻的话,至少先学会怎么使用这些函数吧。这个校正算法的推荐操作步骤如下:
1. 用全组数值调用setCalibrationMatrix()以设置显示屏驱动器,并提供原始存取数据。这样就不需要为存取数据构造特殊的函数。你只需要按照与程序一样的机制获取纵坐标。
2. 在坐标 (XD0,YD0)画出第一个目标。
3. 收集从触摸屏返回的数据,并存储在坐标(X0,Y0)。
4. 在坐标 (XD1,YD1)画出第二个目标。
5. 收集从触摸屏返回的数据,并存储在坐标(X1,Y1)。
6. 在坐标 (XD2,YD2)画出第三个目标。
7. 收集从触摸屏返回的数据,并存储在坐标(X2,Y2)。
8. 采用参考显示数据和其产生的触摸屏数据作为变量,调用setCalibrationMatrix()函数。
对应到代码的话,就是:
1:
/* Initialize touch screen calibration factor matrix with approx. values */
setCalibrationMatrix( (POINT*)&lcdCalibPoints, /* Display coordinates */
(POINT*)&touchCalibPoints, /* Touch coordinates */
&calibFactors ); /* Calibration factor matrix */
2~8:
/* Calibrate touch screen */
else if ( buttons & BC_UIF_PB2 )
{
memset( frameBuffer, BLACK, 2 * WIDTH * HEIGHT ); /* Clear screen */
drawCross( lcdCalibPoints[ 0 ].x, lcdCalibPoints[ 0 ].y, COLOR );
TFT_DrawString(30, 35, "Tap green marker" );
P[ 0 ] = getTouchTapSample10bit();
memset( frameBuffer, BLACK, 2 * WIDTH * HEIGHT ); /* Clear screen */
drawCross( lcdCalibPoints[ 1 ].x, lcdCalibPoints[ 1 ].y, COLOR );
TFT_DrawString(40, 130, "Tap green marker" );
P[ 1 ] = getTouchTapSample10bit();
memset( frameBuffer, BLACK, 2 * WIDTH * HEIGHT ); /* Clear screen */
drawCross( lcdCalibPoints[ 2 ].x, lcdCalibPoints[ 2 ].y, COLOR );
TFT_DrawString(20, 180, "Tap green marker" );
P[ 2 ] = getTouchTapSample10bit();
setCalibrationMatrix( (POINT*)&lcdCalibPoints,/* Display coordinates*/
&P[0], /* Touch coordinates */
&calibFactors ); /* Calibration factor matrix*/
memset( frameBuffer, BLACK, 2 * WIDTH * HEIGHT ); /* Clear screen */
TFT_DrawString(10, 100, "The touch screen is" );
TFT_DrawString(30, 130, "now calibrated !" );
}
9.如何应用:
touchSample = getTouchSample();
|-------->
static POINT getTouchSample( void )
{
POINT sample, normalizedSample;
sample = getTouchSample10bit();
getDisplayPoint( &normalizedSample, &sample, &calibFactors );
return normalizedSample;
}
getTouchSample10bit() 函数是取回实际的ADC值,然后代进getDisplayPoint(),取得校正之后的值。
这样的话,就能取回正确的屏幕坐标了。。 ^_^