OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 12944|回复: 18

探索者STM32F407开发板 4.3寸电容屏 触摸屏实验 不停清屏(出现非法坐标)的解决办法

[复制链接]

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2017-2-27 11:18:43 | 显示全部楼层 |阅读模式
这两天,有客户问探索者开发板+4.3寸电容屏模块,下载触摸屏实验,按了RST清屏以后,等待1~2分钟,就会出现猛清屏的现象,于是让他发回来检查。
结果两套板子+2个4.3寸屏模块,都有这个现象,把电容屏放到阿波罗上,则问题消失。
调试发现,触摸屏偶尔会抽风,返回一些非法触摸数据(此时并没有触摸),根据这个原因,对代码进行了修改,解决了此bug.
修改:GT9147_Scan函数,即可解决,修改后代码如下:
[mw_shl_code=c,true]//扫描触摸屏(采用查询方式)
//mode:0,正常扫描.
//返回值:当前触屏状态.
//0,触屏无触摸;1,触屏有触摸
u8 GT9147_Scan(u8 mode)
{
        u8 buf[4];
        u8 i=0;
        u8 res=0;
        u8 temp;
        u8 tempsta;
        static u8 t=0;//控制查询间隔,从而降低CPU占用率   
        t++;
        if((t%10)==0||t<10)//空闲时,每进入10次CTP_Scan函数才检测1次,从而节省CPU使用率
        {
                GT9147_RD_Reg(GT_GSTID_REG,&mode,1);        //读取触摸点的状态  
                if(mode&0X80&&((mode&0XF)<6))
                {
                        temp=0;
                        GT9147_WR_Reg(GT_GSTID_REG,&temp,1);//清标志                
                }               
                if((mode&0XF)&&((mode&0XF)<6))
                {
                        temp=0XFF<<(mode&0XF);                //将点的个数转换为1的位数,匹配tp_dev.sta定义
                        tempsta=tp_dev.sta;                        //保存当前的tp_dev.sta值
                        tp_dev.sta=(~temp)|TP_PRES_DOWN|TP_CATH_PRES;
                        tp_dev.x[4]=tp_dev.x[0];        //保存触点0的数据
                        tp_dev.y[4]=tp_dev.y[0];
                        for(i=0;i<5;i++)
                        {
                                if(tp_dev.sta&(1<<i))        //触摸有效?
                                {
                                        GT9147_RD_Reg(GT9147_TPX_TBL,buf,4);        //读取XY坐标值
                                        if(tp_dev.touchtype&0X01)//横屏
                                        {
                                                tp_dev.y=((u16)buf[1]<<8)+buf[0];
                                                tp_dev.x=800-(((u16)buf[3]<<8)+buf[2]);
                                        }else
                                        {
                                                tp_dev.x=((u16)buf[1]<<8)+buf[0];
                                                tp_dev.y=((u16)buf[3]<<8)+buf[2];
                                        }   
                                        printf("x[%d]:%d,y[%d]:%d\r\n",i,tp_dev.x,i,tp_dev.y);
                                }                       
                        }
                        res=1;
                        if(tp_dev.x[0]>lcddev.width||tp_dev.y[0]>lcddev.height)//非法数据(坐标超出了)
                        {
                                if((mode&0XF)>1)                //有其他点有数据,则复第二个触点的数据到第一个触点.
                                {
                                        tp_dev.x[0]=tp_dev.x[1];
                                        tp_dev.y[0]=tp_dev.y[1];
                                        t=0;                                //触发一次,则会最少连续监测10次,从而提高命中率
                                }else                                        //非法数据,则忽略此次数据(还原原来的)  
                                {
                                        tp_dev.x[0]=tp_dev.x[4];
                                        tp_dev.y[0]=tp_dev.y[4];
                                        mode=0X80;               
                                        tp_dev.sta=tempsta;        //恢复tp_dev.sta
                                }
                        }else t=0;                                        //触发一次,则会最少连续监测10次,从而提高命中率
                }
        }
        if((mode&0X1F)==0X00)//无触摸点按下
        {
                if(tp_dev.sta&TP_PRES_DOWN)        //之前是被按下的
                {
                        tp_dev.sta&=~(1<<7);        //标记按键松开
                }else                                                //之前就没有被按下
                {
                        tp_dev.x[0]=0xffff;
                        tp_dev.y[0]=0xffff;
                        tp_dev.sta&=0XE0;        //清除点有效标记       
                }         
        }        
        if(t>240)t=10;//重新从10开始计数
        return res;
}

[/mw_shl_code]

工程见附件: 实验28 触摸屏实验.rar (271.86 KB, 下载次数: 971)
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

16

主题

216

帖子

1

精华

高级会员

Rank: 4

积分
970
金钱
970
注册时间
2016-11-24
在线时间
156 小时
发表于 2017-3-2 15:33:45 | 显示全部楼层
原子哥就改了if((mode&0X1F)==0X00)这句吧,我现在用7寸的屏幕,探索者,不过芯片换成了FT5316,程序和FT5206的一样,但就是会偶尔上电之后出现 鬼触摸(人都没有触摸,但屏幕会得到一个正常的触摸XY坐标值),出现这个问题后,用手触摸一下屏幕就好了,这个问题很奇怪,换了个屏幕也一样,而且还不是每次都出现,就是有时候上电时就检测到了,不知道原子哥以前调试时是否碰到过
回复 支持 1 反对 0

使用道具 举报

0

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2018-3-3
在线时间
12 小时
发表于 2018-3-9 16:52:58 | 显示全部楼层
本帖最后由 sunray 于 2018-3-9 17:02 编辑

