高级会员

- 积分
- 616
- 金钱
- 616
- 注册时间
- 2015-6-29
- 在线时间
- 101 小时
|
本帖最后由 负西弱 于 2016-3-23 16:58 编辑
最近准备要用到电阻触摸屏,电阻触摸屏需要校准,看了下原子哥的校准方式,比较通俗易懂~~后来在网上又搜索了一下,找到了另外一种校准方式,没那么容易懂,我就直接拿来用了,感觉还可以,在这里分享一下:
主要代码:
[mw_shl_code=c,true]
/******************************************************************************
* FUNCTION: Touch_Cal ( )
* DESCRIPTION: 校准界面
* Input the description of function:
* Input Parameters:
* Output Parameters:
* Returns Value: 0--校准成功,1--校准失败或者没有校准
*
* Author: FuDongQiang @ 2016/03/23
*
* modification history
* ...
******************************************************************************/
uint8_t Touch_Cal(void)
{
uint8_t IsCalSucc = 0,NowCalStatus = 0,IsRunCal = 1;
uint8_t strCalHead1[] = {"Touch Calibrating,"};
uint8_t strCalHead2[] = {"Click The Cross"};
uint8_t strCalHead3[] = {"On The Screen..."};
uint8_t strCalSucc[] = {"Cal Succ,Click "};
uint8_t strCalFail[] = {"Cal Fail,Click "};
uint8_t strCalFinish[] = {"The Screen To Quit"};
uint32_t TouchCalTimeOut = 0;
ST_Calibration StCalibration;
CAL_CLEAR(CAL_COLOR_WHITE);
CAL_SET_COLOR(CAL_COLOR_BLACK,CAL_COLOR_WHITE);
CAL_SET_FONT(CAL_TIPS_STR_FONT);
CAL_SHOW_STR(CAL_TIPS_STR_POS_X,CAL_TIPS_STR_POS_Y,strCalHead1);
CAL_SHOW_STR(CAL_TIPS_STR_POS_X,CAL_TIPS_STR_POS_Y+CAL_TIPS_STR_FONT->Height,strCalHead2);
CAL_SHOW_STR(CAL_TIPS_STR_POS_X,CAL_TIPS_STR_POS_Y+CAL_TIPS_STR_FONT->Height+CAL_TIPS_STR_FONT->Height,strCalHead3);
while(IsRunCal)
{
Delay_ms(TOUCH_WAIT_DEAL_OUT_TIME);
TouchCalTimeOut += TOUCH_WAIT_DEAL_OUT_TIME;
Touch_CalShowCross(NowCalStatus);
while(1)
{
Delay_ms(TOUCH_SCAN_PERIOD);
TouchCalTimeOut += TOUCH_SCAN_PERIOD;
if(TouchCalTimeOut > TOUCH_WAIT_CAL_OUT_TIME)
{
IsCalSucc = 0;
break;
}
else if(Touch_Scan() != TP_IDLE)
{
//保存触摸值
Touch_ReScan();
break;
}
}
if(TouchCalTimeOut > TOUCH_WAIT_CAL_OUT_TIME)
{
IsCalSucc = 0;
IsRunCal = 0;
break;
}
switch(NowCalStatus)
{
case 4:
{
//已经采集到第5个点了,进行校准
StCalibration.x[NowCalStatus] = gStTpStatus.M_NowTPAD.M_Xpos;
StCalibration.y[NowCalStatus] = gStTpStatus.M_NowTPAD.M_Ypos;
StCalibration.xfb[NowCalStatus] = CalPosTable[NowCalStatus].M_Xpos;
StCalibration.yfb[NowCalStatus] = CalPosTable[NowCalStatus].M_Ypos;
IsCalSucc = perform_calibration(&StCalibration);;
IsRunCal = 0;
CAL_CLEAR(CAL_COLOR_WHITE);
if(IsCalSucc)
{
gStTpCalPara.M_cx = StCalibration.a[0];
gStTpCalPara.M_ax = StCalibration.a[1];
gStTpCalPara.M_bx = StCalibration.a[2];
gStTpCalPara.M_cy = StCalibration.a[3];
gStTpCalPara.M_ay = StCalibration.a[4];
gStTpCalPara.M_by = StCalibration.a[5];
gStTpCalPara.M_scale = StCalibration.a[6];
//perform_calibration计算成功,但是还要看计算结果是否合理
if(gStTpCalPara.M_scale/gStTpCalPara.M_ax > MAX_AD*TP_CAL_SCALE_RANGE/TP_LCD_WIDTH ||
gStTpCalPara.M_scale/gStTpCalPara.M_by > MAX_AD*TP_CAL_SCALE_RANGE/TP_LCD_HEIGHT)
{
//缩放比例太小
IsCalSucc = 0;
}
else if(gStTpCalPara.M_scale/gStTpCalPara.M_ax < (TP_CAL_SCALE_RANGE-1)*MAX_AD/TP_LCD_WIDTH/TP_CAL_SCALE_RANGE ||
gStTpCalPara.M_scale/gStTpCalPara.M_by < (TP_CAL_SCALE_RANGE-1)*MAX_AD/TP_LCD_HEIGHT/TP_CAL_SCALE_RANGE)
{
//缩放比例太大
IsCalSucc = 0;
}
}
if(IsCalSucc)
{
CAL_SHOW_STR(CAL_TIPS_STR_POS_X,CAL_TIPS_STR_POS_Y,strCalSucc);
}
else
{
Touch_SetCalParaDef();
CAL_SHOW_STR(CAL_TIPS_STR_POS_X,CAL_TIPS_STR_POS_Y,strCalFail);
}
CAL_SHOW_STR(CAL_TIPS_STR_POS_X,CAL_TIPS_STR_POS_Y+CAL_TIPS_STR_FONT->Height,strCalFinish);
Delay_ms(TOUCH_WAIT_DEAL_OUT_TIME);
TouchCalTimeOut += TOUCH_SCAN_PERIOD;
while(1)
{
Delay_ms(TOUCH_SCAN_PERIOD);
TouchCalTimeOut += TOUCH_SCAN_PERIOD;
if(TouchCalTimeOut > TOUCH_WAIT_CAL_OUT_TIME)
{
break;
}
else if(Touch_Scan() != TP_IDLE)
{
//保存触摸值
Touch_ReScan();
break;
}
}
}break;
default:
{
StCalibration.x[NowCalStatus] = gStTpStatus.M_NowTPAD.M_Xpos;
StCalibration.y[NowCalStatus] = gStTpStatus.M_NowTPAD.M_Ypos;
StCalibration.xfb[NowCalStatus] = CalPosTable[NowCalStatus].M_Xpos;
StCalibration.yfb[NowCalStatus] = CalPosTable[NowCalStatus].M_Ypos;
NowCalStatus++;
}break;
}
}
return IsCalSucc;
}
[/mw_shl_code]
参考文档:
Tslib中触摸屏校准原理及其实现.pdf
(220.28 KB, 下载次数: 595)
|
|