OpenEdv-开源电子网

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

触摸屏实验中 u8 GT9147_Scan(u8 mode)

[复制链接]

15

主题

34

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
224
金钱
224
注册时间
2016-11-30
在线时间
42 小时
发表于 2016-12-20 19:50:39 | 显示全部楼层 |阅读模式
2金钱
u8 GT9147_Scan(u8 mode)
{
        u8 buf[4];
        u8 i=0;
        u8 res=0;
        u8 temp;
        u8 tempsta;
        static u8t=0;//控制查询间隔,从而降低CPU占用率   
        t++;
       if((t%10)==0||t<10)//空闲时,每进入10CTP_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;
}

颜色标记的地方不太理解,希望高手详细说明一下

最佳答案

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

这段代码就是为了排除干扰数据.
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2016-12-20 19:50:40 | 显示全部楼层
这段代码就是为了排除干扰数据.
回复

使用道具 举报

1

主题

12

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2018-1-20
在线时间
5 小时
发表于 2018-4-6 11:51:28 | 显示全部楼层
正点原子 发表于 2016-12-20 19:50
这段代码就是为了排除干扰数据.

捕获.PNG 原子哥,请教一个问题,0xff右移多少位,低位就会出现多少个0,与定义的sta后5位的含义好像有出入啊,在定义中是定义1表示按下,是不是应该取反一下?
回复

使用道具 举报

1

主题

12

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2018-1-20
在线时间
5 小时
发表于 2018-4-6 11:53:17 | 显示全部楼层
康康康康 发表于 2018-4-6 11:51
原子哥,请教一个问题,0xff右移多少位,低位就会出现多少个0,与定义的sta后5位的含义好像有出入啊,在定 ...

刚才漏传了一张图,问题就出在这个截图上
回复

使用道具 举报

1

主题

12

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2018-1-20
在线时间
5 小时
发表于 2018-4-6 11:54:14 | 显示全部楼层
康康康康 发表于 2018-4-6 11:53
刚才漏传了一张图,问题就出在这个截图上

捕获1.PNG 刚才漏传了一张图,问题就出在这个截图上
回复

使用道具 举报

30

主题

188

帖子

0

精华

高级会员

Rank: 4

积分
594
金钱
594
注册时间
2014-4-3
在线时间
74 小时
发表于 2021-3-20 00:00:05 | 显示全部楼层
看不懂,不知道排除干扰原理是什么?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-28 07:13

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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