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

2019-07-20 08:47发布

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 ",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;
}

颜 {MOD}标记的地方不太理解,希望高手详细说明一下
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
正点原子
1楼-- · 2019-07-20 13:01
这段代码就是为了排除干扰数据.
康康康康
2楼-- · 2019-07-20 18:29
 精彩回答 2  元偷偷看……
康康康康
3楼-- · 2019-07-20 22:15
康康康康 发表于 2018-4-6 11:51
原子哥,请教一个问题,0xff右移多少位,低位就会出现多少个0,与定义的sta后5位的含义好像有出入啊,在定 ...

刚才漏传了一张图,问题就出在这个截图上
康康康康
4楼-- · 2019-07-21 01:41
 精彩回答 2  元偷偷看……

一周热门 更多>