OpenEdv-开源电子网

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

触摸屏实验

[复制链接]

19

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2015-7-26
在线时间
28 小时
发表于 2016-3-17 15:35:34 | 显示全部楼层 |阅读模式
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和其他的为什么不检测?

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2016-1-18
在线时间
12 小时
发表于 2016-3-28 16:49:35 | 显示全部楼层
顶上去,我最近也被这触摸屏快搞疯了,感觉注释写得不是很多,(比如mode这个变量在哪里定义的我都找不到,右键“goto definition”根本没用,)你解决了没?如果解决了,能不能教教我?
回复 支持 反对

使用道具 举报

5

主题

24

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
366
金钱
366
注册时间
2016-6-2
在线时间
46 小时
发表于 2016-10-20 20:13:15 | 显示全部楼层
ivandodd 发表于 2016-3-28 16:49
顶上去,我最近也被这触摸屏快搞疯了,感觉注释写得不是很多,(比如mode这个变量在哪里定义的我都找不到, ...

mode就是读取出来的状态寄存器的值
回复 支持 反对

使用道具 举报

11

主题

53

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
360
金钱
360
注册时间
2016-7-16
在线时间
72 小时
发表于 2016-11-2 11:29:27 | 显示全部楼层
真的蒙,楼主现在解决这些逻辑问题了吗?
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-24 16:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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