OpenEdv-开源电子网

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

F1电容触摸屏实验GT9147_Scan()函数的若干疑问

[复制链接]

1

主题

12

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2018-1-20
在线时间
5 小时
发表于 2018-4-7 10:56:25 | 显示全部楼层 |阅读模式
5金钱
本人小白一个,对电容触摸屏中的GT9147_Scan()函数有些疑惑,请原子哥和各位大神指点一下
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);        //读取触摸点的状态  
                flag1:                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;
                flag2:                                        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                                        //非法数据,则忽略此次数据(还原原来的)  
                                                                {
                flag3:                                                                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&0X8F)==0X80)//无触摸点按下
        {
                if(tp_dev.sta&TP_PRES_DOWN)        //之前是被按下的
                {
                        tp_dev.sta&=~(1<<7);        //标记按键松开
                }else                                                //之前就没有被按下
                {
        flag4:                tp_dev.x[0]=0xffff;
                        tp_dev.y[0]=0xffff;
                        tp_dev.sta&=0XE0;        //清除点有效标记       
                }         
        }        
        if(t>240)t=10;//重新从10开始计数
        return res;
}

对这段代码有一下几点疑问,请各位大神和原子哥指点一下:
      1.flag1处,与运算后面的表达式(mode&0XF)<6是不是可以不写,因为从GSTID状态寄存器中读取出来的数据mode的低四位不可能大于6,因为GT9147最大支持5点触摸,所以,这个表达式恒成立,所以我觉得(mode&0XF)<6这个表达式可以不写
自己测试了一下,省去(mode&0XF)<6这个限制条件,似乎也真的没有什么影响,请问原子哥写上这个限制条件的目的是什么?
     2.为什么只判断触点1的坐标数据是否非法,而不去判断其他触点的坐标数据的合法性呢?是因为flag4处对触点0处的数据进行0xffff复制操作的原因吗?二者有没有原因?它们之间有什么联系?如果没有联系,那么不判断其他触点的合法性该怎样解释?
     3.flag3处,将触点0的数据从触点4恢复的目的是什么,在没有触点数据非法的条件下,触点0之前保存的数据是什么,有什么作用,为什么进行保护呢?
     4.flag4处,对触点0用0xffff赋值的目的是什么?



最佳答案

查看完整内容[请看2#楼]

1,高位还有其他用 啊哥哥,高位是1,你怎么可能小于6?比如最高位是1,你觉得1000 0000会小于6? 2,因为非法的时候,只有单点数据,这叫实践出真知。 3,避免误动作。 4,无效坐标,方便外部程序处理。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-4-7 10:56:26 | 显示全部楼层
1,高位还有其他用 啊哥哥,高位是1,你怎么可能小于6?比如最高位是1,你觉得1000 0000会小于6?
2,因为非法的时候,只有单点数据,这叫实践出真知。
3,避免误动作。
4,无效坐标,方便外部程序处理。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

1

主题

12

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2018-1-20
在线时间
5 小时
 楼主| 发表于 2018-4-8 21:54:31 | 显示全部楼层
正点原子 发表于 2018-4-7 10:56
1,高位还有其他用 啊哥哥,高位是1,你怎么可能小于6?比如最高位是1,你觉得1000 0000会小于6?
2,因为 ...

对于问题1:0XF和0x0F不一样吗?mode&0xF高位不都为0了,只剩下低四位了?
回复

使用道具 举报

1

主题

12

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2018-1-20
在线时间
5 小时
 楼主| 发表于 2018-4-9 18:08:45 | 显示全部楼层
对于问题1:0XF和0x0F不一样吗?mode&0xF高位不都为0了,只剩下低四位了?
回复

使用道具 举报

1

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2018-9-30
在线时间
16 小时
发表于 2020-6-24 16:01:52 | 显示全部楼层
正点原子 发表于 2018-4-7 10:56
1,高位还有其他用 啊哥哥,高位是1,你怎么可能小于6?比如最高位是1,你觉得1000 0000会小于6?
2,因为 ...

  if((mode&0X8F)==0X80)//无触摸点按下
        {
                if(tp_dev.sta&TP_PRES_DOWN)        //之前是被按下的
                {
                        tp_dev.sta&=~(1<<7);        //标记按键松开
                }else                                                //之前就没有被按下
                {
        flag4:                tp_dev.x[0]=0xffff;
                        tp_dev.y[0]=0xffff;
                        tp_dev.sta&=0XE0;        //清除点有效标记      
                }         
        }        
        if(t>240)t=10;//重新从10开始计数
        return res;
}

@正点原子  我也想问一下,什么时候能跳转到这一段代码if((mode&0X8F)==0X80)//无触摸点按下
回复

使用道具 举报

1

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2018-9-30
在线时间
16 小时
发表于 2020-6-24 16:02:57 | 显示全部楼层
正点原子 发表于 2018-4-7 10:56
1,高位还有其他用 啊哥哥,高位是1,你怎么可能小于6?比如最高位是1,你觉得1000 0000会小于6?
2,因为 ...

if((mode&0X8F)==0X80)  
什么时候能跳转到这一句代码??
回复

使用道具 举报

10

主题

97

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
490
金钱
490
注册时间
2019-12-6
在线时间
153 小时
发表于 2020-10-29 12:19:43 | 显示全部楼层
allenA 发表于 2020-6-24 16:02
if((mode&0X8F)==0X80)  
什么时候能跳转到这一句代码??

当mode的低四位等于0的时候 和bit7等于1的时候 就能跳过这个代码 这都看不懂  你得好好复习复习c语言
回复

使用道具 举报

8

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
130
金钱
130
注册时间
2017-10-27
在线时间
36 小时
发表于 2021-8-23 10:07:09 | 显示全部楼层
陶佳不哭 发表于 2020-10-29 12:19
当mode的低四位等于0的时候 和bit7等于1的时候 就能跳过这个代码 这都看不懂  你得好好复习复习c语言

你认为人家看不懂,人家就是问什么状态下bit7等于1和和其他四位等于0,因为最高位表示有按键按下,意思就是说最高位有表示按键按下的时候后面四位应该有数才对
回复

使用道具 举报

0

主题

6

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2021-9-4
在线时间
3 小时
发表于 2021-10-19 21:54:58 | 显示全部楼层
111111111111111111
回复

使用道具 举报

0

主题

6

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2021-9-4
在线时间
3 小时
发表于 2021-10-19 21:55:21 | 显示全部楼层
学习来了学习来了学习来了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-23 16:20

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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