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

2019-07-20 01:33发布

这两天,有客户问探索者开发板+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 ",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, 下载次数: 736) 2017-2-27 11:18 上传 点击文件名下载附件





友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
10条回答
李小龙
1楼-- · 2019-07-20 16:48
本帖最后由 李小龙 于 2017-10-30 08:26 编辑

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

sunray
2楼-- · 2019-07-20 17:53
我在用STM32F4探索者开发板+4.3寸屏,遇到这样的触摸屏误动作。
就是按了键之后,等几秒这个键会重新触发一次。在应用程序的画面会非常明显。由于许多图标(按键)是空的,所以按过之后会闪一下,但过几秒还会闪一下。即原来按键会被重新触发。
另外就是计算器程序里,1,2这两个按键,按下后等几秒又会亮(但没数字显示)。
我的软件则是一个按钮做开关,按了开之后,过几秒就自动关了。
一抹时光
3楼-- · 2019-07-20 21:14
 精彩回答 2  元偷偷看……
一抹时光
4楼-- · 2019-07-21 00:29
 精彩回答 2  元偷偷看……

一周热门 更多>