新手上路
- 积分
- 44
- 金钱
- 44
- 注册时间
- 2016-4-10
- 在线时间
- 5 小时
|
原子哥:我在学习触摸屏时,发现例程有点小小不如意的地方:就是在多点触摸时,假设食指、中指、无名指和小指同时画四条不同颜色的线,如果中指或无名指松开不再触摸,如何保证此条线断开而其他三条画线持续。你的视频中,三个手指在画时,手指移动方向好像并没有下移,但屏幕显示线条有偏斜了,颜色也变异了。
//定义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;
}
|
-
|