|
最近客户反映V5开发板的电阻触摸屏在emWin例子的使用上存在问题,问题现象:触摸抬起的时候会有一个多余的飞点。
(注意,只有存在这个问题的客户需要注意此问题,不存在这个问题的客户也可以修改为此触摸方法,让触摸更稳定。)
下面运行的是路径:STM32-V5开发板光盘A -> 01.开发板例子 -> 96.emWin触摸校准(仅电阻屏,电容屏无需校准)-> emWin触摸校准例子
出现这个问题的解决办法如下:
1. 从工程中的bsp_touch.c文件中找到TOUCH_Scan函数:
2. 替换TOUCH_Scan为如下内容,然后全工程编译即可 。
void TOUCH_Scan(void)
{
uint16_t usAdcX;
uint16_t usAdcY;
static uint16_t s_usXBuf[SAMPLE_COUNT];
static uint16_t s_usYBuf[SAMPLE_COUNT];
static uint8_t s_ucPos = 0;
static uint8_t s_count = 0;
static uint8_t s_down = 0;
static uint16_t s_usSaveAdcX, s_usSaveAdcY; /* 用于触笔抬起事件,保存按下和移动的最后采样值 */
/* 获得原始的ADC值,未滤波 */
if (g_ChipID == IC_8875)
{
/* 如果主程序正在访问RA8875,则丢弃本次触摸采集,避免影响显示 */
if (RA8875_IsBusy())
{
return;
}
usAdcX = RA8875_TouchReadX();
usAdcY = RA8875_TouchReadY();
}
else
{
if (TSC2046_PenInt())
{
/* 如果主程序正在访问其他SPI外设,则丢弃本次触摸采集 */
if (bsp_SpiBusBusy())
{
return;
}
usAdcX = TSC2046_ReadAdc(ADC_CH_X);
usAdcY = TSC2046_ReadAdc(ADC_CH_Y);
}
else
{
usAdcX = 0;
usAdcY = 0;
}
}
if (TOUCH_PressValid(usAdcX, usAdcY))
{
/* 按压30ms之后才开始采集数据 */
if (s_count >= 30)
{
s_usXBuf[s_ucPos] = usAdcX;
s_usYBuf[s_ucPos] = usAdcY;
/* 采集10ms数据进行滤波 */
if (++s_ucPos >= SAMPLE_COUNT)
{
s_ucPos = 0;
/* 对ADC采样值进行软件滤波 */
g_tTP.usAdcNowX = TOUCH_DataFilter(s_usXBuf, SAMPLE_COUNT);
g_tTP.usAdcNowY = TOUCH_DataFilter(s_usYBuf, SAMPLE_COUNT);
if (s_down == 0)
{
s_down = 1;
/* 触摸按下事件 */
State.x = TOUCH_TransX( g_tTP.usAdcNowX, g_tTP.usAdcNowY);
State.y = TOUCH_TransY( g_tTP.usAdcNowX, g_tTP.usAdcNowY);
State.Pressed = 1;
GUI_PID_StoreState(&State);
s_usSaveAdcX = g_tTP.usAdcNowX;
s_usSaveAdcY = g_tTP.usAdcNowY;
}
else
{
if (TOUCH_MoveValid(s_usSaveAdcX, s_usSaveAdcY, g_tTP.usAdcNowX, g_tTP.usAdcNowY))
{
/* 触摸移动事件 */
State.x = TOUCH_TransX( g_tTP.usAdcNowX, g_tTP.usAdcNowY);
State.y = TOUCH_TransY( g_tTP.usAdcNowX, g_tTP.usAdcNowY);
State.Pressed = 1;
GUI_PID_StoreState(&State);
s_usSaveAdcX = g_tTP.usAdcNowX;
s_usSaveAdcY = g_tTP.usAdcNowY;
}
else
{
g_tTP.usAdcNowX = 0; /* for debug stop */
}
}
}
}
else
{
s_count++;
}
}
else
{
if (s_count > 0)
{
if (--s_count == 0)
{
/* 触摸释放事件 */
State.x = -1;
State.y = -1;
State.Pressed = 0;
GUI_PID_StoreState(&State);
s_count = 0;
s_down = 0;
g_tTP.usAdcNowX = 0;
g_tTP.usAdcNowY = 0;
}
}
s_ucPos = 0;
}
}
==========================================================
修改后就不存在飞点问题了,现象如下:
|
|