新手上路
- 积分
- 24
- 金钱
- 24
- 注册时间
- 2019-2-25
- 在线时间
- 3 小时
|
本帖最后由 long5313828 于 2019-2-25 18:17 编辑
关于这个bug的问题,新版的程序依然没有改到位,任然会出现乱点的情况,只是会持续点一个点而已,使用emwin的时候就会发现,出现的原因在于GT9271驱动上。GT9271_Scan函数改为以下这样就行
[mw_shl_code=c,true]//扫描触摸屏(采用查询方式)
//mode:0,正常扫描.
//返回值:当前触屏状态.
//0,触屏无触摸;1,触屏有触摸
u8 GT9271_Scan(u8 mode)
{
u8 buf[4];
vu8 i=0;
u8 res=0;
u16 temp;
u16 tempsta;
static u8 t=0;//控制查询间隔,从而降低CPU占用率
t++;
if((t%10)==0||t<10)//空闲时,每进入10次CTP_Scan函数才检测1次,从而节省CPU使用率
{
GT9271_RD_Reg(GT9271_GSTID_REG,&mode,1); //读取触摸点的状态
if((mode&0x80)&&((mode&0XF)<11))
{
i=0;
GT9271_WR_Reg(GT9271_GSTID_REG,(u8*)&i,1); //清标志
if(mode&0xF) // **这一行就是需要修改的部分,将这个判断包含在上一个if语句里
{
temp=0XFFFF<<(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[9]=tp_dev.x[0]; //保存触点0的数据
tp_dev.y[9]=tp_dev.y[0];
for(i=0;i<10;i++)
{
if(tp_dev.sta&(1<<i)) //触摸有效?
{
GT9271_RD_Reg(GT9271_TPX_TBL,buf,6); //读取XY坐标值
if(tp_dev.touchtype&0X01)//横屏
{
tp_dev.y=((u16)buf[3]<<8)+buf[2];
tp_dev.x=((u16)buf[1]<<8)+buf[0];
}else
{
tp_dev.x=800-(((u16)buf[3]<<8)+buf[2]);
tp_dev.y=((u16)buf[1]<<8)+buf[0];
}
//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[9];
tp_dev.y[0]=tp_dev.y[9];
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&=~TP_PRES_DOWN; //标记按键松开
}else //之前就没有被按下
{
tp_dev.x[0]=0xffff;
tp_dev.y[0]=0xffff;
tp_dev.sta&=0XE000; //清除点有效标记
}
}
if(t>240)t=10;//重新从10开始计数
return res;
}[/mw_shl_code] |
|