四线电阻触摸屏的采样滤波算法,实践证明很好用的!
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