新手上路
- 积分
- 43
- 金钱
- 43
- 注册时间
- 2018-7-9
- 在线时间
- 23 小时
|
发表于 2020-2-3 17:24:07
|
显示全部楼层
请问各位大佬有没有遇到如下问题: gt911 1024*600的屏幕会在没有触摸的情况下,错误的进入GT911_Scan 这个回调函数,然后获取的坐标是上次的坐标??
- u8 GT911_Scan(u8 mode)
- {
- u8 buf[4];
- u8 i = 0;
- u8 res = 0;
- u8 temp;
- static u8 t = 0; //控制查询间隔,从而降低CPU占用率
-
- t++;
- if((t%10)==0||t<10) //空闲时,每进入10次CTP_Scan函数才检测1次,从而节省CPU使用率
- {
- GT911_RD_Reg(GT911_GSTID_REG, &mode, 1); //读取触摸点的状态
-
- if(mode&0X80&&((mode&0XF)<6))
- {
- temp=0;
- GT911_WR_Reg(GT_GSTID_REG,&temp,1); //清标志
- }
- if((mode&0XF)&&((mode&0XF)<6))
- {
- temp=0XFF<<(mode&0XF); //将点的个数转换为1的位数,匹配tp_dev.sta定义
- tp_dev.sta=(~temp)|TP_PRES_DOWN|TP_CATH_PRES;
- for(i=0;i<5;i++)
- {
- if(tp_dev.sta&(1<<i)) //触摸有效?
- {
- GT911_RD_Reg(GT911_TPX_TBL[i],buf,4); //读取XY坐标值
- if(tp_dev.touchtype&0X01)//横屏
- {
- tp_dev.x[i]=(((u16)(buf[1]&0X0F)<<8)+buf[0]); //lcddev.width-
- tp_dev.y[i]=((u16)(buf[3]&0X0F)<<8)+buf[2];
- }
- else
- {
- tp_dev.y[i]=((u16)(buf[1]&0X0F)<<8)+buf[0];
- tp_dev.x[i]=((u16)(buf[3]&0X0F)<<8)+buf[2];
- }
- }
- }
- 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 = temp; //恢复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开始计数
- //printf("运行到SCAN\r\n");
- }
- return res;
- }
复制代码 |
|