新手上路
- 积分
- 32
- 金钱
- 32
- 注册时间
- 2018-1-20
- 在线时间
- 5 小时
|
5金钱
本人小白一个,对电容触摸屏中的GT9147_Scan()函数有些疑惑,请原子哥和各位大神指点一下  
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); //读取触摸点的状态
flag1: 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定义
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;
flag2: 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 //非法数据,则忽略此次数据(还原原来的)
{
flag3: 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 //之前就没有被按下
{
flag4: tp_dev.x[0]=0xffff;
tp_dev.y[0]=0xffff;
tp_dev.sta&=0XE0; //清除点有效标记
}
}
if(t>240)t=10;//重新从10开始计数
return res;
}
对这段代码有一下几点疑问,请各位大神和原子哥指点一下:
1.flag1处,与运算后面的表达式(mode&0XF)<6是不是可以不写,因为从GSTID状态寄存器中读取出来的数据mode的低四位不可能大于6,因为GT9147最大支持5点触摸,所以,这个表达式恒成立,所以我觉得(mode&0XF)<6这个表达式可以不写
自己测试了一下,省去(mode&0XF)<6这个限制条件,似乎也真的没有什么影响,请问原子哥写上这个限制条件的目的是什么?
2.为什么只判断触点1的坐标数据是否非法,而不去判断其他触点的坐标数据的合法性呢?是因为flag4处对触点0处的数据进行0xffff复制操作的原因吗?二者有没有原因?它们之间有什么联系?如果没有联系,那么不判断其他触点的合法性该怎样解释?
3.flag3处,将触点0的数据从触点4恢复的目的是什么,在没有触点数据非法的条件下,触点0之前保存的数据是什么,有什么作用,为什么进行保护呢?
4.flag4处,对触点0用0xffff赋值的目的是什么?
|
最佳答案
查看完整内容[请看2#楼]
1,高位还有其他用 啊哥哥,高位是1,你怎么可能小于6?比如最高位是1,你觉得1000 0000会小于6?
2,因为非法的时候,只有单点数据,这叫实践出真知。
3,避免误动作。
4,无效坐标,方便外部程序处理。
|