探索者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条回答
sunray
2019-07-20 06:13
本帖最后由 sunray 于 2018-3-9 17:02 编辑

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

一周热门 更多>