硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1797|回复: 10
收起左侧

[emWin] 电阻触摸总是会触发上一个位置是什么原因造成的?

[复制链接]

4

主题

9

回帖

64

积分

初级会员

积分
64
发表于 2018-4-25 18:13:22 | 显示全部楼层 |阅读模式
如题,我移植了安富莱的电阻屏触摸扫描函数void TOUCH_Scan(void),但发现一个问题,就是再次按下触摸屏时,会触发上一次触摸的位置,比如按过按键并释放后,在其他位置再按一下,会触发这个按键,而当前触摸位置无响应,请问时什么原因造成的?我分析原因是GUI_PID_StoreState(&State)运行后,并没有执行这个点的数据,而是触摸再次触发后,上一次存储的坐标才被执行,请问这要怎么修改?
回复

使用道具 举报

4

主题

9

回帖

64

积分

初级会员

积分
64
 楼主| 发表于 2018-4-25 19:16:51 | 显示全部楼层
触摸问题如视频了那样子

问题描述.mp4

1.43 MB, 下载次数: 50

视频

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107418
QQ
发表于 2018-4-26 01:01:33 | 显示全部楼层
你移植后的程序是不是没有做释放处理。
回复

使用道具 举报

4

主题

9

回帖

64

积分

初级会员

积分
64
 楼主| 发表于 2018-4-26 09:20:21 | 显示全部楼层
eric2013 发表于 2018-4-26 01:01
你移植后的程序是不是没有做释放处理。

请问释放如何处理,是使用State.Pressed = 0;        GUI_PID_StoreState(&State);来完成的吗
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107418
QQ
发表于 2018-4-27 01:44:32 | 显示全部楼层
caifaraday 发表于 2018-4-26 09:20
请问释放如何处理,是使用State.Pressed = 0;        GUI_PID_StoreState(&State);来完成的吗

对,可以的,详情看下我们新版emWin教程的移植章节,对于触摸部分也做了说明:
http://www.armbbs.cn/forum.php?m ... &extra=page%3D1
回复

使用道具 举报

4

主题

9

回帖

64

积分

初级会员

积分
64
 楼主| 发表于 2018-4-27 22:45:17 | 显示全部楼层
本帖最后由 caifaraday 于 2018-4-27 22:47 编辑
eric2013 发表于 2018-4-27 01:44
对,可以的,详情看下我们新版emWin教程的移植章节,对于触摸部分也做了说明:
http://www.armbbs.cn ...

前辈,这是我的程序,我做了触笔释放,但还是不行,能帮我分析一下吗/* 触笔中断发生 */
    if (XPT2046_PenInt())
    {
        /* 获得原始的ADC值,未滤波 */
        usAdcX = XPT2046_ReadXY(CHX);
        usAdcY = XPT2046_ReadXY(CHY);
        if (TOUCH_PressValid(usAdcX, usAdcY))
        {
            /* 按压20ms之后才开始采集数据 */
            if (s_count >= 20)
            {
                s_usXBuf[s_ucPos] = usAdcX;
                s_usYBuf[s_ucPos] = usAdcY;
                /* 采集20ms(20次)数据进行滤波 */
                s_ucPos++;
                if (s_ucPos >= 20)
                {
                    s_ucPos = 0;
                    /* 对ADC采样的10个点进行软件滤波,得到一个准确触点位置 */
                    g_tTP.usAdcNowX = TOUCH_DataFilter(s_usXBuf, 20);
                    g_tTP.usAdcNowY = TOUCH_DataFilter(s_usYBuf, 20);
                    if (s_down == 0)
                    {
                        s_down = 1;
                        /* 触摸按下事件,将触点信息存入 GUI调取的触摸参数结构体中 */
                        State.x = ((usAdcX-XAdc_Min)*320)/(XAdc_Max-XAdc_Min);//TOUCH_TransX( g_tTP.usAdcNowX, g_tTP.usAdcNowY);
                        State.y = 240-((usAdcY-YAdc_Min)*240)/(YAdc_Max-YAdc_Min);//TOUCH_TransY( g_tTP.usAdcNowX, g_tTP.usAdcNowY);
                        State.Pressed = 1;
                        GUI_PID_StoreState(&State);
                        State.Pressed = 0;
                        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 = ((usAdcX-XAdc_Min)*320)/(XAdc_Max-XAdc_Min);
                            State.y = 240-((usAdcY-YAdc_Min)*240)/(YAdc_Max-YAdc_Min);
                            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)
            {
                s_count--;
                //s_down = 0;
                if (s_count == 0)
                {
                    /* 触摸释放事件 */
                    /* State.x和State.y的数值无需更新,State是全局变量,保存的就是最近一次的数值 */
                    State.Pressed = 0;
                    // State.Layer--;
                    GUI_PID_StoreState(&State);
                    //s_count = 0;
                    s_down = 0;

                    g_tTP.usAdcNowX = 0;
                    g_tTP.usAdcNowY = 0;
                    //STMPE811_ClearInt();      /* 清触笔中断标志 */
                }
            }
            s_ucPos = 0;
        }

    }




复制代码

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107418
QQ
发表于 2018-4-28 01:40:40 | 显示全部楼层
QQ截图20180428013810.png
回复

使用道具 举报

1

主题

3

回帖

6

积分

新手上路

积分
6
发表于 2018-5-21 19:27:07 | 显示全部楼层
本帖最后由 zcgboy 于 2018-5-21 20:32 编辑

我也在为这个问题发愁呢?哪个高手指点一下啊!酬谢!X=40.Y=42
X=40.Y=42
X=761.Y=422
X=761.Y=422
X=761.Y=422
X=761.Y=422
X=761.Y=422
X=761.Y=422
X=761.Y=422
X=761.Y=422
X=760.Y=422
X=760.Y=422
X=760.Y=422

以上是鼠标指针在左上角,触摸笔触摸右下角读出的坐标,所以会出现上一个坐标触发事件,但是为什么,是不是电阻触摸芯片AD转换速度太慢了,把上一次的数据给送上来了!
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107418
QQ
发表于 2018-5-22 02:24:46 | 显示全部楼层
zcgboy 发表于 2018-5-21 19:27
我也在为这个问题发愁呢?哪个高手指点一下啊!酬谢!X=40.Y=42
X=40.Y=42
X=761.Y=422

是不是飞点。
回复

使用道具 举报

1

主题

3

回帖

6

积分

新手上路

积分
6
发表于 2018-5-22 09:49:57 | 显示全部楼层
本帖最后由 zcgboy 于 2018-5-22 09:57 编辑

不是非典,是上一次的历史坐标,所以每次更新坐标时,读取的数据里面夹杂着一次历史坐标,所以emwin就会触发一次历史坐标的焦点事件,而新坐标的事件还要再重新点一下,这个问题缠绕了我一个礼拜,搞的我把下拉选项DROPDOWN都给删掉不用了,压根就选不中!那好,继续使用下拉部件!我怕个人认为这个stmep811设计有点缺陷是的,FIFO的问题
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107418
QQ
发表于 2018-5-22 13:52:53 | 显示全部楼层
zcgboy 发表于 2018-5-22 09:49
不是非典,是上一次的历史坐标,所以每次更新坐标时,读取的数据里面夹杂着一次历史坐标,所以emwin就会触 ...

还有这种情况,我的那个V6的电阻屏也是用的这个811,没有这种现象。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-31 05:52 , Processed in 0.235567 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表