TA的每日心情 | 奋斗 2016-2-27 20:05 |
---|
签到天数: 181 天 连续签到: 1 天 [LV.7]常住居民III
|
使用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的例程包里,还有一个是在程序中校准参数的例子。它能够很好的校正触屏。可以在程序开始的时候来进行校准。 |
|