// Topic:彻底解决2440触摸屏跳点问题

// 作者:gooogleman

// 版权:gooogleman嵌入式开发板联盟wogoyixikexie@gliet.gooogleman

// 平台:wince5.0 2440 5.0 BSP (飞凌FL2440/OK2440开发板 3.5 寸LCD)

// 发布日期:2010年11月18日

// 最后修改:

//技术论坛:www.gooogleman.com

// 注意事项:商业网站未经作者同意不能转载,并且不能删除文章的任何部分,否则追究责任!

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

  其实2440触摸屏跳点问题在前一个多月已经得到解决,在我解决6410 触摸屏抖动的时候,偶然发现6410 不会任何跳点,只是抖动,后来比较2440 和6410 的触摸屏驱动写法,发现6410的比较惊异,算法避免了天外飞仙跳点。

ooo,下班了,明天再写吧。

——续@2010-11-19

  我仔细比较6410 触摸屏驱动和2440 驱动,发现6410 的写法比较合理一些,最大区别是DdsiTouchPanelGetPoint函数写法,下面是2440 会跳点的写法。

  从上面可以看出,这个DdsiTouchPanelGetPoint里面只进行了一步采样,尽管采样次数大于1次,但是也绝对不能消除天外飞仙跳点。因为这几次采样时间太靠近了,所以采样值都会很相近,即使是多次采样(我曾经试过20 次,没有多大改善。),求平均值,效果也会很微小。这个情况就说明,要想触摸屏不跳点,就要消除错误的采样点,那么怎么做呢?上面每隔10ms 连续采样多次无效,原因是每次采样间隔时间太短,数据太密集,接近,导致仍然获得的是误差数据。假设想想,如果扩大采样时间间隔去采样,这样获得的数据就不会太接近就可以判断了吧?看看6410 的触摸屏驱动,果然是每隔10ms 采样两组数据的,并且这两组数据进行比较分析,误差过大就说明采样点是无效的,这样就把天外飞仙的现象去掉了。下面也贴出改好的2440 代码,希望大家有帮助。

