单片机
返回首页

wince 5.0/wince6.0 2440/6410/S5PV210 触摸屏驱动 滤波函数的介绍

2025-01-02 来源:cnblogs

以前曾经遇到过wince 手持机,POS机触摸屏 抖动,跳点,飞点的问题,其中起作用最大的就是触摸屏滤波函数,现在给大家介绍一下。

//-----------------------------------------------------------------------------

//--函数介绍:触摸屏滤波函数,每次输入一个采集到的触摸屏点(x/y),然后进行滤波

//------------------------------------------------------------------------------
static BOOL
Touch_Pen_Filtering(INT *px, INT *py)
{
    BOOL RetVal = TRUE;
    // TRUE  : Valid pen sample
    // FALSE : Invalid pen sample
    INT Filter_Margin;
    static int count = 0; // 用来记录 存储点数,对static INT x[2], y[2];很有帮助,详情看函数。
    static INT x[2], y[2];// 用数组来存储 采集数的两个点x[0],y[0]存储的是第一个点,x[1],y[1]存储的是(第二个点)

    INT TmpX, TmpY;    // 用来暂存点
    INT dx, dy;             // 点差值变量

    if(*px <0 && *py <0) // 如果点的值小于0 ,那么就是无效点,函数返回FALSE
    {
        count = 0;
        return FALSE;
    }
    else                        // 点有效,count 值加1
    {
        count++;
    }

    if (count > 2) // 当采集的点大于或者等于3 个的时候(count=0/1/2 )
    {
        // apply filtering rule
        count = 2;// 重新 赋值2

        // average between x,y[0] and *px,y  第一个点和当前点的平均值
        TmpX = (x[0] + *px)>>1;
        TmpY = (y[0] + *py)>>1;

        // difference between x,y[1] and TmpX,Y  求出第二个点和第一个点和当前点的均值差值绝对值,
        dx = (x[1] > TmpX) ? (x[1] - TmpX) : (TmpX - x[1]);
        dy = (y[1] > TmpY) ? (y[1] - TmpY) : (TmpY - y[1]);

        Filter_Margin = (x[1] > x[0]) ? (x[1]-x[0]) : (x[0]-x[1]);
        Filter_Margin += (y[1] > y[0]) ? (y[1]-y[0]) : (y[0]-y[1]);
        Filter_Margin += TSP_FILTER_LIMIT;

        if ((dx > Filter_Margin) || (dy > Filter_Margin)) {  //  无效 返回重新采集点
      // Invalid pen sample
            *px = x[1]; // 这个应该没有关系的
        *py = y[1]; // previous valid sample
            RetVal = FALSE;
            count = 0;
        }
        else   // 点有效,更新x[0] = x[1]; y[0] = y[1]; 存储的值
   {
            // Valid pen sample
            x[0] = x[1]; y[0] = y[1];
            x[1] = *px; y[1] = *py; // reserve pen samples

            RetVal = TRUE;
        }
    }
    else // (count < 2) // 采集点不够多,更新x[0] = x[1]; y[0] = y[1]; 存储的值,继续采集下面的值,至少采集三个点才行
   { // till 2 samples, no filtering rule
        x[0] = x[1]; y[0] = y[1];
        x[1] = *px; y[1] = *py; // reserve pen samples

        RetVal = FALSE;    // 

    }

    return RetVal;

}


进入单片机查看更多内容>>
相关视频
  • 【TI MSPM0 应用实战】智能小车+工业角度编码器+血氧仪+烟雾探测器!硬核参考设计详解!

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

  • 直播回放: Microchip Timberwolf™ 音频处理器在线研讨会

  • 基于灵动MM32W0系列MCU的指夹血氧仪控制及OTA升级应用方案分享

精选电路图
  • 1瓦线性调频增强器

  • 家用电器遥控器

  • 12V 转 28V DC-DC 变换器(基于 LM2585)

  • 红外开关

  • DS1669数字电位器

  • HA1377 桥式放大器 BCL 电容 17W(汽车音频)

    相关电子头条文章