OpenEdv-开源电子网

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

触摸屏多点触摸时,触摸点数变化问题如何识别处理?

[复制链接]

1

主题

3

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2016-4-10
在线时间
5 小时
发表于 2016-7-6 00:34:44 | 显示全部楼层 |阅读模式
原子哥:我在学习触摸屏时,发现例程有点小小不如意的地方:就是在多点触摸时,假设食指、中指、无名指和小指同时画四条不同颜色的线,如果中指或无名指松开不再触摸,如何保证此条线断开而其他三条画线持续。你的视频中,三个手指在画时,手指移动方向好像并没有下移,但屏幕显示线条有偏斜了,颜色也变异了。

//定义5个触摸点坐标数据寄存器组启始地址,用连续读方式读出触点所有坐标数据
//共计5个触摸点,5组坐标数据寄存器,每组6个寄存器,X坐标低高,Y坐标低高,尺寸低高
//启始地址分别为0X8150;0X8158;0X8160;0X8168;0X8170;0X8178;
const u16 GT9147_TPX_TBL[5]={GT_TP1_REG,GT_TP2_REG,GT_TP3_REG,GT_TP4_REG,GT_TP5_REG};
//扫描触摸屏(采用查询方式),传入参数mode:0,正常扫描.
//返回值:当前触屏状态.0,触屏无触摸;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使用率
{
        //读取0X814E状态寄存器的数据放在mode变量里面
  GT9147_RD_Reg(GT_GSTID_REG,&mode,1);
        //判断是否有有效按键,要求有数据,且触点数不大于5
   if((mode&0X80)&&((mode&0XF)<6))
  {
          temp=0;
          //清0X814E状态寄存器的标志,将temp启始处1个字节数据写入0X814E中
          GT9147_WR_Reg(GT_GSTID_REG,&temp,1);
  }
  if((mode&0XF)&&((mode&0XF)<6))  //判断触点数有效
  {
            //将点的个数转换为0的位数,有几个触点就在低位端有几个0,
            //后续还有一个取反过程,取反后用于匹配tp_dev.sta定义
            temp=0XFF<<(mode&0XF);
            //保存当前的tp_dev.sta值
   tempsta=tp_dev.sta;
            //TP_PRES_DOWN=0x80;b7:触屏被按下
            //TP_CATH_PRES=0x40;b6:有按键按下了
            //此处取反了temp
   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++)
   {
              //把1左移i位,依次判断第N个触点触摸有效?
              //如何区分在多点触摸时,某点断开在问题?
              if (tp_dev.sta&(1<<i))
              {
                //读取第i个触点的4个坐标数值存入buf数组中
                GT9147_RD_Reg(GT9147_TPX_TBL,buf,4);
                //判断横屏/竖屏,依次保存5组数据到tp_dev的坐标数组中
                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;  //触屏有效,置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;
}


QQ图片20160706001443.png
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2016-4-10
在线时间
5 小时
 楼主| 发表于 2016-7-8 15:20:32 | 显示全部楼层
原子大哥,有没有看到这个贴呀?有没有其他人碰到这个问题?看视频后有没有仔细研究过线条为什么变得这么怪异?没人顶吗?自己先顶一下!
回复 支持 反对

使用道具 举报

0

主题

12

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2016-5-26
在线时间
3 小时
发表于 2016-8-12 17:06:28 | 显示全部楼层
推荐几款不错的触摸屏
https://shop115980747.taobao.com/
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2019-3-15
在线时间
9 小时
发表于 2019-9-30 14:20:53 | 显示全部楼层
当四个触点变成三个点时,没有识别出是原本的哪个触点抬起,就会是这种现象。这种情况一般可以尝试通过获取触摸IC的各个触点的ID来识别。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-29 02:48

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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