/* :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: */PUBLIC VOID
DdsiTouchPanelGetPoint(TOUCH_PANEL_SAMPLE_FLAGS * pTipStateFlags,INT    * pUncalX,INT   * pUncalY)
{static INT x, y;int TmpX = 0;int TmpY = 0;if (v_pINTregs->SUBSRCPND & (1<<IRQ_SUB_TC))      /* SYSINTR_TOUCH Interrupt Case*/{*pTipStateFlags = TouchSampleValidFlag;if ( (v_pADCregs->ADCDAT0 & (1 << 15)) |(v_pADCregs->ADCDAT1 & (1 << 15)) ){bTSP_DownFlag = FALSE;DEBUGMSG(ZONE_TIPSTATE, (TEXT("up\r\n")));v_pADCregs->ADCTSC &= 0xff;*pUncalX = x;*pUncalY = y;TSP_SampleStop();// TestRETAILMSG(1,(TEXT("bTSP_DownFlag = FALSE...PenUP!!!\r\n")));}else {bTSP_DownFlag = TRUE;//if (!TSP_GetXY(&x, &y)) //  *pTipStateFlags = TouchSampleIgnore;//TSP_TransXY(&x, &y);//-----------------------add @2010.09.11-----------------------*pTipStateFlags |= TouchSampleIgnore;*pUncalX = x;*pUncalY = y;*pTipStateFlags |= TouchSampleDownFlag;//Test         RETAILMSG(1,(TEXT("bTSP_DownFlag = TRUE...PenDown!!!\r\n")));TSP_SampleStart();}v_pINTregs->SUBSRCPND  =  (1<<IRQ_SUB_TC);v_pINTregs->INTSUBMSK &= ~(1<<IRQ_SUB_TC);InterruptDone(gIntrTouch);}else      /* SYSINTR_TOUCH_CHANGED Interrupt Case     */{
//      TSP_SampleStart();if (bTSP_DownFlag){if (TSP_GetXY(&TmpX, &TmpY) == TRUE){//TSP_TransXY(&TmpX, &TmpY);if(Touch_Pen_Filtering(&TmpX, &TmpY)){*pTipStateFlags = TouchSampleValidFlag | TouchSampleDownFlag;*pTipStateFlags &= ~TouchSampleIgnore;}else        // Invalid touch pen{*pTipStateFlags = TouchSampleValidFlag;*pTipStateFlags |= TouchSampleIgnore;}*pUncalX = x = TmpX;*pUncalY = y = TmpY;}else{*pTipStateFlags = TouchSampleIgnore;}}else{*pTipStateFlags = TouchSampleIgnore;TSP_SampleStop();RETAILMSG(1,(TEXT("bTSP_DownFlag = FALSE.PenDown!!!IRQ_Timer3 Interrupt\r\n")));}InterruptDone(gIntrTouchChanged);}// add by wogo at2009.03.23 why?SetEvent(hEventTouchInput);
}static BOOL
Touch_Pen_Filtering(INT *px, INT *py)
{BOOL RetVal = TRUE;// TRUE  : Valid pen sample// FALSE : Invalid pen sampleINT Filter_Margin;static int count = 0;static INT x[2], y[2];INT TmpX, TmpY;INT dx, dy;if(*px <0 && *py <0){count = 0;return FALSE;}else{count++;}if (count > 2){// apply filtering rulecount = 2;// average between x,y[0] and *px,yTmpX = (x[0] + *px)>>1;TmpY = (y[0] + *py)>>1;// difference between x,y[1] and TmpX,Ydx = (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 sampleRetVal = FALSE;count = 0;}else{// Valid pen samplex[0] = x[1]; y[0] = y[1];x[1] = *px; y[1] = *py; // reserve pen samplesRetVal = TRUE;}}else // (count > 2){ // till 2 samples, no filtering rulex[0] = x[1]; y[0] = y[1];x[1] = *px; y[1] = *py; // reserve pen samplesRetVal = FALSE;    // <- TRUE jylee 2003.03.04}return RetVal;}

  现在测试2440 的触摸屏,我们会惊奇的发现,真的没有天外飞仙跳点了,不过又引入了一个新的问题,触摸屏抖动!以前的那种写法采样时间间隔短,数据集中,是不会抖动的,现在数据差异大,触摸屏抖动的相当的厉害了!怎么办呢?这个时候增大采样次数求平均值会有一些效果,不过还是不能完全消除抖动的!现在就要用一个简单的算法了:就是采样八个点,然后从小到大排序之后,把最大和最小值去掉,因为这两个值通常都是在受力不均的时候产生的,不是真实的值,所以丢了,再求剩余几个点的平均值,这样就可以完美的消除触摸屏抖动了,下面贴出代码,希望大家也来改进一下。

PRIVATE BOOL
TSP_GetXY(INT *px, INT *py)
{int i,j,k,temp;//INT xsum, ysum;//int x, y;int dx, dy;int x[TSP_SAMPLE_NUM], y[TSP_SAMPLE_NUM];//xsum = ysum = 0;EnterCriticalSection(&g_csTouchADC);for (i = 0; i < TSP_SAMPLE_NUM; i++){v_pADCregs->ADCTSC = (0<<8)|(1<<7)|(1<<6)|(0<<5)|(1<<4)|(1<<3)|(1<<2)|(0);         v_pADCregs->ADCCON |= (1 << 0);               /* Start Auto conversion                */while (v_pADCregs->ADCCON & 0x1);              /* check if Enable_start is low         */while (!(v_pADCregs->ADCCON & (1 << 15)));       /* Check ECFLG                          */x[i] = (0x3ff & v_pADCregs->ADCDAT1);y[i] = 0x3ff - (0x3ff & v_pADCregs->ADCDAT0);//x[i] = D_XPDATA_MASK(v_pADCregs->ADCDAT1);//y[i] = D_YPDATA_MASK(v_pADCregs->ADCDAT0);//xsum += x;//ysum += y;}//*px = xsum / TSP_SAMPLE_NUM;//*py = ysum / TSP_SAMPLE_NUM;v_pADCregs->ADCTSC = (1<<8)|(1<<7)|(1<<6)|(0<<5)|(1<< 4)|(0<<3)|(0<<2)|(3);    LeaveCriticalSection(&g_csTouchADC);//--------------------------------------------------------------// if mask it ,very tremble work not wellfor (j = 0; j < TSP_SAMPLE_NUM -1; ++j){for (k = j+1; k < TSP_SAMPLE_NUM; ++k){if(x[j]>x[k]){temp = x[j];x[j]=x[k];x[k]=temp;}if(y[j]>y[k]){temp = y[j];y[j]=y[k];y[k]=temp;}}}//dx = (*px > x) ? (*px - x) : (x - *px);//dy = (*py > y) ? (*py - y) : (y - *py);*px = (x[2] + ((x[3]+x[4])<<1) + (x[3]+x[4]) + x[5]);*py = (y[2] + ((y[3]+y[4])<<1) + (y[3]+y[4]) + y[5]);if ((*px & 0x7) > 3) *px = (*px>>3) + 1;else *px = *px>>3;if ((*py & 0x7) > 3) *py = (*py>>3) + 1;else *py = *py>>3;dx = x[5] - x[2];dy = y[5] - y[2];return ((dx > TSP_INVALIDLIMIT || dy > TSP_INVALIDLIMIT) ? FALSE : TRUE);
}

  好了,方法就是这么多了,This is it ,下面贴出效果图,收工!

wince 2440 完美解决触摸屏跳点抖动源码
http://www.gooogleman.com/forum.php?mod=viewthread&tid=507&fromuid=3

/* :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: */
/* :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: */PUBLIC VOID
DdsiTouchPanelGetPoint(TOUCH_PANEL_SAMPLE_FLAGS * pTipStateFlags,INT    * pUncalX,INT   * pUncalY)
{static INT x, y;if (v_pINTregs->SUBSRCPND & (1<<IRQ_SUB_TC))      /* SYSINTR_TOUCH Interrupt Case*/{*pTipStateFlags = TouchSampleValidFlag;if ( (v_pADCregs->ADCDAT0 & (1 << 15)) |(v_pADCregs->ADCDAT1 & (1 << 15)) ){bTSP_DownFlag = FALSE;DEBUGMSG(ZONE_TIPSTATE, (TEXT("up\r\n")));v_pADCregs->ADCTSC &= 0xff;*pUncalX = x;*pUncalY = y;TSP_SampleStop();// TestRETAILMSG(1,(TEXT("bTSP_DownFlag = FALSE...PenUP!!!\r\n")));}else {bTSP_DownFlag = TRUE;if (!TSP_GetXY(&x, &y)) *pTipStateFlags = TouchSampleIgnore;TSP_TransXY(&x, &y);*pUncalX = x;*pUncalY = y;*pTipStateFlags |= TouchSampleDownFlag;//Test           RETAILMSG(1,(TEXT("bTSP_DownFlag = TRUE...PenDown!!!\r\n")));TSP_SampleStart();}v_pINTregs->SUBSRCPND  =  (1<<IRQ_SUB_TC);v_pINTregs->INTSUBMSK &= ~(1<<IRQ_SUB_TC);InterruptDone(gIntrTouch);}else      /* SYSINTR_TOUCH_CHANGED Interrupt Case     */{
//      TSP_SampleStart();if (bTSP_DownFlag){INT  tx, ty;INT  dx, dy;if (!TSP_GetXY(&tx, &ty)) *pTipStateFlags = TouchSampleIgnore;else {RETAILMSG(1,(TEXT("bTSP_DownFlag = TRUE.PenDown!!!IRQ_Timer3 Interrupt\r\n")));TSP_TransXY(&tx, &ty);
// insert by mostek@dstcorp.com
#define X_ERRV  0x3bf
#define Y_ERRV  0x4ffif ((tx == X_ERRV) && (ty == Y_ERRV)){tx = x;ty = y;}
// =================== mostekdx = (tx > x) ? (tx - x) : (x - tx);dy = (ty > y) ? (ty - y) : (y - ty);if (dx > TSP_CHANGE || dy > TSP_CHANGE){*pUncalX = x = tx;*pUncalY = y = ty;//DEBUGMSG(ZONE_TIPSTATE, (TEXT("down-c-v %x %x\r\n"), x, y));*pTipStateFlags = TouchSampleValidFlag | TouchSampleDownFlag;}else{*pUncalX = x;*pUncalY = y;DEBUGMSG(ZONE_TIPSTATE, (TEXT("down-c %x %x\r\n"), x, y));*pTipStateFlags = TouchSampleIgnore;}}}else{*pTipStateFlags = TouchSampleIgnore;TSP_SampleStop();RETAILMSG(1,(TEXT("bTSP_DownFlag = FALSE.PenDown!!!IRQ_Timer3 Interrupt\r\n")));}InterruptDone(gIntrTouchChanged);}// add by wogo at2009.03.23 why?SetEvent(hEventTouchInput);
}

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

转载于:https://www.cnblogs.com/gooogleman/archive/2010/11/18/1881017.html

【原创】彻底解决2440触摸屏跳点以及抖动问题相关推荐

  1. c++里解决“控制传输跳过的实例化”的方法

    c++里解决"控制传输跳过的实例化"的方法 参考文章: (1)c++里解决"控制传输跳过的实例化"的方法 (2)https://www.cnblogs.com/ ...

  2. 富士相机设置传原图_富士X-S10相机传图必看!原创完美解决PC互传图片问题

    富士X-S10相机传图必看!原创完美解决PC互传图片问题 2020-11-28 17:03:04 18点赞 28收藏 23评论 创作立场声明:原创首发分享,实用技巧希望推荐好文! 最近入手了富士X-S ...

  3. android 触摸屏干扰,如何解决电容触摸屏的抗干扰问题?

    原标题:如何解决电容触摸屏的抗干扰问题? 如何解决电容触摸屏的抗干扰问题?深圳电容触摸屏厂家小编告诉您: 电容触摸屏的抗干扰问题在现在触摸屏厂家是个非常头痛的问题,电容触摸屏的抗干扰是触摸屏的性能要求 ...

  4. 【原创】解决JT2Go二次开发提示license key无效问题

    [原创]解决JT2Go二次开发提示license key无效问题 这东西可能对有些人来说比较有用 上几张图 关键代码 1 IntPtr bassAddr = IntPtr.Zero; 2 foreac ...

  5. 原创如何解决内存不能为“read”或“written”

    原创如何解决内存不能为"read"或"written" 这阵子老是碰到内存错误的提示!!火啊,请教一些「高手」,得到的回答是「Windows就是这样不稳定」之类 ...

  6. Win11安装 (Win11 22H2) 不联网 跳过联网 激活 终极教程(解决:无法跳过联网,糟糕你已断开internet连接等问题)

    @[TOC](Win11安装 (Win11 22H2) 不联网 跳过联网 激活 终极教程(解决:无法跳过联网,糟糕你已断开internet连接等问题)) Win11安装 不联网 跳过联网 终极教程 1 ...

  7. active vue 路由样式保持_Vue 解决父组件跳转子路由后当前导航active样式消失问题...

    举个栗子,导航栏如下图,当前新闻资讯的路由是:localhost:8083/#/new,导航栏样式如图所示: 随便挑个新闻点击后会跳转到子路由:localhost:8083/#/new/newDeta ...

  8. 开发技巧-解决打开谷歌浏览器跳转问题

    开发技巧-解决打开谷歌浏览器跳转问题 参考文章: (1)开发技巧-解决打开谷歌浏览器跳转问题 (2)https://www.cnblogs.com/ChineseLiao/p/10326805.htm ...

  9. 0809-vue(momentjs的使用弄时间撮日期的,父子传值props,生命周期函数beforedestroy与destroyed,黑云项目,解决相同路由跳转报错问题)

    01-momentjs的使用: momentjs的官网: 直通车. <!DOCTYPE html> <html lang="en"> <head> ...

  10. lisp xy轴不等比缩放_解决高缩放等级下的抖动问题

    最近看到 deck.gl 在 medium 上的一篇文章,介绍了解决高缩放等级下「抖动」问题的思路. How (sometimes) assuming the Earth is "flat& ...

最新文章

  1. mysql dml ddldcl权限_MySQL中的DML、DDL、DCL到底是什么呢?
  2. 并不对劲的概率与期望
  3. CentOS中怎样解压rar文件
  4. GCC 关键字inline探究
  5. 逼自己玩命学了3个多月,吃透了Python技术核心!分享给你
  6. 简单实现Popup弹出框添加数据
  7. JS 浏览器扩展storage
  8. mysql innodb_data_file_path_MySQL修改innodb_data_file_path参数的一些注意事项
  9. Siki_Unity_2-9_C#高级教程(未完)
  10. log4j2自定义过滤器_Log4j级别示例–订单,优先级,自定义过滤器
  11. python的编程软件有哪些_python编程工具有哪些
  12. 使用代码辅助生成工具CodeSmith -- 生成NHibernate的映射文件
  13. Ubuntu 和NVIDIA显卡的兼容问题解决
  14. 循环神经网络模型及应用,循环神经网络应用举例
  15. Flutter ExpansionTile 折叠组件的使用
  16. 互联网+医疗解决方案
  17. 我的十几年技术总结(一):从疯狂到无奈
  18. Attention 与Hierarchical Attention Networks 原理
  19. plsql 删除一直在执行_固态硬盘开启Trim后,删除数据究竟能不能恢复?
  20. windows下tomcat8启动脚本代码剖析--catalina.bat

热门文章

  1. 1.3《数据库系统概论》之数据库系统结构和组成(内模式、模式、外模式、人员……)
  2. 使用Python对视频任意矩形区域进行裁剪
  3. linux安装zend,linux安装配置Zend Optimizer详解
  4. 微信公众号图片上传_base64图片上传处理
  5. 学习系统地思考——《第五项修炼》读后感
  6. 【递归入门】组合的输出
  7. Numpy创建正态分布和均匀分布
  8. 旅行商问题 Traveling Salesman Problem(TSP)
  9. java课程综合实训报告_Java ME综合实训报告
  10. php后门 佛像,亲人离世之后,供奉的一些佛像以及神灵物品如何处理