OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3029|回复: 1

分享一个电阻触摸屏的校准程序

[复制链接]

22

主题

180

帖子

1

精华

高级会员

Rank: 4

积分
616
金钱
616
注册时间
2015-6-29
在线时间
101 小时
发表于 2016-3-23 16:58:44 | 显示全部楼层 |阅读模式
本帖最后由 负西弱 于 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)
我是菜鸟
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

98

帖子

0

精华

高级会员

Rank: 4

积分
755
金钱
755
注册时间
2015-9-16
在线时间
94 小时
发表于 2016-3-23 17:54:52 | 显示全部楼层
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-19 17:46

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表