触摸屏校正算法C实现
2010-07-14 08:44
435 查看
/*
=======================================================================================
=== 函数功能:触摸屏重校正
=== 校正原理:x = a1 * Xts + a2
y = b1 * Yts + b2
=======================================================================================
*/
#define XLiftInitData 20
#define XRightInitData GUI_LCM_XMAX - XLiftInitData
#define Xlong 5
#define YUpInitData XLiftInitData
#define YDownInitData GUI_LCM_YMAX - YUpInitData
#define Ylong 5
typedef struct xycoorbase{
uint X;
uint Y;
}XYCOORBASE;
typedef struct touchscreenbase{
uchar vSignEnable; //坐标数据有效位 1:有效
uint ADS7843Xcoor;
uint ADS7843Ycoor;
uchar Y;
uint X;
float perXts_xA;
float perXts_xB;
float perYts_yA;
float perYts_yB;
}TOUCHSCREENBASE;
TOUCHSCREENBASE TSCoor; // 触摸屏输入坐标信息
XYCOORBASE code vInitSetXYts[5]={{XLiftInitData,YUpInitData},
{XRightInitData,YUpInitData},
{XLiftInitData,YDownInitData},
{XRightInitData,YDownInitData},
{GUI_LCM_XMAX>>1,GUI_LCM_YMAX>>1}
};
uchar TouchScreenReInit(void)
{ uchar vCycle;
uint x,y;
XYCOORBASE vInitInputXYts[5];
for(vCycle=0;vCycle<5;vCycle++)
{ GUI_HLine(vInitSetXYts[vCycle].X-Xlong,vInitSetXYts[vCycle].Y,vInitSetXYts[vCycle].X+Xlong);
GUI_RLine(vInitSetXYts[vCycle].X,vInitSetXYts[vCycle].Y-Xlong,vInitSetXYts[vCycle].Y+Xlong);
ModeWaitTSInput(0,0);
vInitInputXYts[vCycle].X = TSCoor.ADS7843Xcoor;
vInitInputXYts[vCycle].Y = TSCoor.ADS7843Ycoor;
GUI_HLineClr(vInitSetXYts[vCycle].X-Xlong,vInitSetXYts[vCycle].Y,vInitSetXYts[vCycle].X+Xlong);
GUI_RLineClr(vInitSetXYts[vCycle].X,vInitSetXYts[vCycle].Y-Xlong,vInitSetXYts[vCycle].Y+Xlong);
Delayms(200);
}
vInitInputXYts[0].X = vInitInputXYts[0].X + vInitInputXYts[2].X ;
vInitInputXYts[1].X = vInitInputXYts[1].X + vInitInputXYts[3].X ;
vInitInputXYts[0].X = abs(vInitInputXYts[1].X-vInitInputXYts[0].X);
vInitInputXYts[2].X = vInitSetXYts[0].X + vInitSetXYts[2].X;
vInitInputXYts[3].X = vInitSetXYts[1].X + vInitSetXYts[3].X;
vInitInputXYts[2].X = abs(vInitInputXYts[3].X-vInitInputXYts[2].X);
TSCoor.perXts_xA = (float)vInitInputXYts[2].X /(float)vInitInputXYts[0].X;
TSCoor.perXts_xB = ((float)vInitInputXYts[3].X - TSCoor.perXts_xA * (float)vInitInputXYts[1].X)/2;
vInitInputXYts[0].Y = vInitInputXYts[0].Y + vInitInputXYts[1].Y;
vInitInputXYts[1].Y = vInitInputXYts[2].Y + vInitInputXYts[3].Y;
vInitInputXYts[0].Y = abs(vInitInputXYts[1].Y-vInitInputXYts[0].Y);
vInitInputXYts[2].Y = vInitSetXYts[0].Y + vInitSetXYts[1].Y;
vInitInputXYts[3].Y = vInitSetXYts[2].Y + vInitSetXYts[3].Y;
vInitInputXYts[2].Y = abs(vInitInputXYts[3].Y-vInitInputXYts[2].Y);
TSCoor.perYts_yA = (float)vInitInputXYts[2].Y /(float)vInitInputXYts[0].Y;
TSCoor.perYts_yB = ((float)vInitInputXYts[3].Y - TSCoor.perYts_yA * (float)vInitInputXYts[1].Y)/2;
x = vInitInputXYts[4].X *TSCoor.perXts_xA + TSCoor.perXts_xB;
y = vInitInputXYts[4].Y *TSCoor.perYts_yA + TSCoor.perYts_yB;
x = abs(x-vInitSetXYts[4].X)+abs(y-vInitSetXYts[4].Y);
if(x>10)
{ GUI_PutString(100,100,"Touch Screen Calibrate Failed");
return 0;
}
else
{ GUI_PutString(70,100,"Touch Screen Calibrate succeed");
GUI_PutString(70,120,"degree of precision %");
GUI_PutNum(185,120,100-x);
SaveDatato120Flash(&TSCoor,sizeof(TOUCHSCREENBASE));
return 1;
}
}
=======================================================================================
=== 函数功能:触摸屏重校正
=== 校正原理:x = a1 * Xts + a2
y = b1 * Yts + b2
=======================================================================================
*/
#define XLiftInitData 20
#define XRightInitData GUI_LCM_XMAX - XLiftInitData
#define Xlong 5
#define YUpInitData XLiftInitData
#define YDownInitData GUI_LCM_YMAX - YUpInitData
#define Ylong 5
typedef struct xycoorbase{
uint X;
uint Y;
}XYCOORBASE;
typedef struct touchscreenbase{
uchar vSignEnable; //坐标数据有效位 1:有效
uint ADS7843Xcoor;
uint ADS7843Ycoor;
uchar Y;
uint X;
float perXts_xA;
float perXts_xB;
float perYts_yA;
float perYts_yB;
}TOUCHSCREENBASE;
TOUCHSCREENBASE TSCoor; // 触摸屏输入坐标信息
XYCOORBASE code vInitSetXYts[5]={{XLiftInitData,YUpInitData},
{XRightInitData,YUpInitData},
{XLiftInitData,YDownInitData},
{XRightInitData,YDownInitData},
{GUI_LCM_XMAX>>1,GUI_LCM_YMAX>>1}
};
uchar TouchScreenReInit(void)
{ uchar vCycle;
uint x,y;
XYCOORBASE vInitInputXYts[5];
for(vCycle=0;vCycle<5;vCycle++)
{ GUI_HLine(vInitSetXYts[vCycle].X-Xlong,vInitSetXYts[vCycle].Y,vInitSetXYts[vCycle].X+Xlong);
GUI_RLine(vInitSetXYts[vCycle].X,vInitSetXYts[vCycle].Y-Xlong,vInitSetXYts[vCycle].Y+Xlong);
ModeWaitTSInput(0,0);
vInitInputXYts[vCycle].X = TSCoor.ADS7843Xcoor;
vInitInputXYts[vCycle].Y = TSCoor.ADS7843Ycoor;
GUI_HLineClr(vInitSetXYts[vCycle].X-Xlong,vInitSetXYts[vCycle].Y,vInitSetXYts[vCycle].X+Xlong);
GUI_RLineClr(vInitSetXYts[vCycle].X,vInitSetXYts[vCycle].Y-Xlong,vInitSetXYts[vCycle].Y+Xlong);
Delayms(200);
}
vInitInputXYts[0].X = vInitInputXYts[0].X + vInitInputXYts[2].X ;
vInitInputXYts[1].X = vInitInputXYts[1].X + vInitInputXYts[3].X ;
vInitInputXYts[0].X = abs(vInitInputXYts[1].X-vInitInputXYts[0].X);
vInitInputXYts[2].X = vInitSetXYts[0].X + vInitSetXYts[2].X;
vInitInputXYts[3].X = vInitSetXYts[1].X + vInitSetXYts[3].X;
vInitInputXYts[2].X = abs(vInitInputXYts[3].X-vInitInputXYts[2].X);
TSCoor.perXts_xA = (float)vInitInputXYts[2].X /(float)vInitInputXYts[0].X;
TSCoor.perXts_xB = ((float)vInitInputXYts[3].X - TSCoor.perXts_xA * (float)vInitInputXYts[1].X)/2;
vInitInputXYts[0].Y = vInitInputXYts[0].Y + vInitInputXYts[1].Y;
vInitInputXYts[1].Y = vInitInputXYts[2].Y + vInitInputXYts[3].Y;
vInitInputXYts[0].Y = abs(vInitInputXYts[1].Y-vInitInputXYts[0].Y);
vInitInputXYts[2].Y = vInitSetXYts[0].Y + vInitSetXYts[1].Y;
vInitInputXYts[3].Y = vInitSetXYts[2].Y + vInitSetXYts[3].Y;
vInitInputXYts[2].Y = abs(vInitInputXYts[3].Y-vInitInputXYts[2].Y);
TSCoor.perYts_yA = (float)vInitInputXYts[2].Y /(float)vInitInputXYts[0].Y;
TSCoor.perYts_yB = ((float)vInitInputXYts[3].Y - TSCoor.perYts_yA * (float)vInitInputXYts[1].Y)/2;
x = vInitInputXYts[4].X *TSCoor.perXts_xA + TSCoor.perXts_xB;
y = vInitInputXYts[4].Y *TSCoor.perYts_yA + TSCoor.perYts_yB;
x = abs(x-vInitSetXYts[4].X)+abs(y-vInitSetXYts[4].Y);
if(x>10)
{ GUI_PutString(100,100,"Touch Screen Calibrate Failed");
return 0;
}
else
{ GUI_PutString(70,100,"Touch Screen Calibrate succeed");
GUI_PutString(70,120,"degree of precision %");
GUI_PutNum(185,120,100-x);
SaveDatato120Flash(&TSCoor,sizeof(TOUCHSCREENBASE));
return 1;
}
}
相关文章推荐
- PhotoShop算法实现-- Gamma校正(指数变换)(五)
- PhotoShop算法实现--色彩平衡(偏色校正)(一)
- 基于几何成像模型的鱼眼镜头图像校正算法和技术研究的实现与改进
- 无私分享ucos下10.4寸触摸屏的2440驱动算法与实现
- 电阻技术触摸屏的校正算法及应用编程设计(转)
- fl2440触摸屏移植步骤逐步实现触摸屏校正程序
- tslib中的校正算法实现
- 《基于几何成像模型的鱼眼镜头图像校正算法和技术研究》实现
- 从零开始实现KNN分类算法
- 《编程珠玑》第二章 “杂技算法” 和 “翻转算法” C语言实现
- Horspool 算法C++11实现(支持中英文混合搜索)
- 基于像素清晰度的图像融合算法(Python实现)
- 二分搜索的递归实现算法
- 爬山算法与模拟退火算法的分析与实现
- PCA算法与Opencv实现
- 机器学习入门算法及其java实现-朴素贝叶斯
- Javascript实现身份证号码15位转18位的算法
- 【LeetCode-面试算法经典-Java实现】【107-Binary Tree Level Order Traversal II(二叉树层序遍历II)】
- 基本算法个人PHP 实现(一)
- 多线程无锁算法之无锁队列的实现