OpenEdv-开源电子网

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

触摸屏实验小问题求解答

[复制链接]

19

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2015-7-26
在线时间
28 小时
发表于 2016-3-18 13:36:35 | 显示全部楼层 |阅读模式
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定义          将mode转化为temp后把temp存到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&0X8F)==0X80)//无触摸点按下
        {
                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;
}
对于此程序,有几点不懂,求指点:
1.上面蓝色部分应该是三种情况,我逻辑不好,分别是哪种情况?在第三种情况下的两种情况也搞不清?
2.对sta本身含义不理解“b7按下”与“按键按下”是同一种意思吗?
                                                             u8  sta;        //笔的状态                          
                                                            //b7:按下1/松开0;
                                                            //b6:0,没有按键按下;1,有按键按下.
                                                           //b5:保留
                                                           //b4~b0:电容触摸屏按下的点数(0,表示未按下,1表示按下)
3.    在第二种情况下把第一个点坐标保存到第五个点为什么?
               tp_dev.x[4]=tp_dev.x[0];        //保存触点0的数据
              tp_dev.y[4]=tp_dev.y[0];

在检测非法数据时为什么只检测x0坐标,x1和其他的为什么不检测?

最佳答案

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

1,这个你自己理解。 2,不一样。b7是当前触摸屏的状态(是否有手摸在上面),b6则表示曾近是否有过按下状态(当前手指不一定在屏幕上)。 3,因为数据非法。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-3-18 13:36:36 | 显示全部楼层
1,这个你自己理解。  2,不一样。b7是当前触摸屏的状态(是否有手摸在上面),b6则表示曾近是否有过按下状态(当前手指不一定在屏幕上)。 3,因为数据非法。
回复

使用道具 举报

9

主题

167

帖子

0

精华

高级会员

Rank: 4

积分
552
金钱
552
注册时间
2013-12-15
在线时间
29 小时
发表于 2016-3-19 20:46:09 | 显示全部楼层
回复

使用道具 举报

19

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2015-7-26
在线时间
28 小时
 楼主| 发表于 2016-3-19 20:54:21 | 显示全部楼层
正点原子 发表于 2016-3-18 13:36
1,这个你自己理解。  2,不一样。b7是当前触摸屏的状态(是否有手摸在上面),b6则表示曾近是否有过按下状 ...

1.tp_dev.sta的取值最终由读出来的mode决定的,mode的各位又有什么含义?
不懂

2.触点0的坐标从0x8150开始,这是从编程手册上看的
0x8150  R  PxyOk  Reserved
0x8151  R  PxyOk  Reserved
0x8152  R  Reserved
0x8153  R  Reserved
0x8154  R  Reserved
0x8155  R  Reserved
0x8156  R  Reserve
这看着没啥意义啊?
3.  tp_dev.x[4]=tp_dev.x[0];        //保存触点0的数据
     tp_dev.y[4]=tp_dev.y[0];
不知道为什么保存触点0的数据?非法数据只检测触点0就可以吗?
回复

使用道具 举报

19

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2015-7-26
在线时间
28 小时
 楼主| 发表于 2016-3-19 20:55:35 | 显示全部楼层
回复

使用道具 举报

9

主题

167

帖子

0

精华

高级会员

Rank: 4

积分
552
金钱
552
注册时间
2013-12-15
在线时间
29 小时
发表于 2016-3-19 21:08:12 | 显示全部楼层

打酱油,帮你顶一下
我是初学者
专注显示科技 - - - 让每一DOT诠释生命的精彩
TFT显示屏:   https://boy-display.taobao.com
回复

使用道具 举报

4

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2016-1-15
在线时间
20 小时
发表于 2016-4-15 13:52:48 | 显示全部楼层
本帖最后由 XHZSCONGE817 于 2016-4-15 13:54 编辑

针对GT9147第一种情况:是否触摸,并且触摸点是否小于6,第二种:触摸点数是否大于0小于6,第三种:是否触摸,可能理解不对大家相互讨论一下
回复

使用道具 举报

5

主题

54

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
440
金钱
440
注册时间
2016-11-7
在线时间
63 小时
发表于 2017-1-27 13:06:55 | 显示全部楼层
1mode要看数据手册
回复

使用道具 举报

1

主题

12

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2018-1-20
在线时间
5 小时
发表于 2018-4-6 11:29:03 | 显示全部楼层
XHZSCONGE817 发表于 2016-4-15 13:52
针对GT9147第一种情况:是否触摸,并且触摸点是否小于6,第二种:触摸点数是否大于0小于6,第三种:是否触 ...

针对 楼主的问题1:if(mode&0X80&&((mode&0XF)<6))  if语句成立的条件有两个,只有当者同时成立时,才能进入if语句中,这两个条件是,1.当前触摸屏被触摸(b7被置位)2.从GT_GSTID_REG读出来的数据的后四位小于6.
但是,我也有一个疑问,从GT_GSTID_REG读出来的数据的后四位的含义是触摸点的点数,但是触摸点的位数最多是5,也就是后面这个条件一定会成立啊,这个应该怎样解释,原子哥,求指点
回复

使用道具 举报

1

主题

12

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2018-1-20
在线时间
5 小时
发表于 2018-4-6 11:31:58 | 显示全部楼层
针对 楼主的问题1:if(mode&0X80&&((mode&0XF)<6))  if语句成立的条件有两个,只有当者同时成立时,才能进入if语句中,这两个条件是,1.当前触摸屏被触摸(b7被置位)2.从GT_GSTID_REG读出来的数据的后四位小于6. 但是,我也有一个疑问,从GT_GSTID_REG读出来的数据的后四位的含义是触摸点的点数,但是触摸点的位数最多是5,也就是后面这个条件一定会成立啊,这个应该怎样解释,还有为啥只有x[0]y[0]的数据会非法,其他触控点就不会呢?原子哥,求指点
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-19 08:21

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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