四线电阻触摸屏的采样滤波算法,实践证明很好用的!
void TsAdcStart(void) // 自己实现 { } bool IsTsAdcOver(void) // 自己实现 { bool iRes; return iRes; } u16 TsAdcGetX(void) // 自己实现 { u16 iXPhy = 0; return iXPhy; } u16 TsAdcGetY(void) // 自己实现 { u16 iYPhy = 0; return iYPhy; } void delayms(u32 t) // 自己实现 { } u32 TsGetPhyCoord(void) { u8 i = 0; u8 j = 0; u16 arrXPhy[3] = {0}; u16 arrYPhy[3] = {0}; u16 arrMidXPhy[2] = {0}; u16 arrMidYPhy[2] = {0}; u16 deltaX = 0; u16 deltaY = 0; u32 iXYPhy = 0; for (i=0; i<6; i++) { if (i == 0) { delayms(5); // 初次采样前的消抖延时 } // x、y分别取3个物理值作为一组 for (j=0; j<3; j++) { TsAdcStart(); // 自己实现 while (!IsTsAdcOver()); // 自己实现 arrXPhy[j] = TsAdcGetX(); // 自己实现 arrYPhy[j] = TsAdcGetY(); // 自己实现 if (j != 2) { delayms(1); } } // 将一组物理值的中间大小值分别取出 arrXPhy[1] = MIDDLE(arrXPhy[0], arrXPhy[1], arrXPhy[2]); arrYPhy[1] = MIDDLE(arrYPhy[0], arrYPhy[1], arrYPhy[2]); if (i < 2) // 记录最初两组得到的中间值 { arrMidXPhy[i] = arrXPhy[1]; arrMidYPhy[i] = arrYPhy[1]; } else // 记录最初两组之后得到的中间值(若有必要) { // 把数组的第1个值移到第0个值处,以便第1个值处能存入新值 arrMidXPhy[0] = arrMidXPhy[1]; arrMidYPhy[0] = arrMidYPhy[1]; // 将新值存入数组第1个值处 arrMidXPhy[1] = arrXPhy[1]; arrMidYPhy[1] = arrYPhy[1]; // 本段代码每次都把[1]处值移到[0]处,再把新值存入[1]处 } if (i > 0) { deltaX = arrMidXPhy[0] - arrMidXPhy[1]; deltaY = arrMidYPhy[0] - arrMidYPhy[1]; if (ABS(deltaX)>2 || ABS(deltaY)>2) { // 若最初两组采样数据不合要求,则需继续采样, // 直到采样符合要求或达到允许的最大采样次数后结束采样 delayms(2); continue; } else { // 采样结果符合要求,结束本次触摸采样 break; } } else { // 初次外层循环后要隔段时间再进行第下次循环 delayms(5); } } // 求x、y两组物理中间值的平均值 arrMidXPhy[0] = (arrMidXPhy[0] + arrMidXPhy[1]) >> 1; arrMidYPhy[0] = (arrMidYPhy[0] + arrMidYPhy[1]) >> 1; iXYPhy = arrMidXPhy[0]; iXYPhy <<= 16; iXYPhy |= arrMidYPhy[0]; return iXYPhy; }
原文地址:http://blog.csdn.net/dcx1205/article/details/45753377