对比帖子和示例两个软件不同处就是这:
帖子:        if((mode&0X1F)==0X00)//无触摸点按下
示例:        if((mode&0X8F)==0X80)//无触摸点按下
按照帖子的方法修改后就不停的开关开关,看来问题出处找到了,怎么解决呢?按照示例的方法修改就是隔5秒左右会再触发一次。
回复 支持 1 反对 0

使用道具 举报

0

主题

16

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2017-8-22
在线时间
5 小时
发表于 2017-8-23 11:46:37 | 显示全部楼层
lzq12 发表于 2017-3-2 15:33
原子哥就改了if((mode&0X1F)==0X00)这句吧,我现在用7寸的屏幕,探索者,不过芯片换成了FT5316,程序和FT52 ...

考虑是不是静电问题
回复 支持 反对

使用道具 举报

0

主题

16

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2017-8-22
在线时间
5 小时
发表于 2017-8-23 11:49:14 | 显示全部楼层
这个BUG修正适用于探索者开发板么?
回复 支持 反对

使用道具 举报

0

主题

16

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2017-8-22
在线时间
5 小时
发表于 2017-8-23 13:11:47 | 显示全部楼层
从网盘下载了探索者开发板代码,该bug修复并没有更新到网盘中各示例代码,也没有更新到最新发布的HAL库例程中。
回复 支持 反对

使用道具 举报

13

主题

107

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
472
金钱
472
注册时间
2016-7-15
在线时间
175 小时
发表于 2017-10-29 14:29:30 | 显示全部楼层
我还正准备问这个问题呢
回复 支持 反对

使用道具 举报

13

主题

107

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
472
金钱
472
注册时间
2016-7-15
在线时间
175 小时
发表于 2017-10-29 15:02:18 | 显示全部楼层

探索者STM32F407开发板 4.3寸电容屏触摸屏实验Bug

本帖最后由 李小龙 于 2017-10-30 08:26 编辑

原子哥,探索者STM32F407开发板 4.3寸电容屏 触摸屏实验还有Bug,就是我在RST触屏检测代码里加了个led灯取反,和延时消抖,发现点击一次RST,灯会取反两次,也就是说执行了两次led取反代码,也就说明执行了两次RST清屏,实际仔细观察电容屏也会发现RST的确连续执行了两次,只是平时被手指遮住了,看不见现象而已。

QQ截图20171029145542.png
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2018-3-3
在线时间
12 小时
发表于 2018-3-9 15:55:17 | 显示全部楼层
我在用STM32F4探索者开发板+4.3寸屏,遇到这样的触摸屏误动作。
就是按了键之后,等几秒这个键会重新触发一次。在应用程序的画面会非常明显。由于许多图标(按键)是空的,所以按过之后会闪一下,但过几秒还会闪一下。即原来按键会被重新触发。
另外就是计算器程序里,1,2这两个按键,按下后等几秒又会亮(但没数字显示)。
我的软件则是一个按钮做开关,按了开之后,过几秒就自动关了。
回复 支持 反对

使用道具 举报

1

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2018-8-21
在线时间
9 小时
发表于 2018-11-30 19:34:48 | 显示全部楼层
原子哥,f407的触摸屏我想触摸一次只响应一次查询结果 该怎么做呢?
回复 支持 反对

使用道具 举报

1

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2018-8-21
在线时间
9 小时
发表于 2018-11-30 19:38:43 | 显示全部楼层
李小龙 发表于 2017-10-29 15:02
原子哥,探索者STM32F407开发板 4.3寸电容屏 触摸屏实验还有Bug,就是我在RST触屏检测代码里加了个led灯取 ...

请问一下 你最后是怎么解决这个问题的?
回复 支持 反对

使用道具 举报

13

主题

60

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2019-5-13
在线时间
36 小时
发表于 2019-11-10 11:55:06 | 显示全部楼层
我也遇到了,这个问题好像一直没有解决。。。
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2019-12-2
在线时间
15 小时
发表于 2019-12-5 20:32:06 | 显示全部楼层
同样,一样碰到
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2019-12-23
在线时间
6 小时
发表于 2019-12-23 21:46:16 | 显示全部楼层
按照帖子方法,问题没有根本解决,还是不停出现随机触摸,怎样能根本解决?是硬件问题么???着急
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2019-12-23
在线时间
6 小时
发表于 2019-12-23 21:46:37 | 显示全部楼层
按照帖子方法,问题没有根本解决,还是不停出现随机触摸,怎样能根本解决?是硬件问题么???着急
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2019-11-27
在线时间
27 小时
发表于 2020-1-23 23:50:51 | 显示全部楼层
一抹时光 发表于 2018-11-30 19:34
原子哥,f407的触摸屏我想触摸一次只响应一次查询结果 该怎么做呢?

不停的查询 0X814E 寄存器,判断是否有有效触点,如果有,则读取坐标数据寄存器,得到触点坐标,特别注意,如果 0X814E 读到的值最高位为 1,就必须对该位写 0,否则无法读到下一次坐标数据
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2012-5-26
在线时间
19 小时
发表于 2020-6-7 09:15:20 | 显示全部楼层
请教原子哥:  if(mode&0X80&&((mode&0XF)<6)) 这个判断方式是啥原理?实际使用中发现  if(mode&0X80)抗干扰好了很多
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
149
金钱
149
注册时间
2015-12-26
在线时间
33 小时
发表于 2020-7-11 13:05:40 | 显示全部楼层
17年的问题,到了2020年了,问题还在,不幸踩坑,什么时候能解决?
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

初级会员

Rank: 2

积分
190
金钱
190
注册时间
2018-5-28
在线时间
64 小时
发表于 2021-1-14 17:40:02 | 显示全部楼层
6666666
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 15:39

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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