查看: 3679|回复: 0

emwin的触屏校正

[复制链接]
  • TA的每日心情
    奋斗
    2016-2-27 20:05
  • 签到天数: 181 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2013-8-21 10:56:03 | 显示全部楼层 |阅读模式
    分享到:
       使用emwin有一段时间了。刚开始接触的时候,就被它那华丽的界面所震住。以前一直想在stm32f103上跑,但是ram太小,跑不起来。最近终于自己移植emwin到f4上。但是有一点让我很不爽,就是触屏不太给力。刚开始我在网上找了一些例程进行研究,发现都不太理想。最终自己找到了一个算法(参考别人的,自己借了一些修改)
      算法如下:
              /*
    *********************************************************************************************************
    *        函 数 名: TOUCH_DataFilter
    *        功能说明: 读取一个坐标值(x或者y)
    *             连续读取XPT2046_READ_TIMES次数据,对这些数据升序排列,
    *             然后去掉最低和最高XPT2046_LOST_VAL个数,取平均值
    *********************************************************************************************************
    */
    /* 读取次数 */
    #define XPT2046_READ_TIMES    5
    /* 丢弃值  */       
    #define XPT2046_LOST_VAL      1                 
    uint16_t TOUCH_DataFilter(uint8_t CMD)
    {
            uint16_t i, j;
            uint16_t buf[XPT2046_READ_TIMES];
            uint16_t usSum;
            uint16_t usTemp;

            /* 读取READ_TIMES次数据*/
            for(i=0; i < XPT2046_READ_TIMES; i++)
            {
                   
                            buf[i] =ADS_Read(CMD);       
                   
            }
           
            /* 升序排列 */                                     
            for(i = 0; i < XPT2046_READ_TIMES - 1; i++)
            {
                    for(j = i + 1; j < XPT2046_READ_TIMES; j++)
                    {
                            if(buf[i] > buf[j])
                            {
                                    usTemp = buf[i];
                                    buf[i] = buf[j];
                                    buf[j] = usTemp;
                            }
                    }
            }
                      
            usSum = 0;

            /*求和 */
            for(i = XPT2046_LOST_VAL; i < XPT2046_READ_TIMES - XPT2046_LOST_VAL; i++)
            {
                    usSum += buf[i];
            }
            /*求平均 */
            usTemp = usSum / (XPT2046_READ_TIMES - 2 * XPT2046_LOST_VAL);

            return usTemp;
    }

    /*
    *********************************************************************************************************
    *        函 数 名: TOUCH_ReadAdcXY
    *        功能说明: 连续2次读取触摸屏IC,且这两次的偏差不能超过
    *             ADC_ERR_RANGE,满足条件,则认为读数正确,否则读数错误.          
    *             该函数能大大提高准确度
    *********************************************************************************************************
    */
    /* 误差范围 */  
    uint8_t ADC_ERR_RANGE = 5;
    uint8_t TOUCH_ReadAdcXY(int16_t *_usX, int16_t *_usY)
    {
            uint16_t iX1, iY1;
            uint16_t iX2, iY2;
            uint16_t iX, iY;

            iX1 = TOUCH_DataFilter(CMD_RDY);
            iY1 = TOUCH_DataFilter(CMD_RDX);
            iX2 = TOUCH_DataFilter(CMD_RDY);
            iY2 = TOUCH_DataFilter(CMD_RDX);
           
            iX = TOUCH_Abs(iX1 - iX2);
            iY = TOUCH_Abs(iY1 - iY2);
           
            /* 前后两次采样在+-ERR_RANGE内 */  
        if ((iX <= ADC_ERR_RANGE) && (iY <= ADC_ERR_RANGE))
        {      
                   
                    if(g_ucGPIX == 1)
                    {
                            *_usY = (iX1 + iX2) / 2;
                    *_usX = (iY1 + iY2) / 2;               
                    }
                    else
                    {
                            *_usX = (iX1 + iX2) / 2;
                    *_usY = (iY1 + iY2) / 2;       
                    }
           

            return 1;
        }
            else
            {
                    return 0;
            }          
    }

        算法很简洁,使用起来很方便。
        此外,在emwin的例程包里,还有一个是在程序中校准参数的例子。它能够很好的校正触屏。可以在程序开始的时候来进行校准。
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-5-21 17:20 , Processed in 0.112629 second(s), 18 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.