[急]ucgui中触摸的问题

2019-10-15 18:35发布

还是接着上次的发问吧:
硬件环境:战舰板+7寸电容屏
软件环境:uC/OS+uC/GUI
在移植触摸的时候出现了问题:点击按键的时候,按键就不能释放了,处于一直点击的状态
在扫描触摸的程序里面加了串口输出的代码,发现输出有问题:
u8 buf[7];//一次读取7字节 if((ctp_dev.tpsta&0X80)==0)    return; //有有效触摸,则读取数据,否则直接退出 printf(" tpsta:%x ",ctp_dev.tpsta);
  GT811_RD_Reg(CT_READ_XY_REG,buf,1); //先读取一个字节 ctp_dev.tpsta=buf[0]&0X1F; //触摸点标记位,同时清除有效触摸标记

if(ctp_dev.tpsta)                                                //如果有有效触摸 { GT811_RD_Reg(CT_READ_XY_REG,buf,7); printf("tpsta:%x ",ctp_dev.tpsta);
#if CT_EXCHG_XY==1 //调转XY ctp_dev.y=480-(((u16)buf[2]<<8)+buf[3]); //触摸点0坐标 ctp_dev.x=((u16)buf[4]<<8)+buf[5];   ctp_dev.ppr=buf[6];  
#else  ctp_dev.y=((u16)buf[2]<<8)+buf[3]; //触摸点0坐标 ctp_dev.x=800-(((u16)buf[4]<<8)+buf[5]);   ctp_dev.ppr=buf[6];      
#endif     }
printf("LCD X:%d ",ctp_dev.x); printf("LCD Y:%d ",ctp_dev.y);


输出的数据:
tpsta:80 tpsta:1 LCD X:554 LCD Y:263
tpsta:80 tpsta:1 LCD X:554 LCD Y:263
tpsta:80 tpsta:1 LCD X:554 LCD Y:263
tpsta:80 tpsta:1 LCD X:554 LCD Y:263
tpsta:80 tpsta:1 LCD X:554 LCD Y:263
tpsta:80 LCD X:554 LCD Y:263
tpsta:80 LCD X:554 LCD Y:263
tpsta:80 LCD X:554 LCD Y:263
可以发现最后3组数据是没有有效触摸的时候输出的,也就是说,每次我的触摸结束之后会有3次无效的触摸产生,就像我上次说的一样,都在左下角(0,480)的点,这个应该可以认为滤掉。
我是在中断里面执行触摸扫描的:
void EXTI15_10_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line10)!=RESET) // if(CT_INT==0) //有触摸中断 {   ctp_dev.tpsta|=0X80;//标记有有效触摸 GUI_TOUCH_Exec(); }   EXTI->R=1<<10;  //清除LINE10上的中断标志位      } 

网上搜了一下,说在中断里面处理不好,需要采用定时扫描的方式,不知道是不是这个问题导致一直不能释放按键。

后来我仔细想了想,一直触摸的关键原因无非就是GUI没有得到要释放按键的消息,也就是相当于一直在触摸,一直有坐标传送回去。

之前我在小屏上是成功的,因此我又用小屏试验了一下:
u8 TP_Scan(u8 tp) {    if(PEN==0)//有按键按下 { if(tp)TP_Read_XY2(&tp_dev.x,&tp_dev.y);//读取物理坐标 else if(TP_Read_XY2(&tp_dev.x,&tp_dev.y))//读取屏幕坐标 { tp_dev.x=tp_dev.xfac*tp_dev.x+tp_dev.xoff;//将结果转换为屏幕坐标 tp_dev.y=tp_dev.yfac*tp_dev.y+tp_dev.yoff;   if((tp_dev.sta&TP_PRES_DOWN)==0)//之前没有被按下 {   tp_dev.sta=TP_PRES_DOWN|TP_CATH_PRES;//按键按下   tp_dev.x0=tp_dev.x;//记录第一次按下时的坐标 tp_dev.y0=tp_dev.y;       }    } else { if(tp_dev.sta&TP_PRES_DOWN)//之前是被按下的 { tp_dev.sta&=~(1<<7);//标记按键松开 }else//之前就没有被按下 { tp_dev.x0=0; tp_dev.y0=0; tp_dev.x=0xffff; tp_dev.y=0xffff; }     }   printf(" tpsta:%x ",tp_dev.sta); printf("LCD X:%d ",tp_dev.x); printf("LCD Y:%d ",tp_dev.y); return tp_dev.sta&TP_PRES_DOWN;//返回当前的触屏状态
}  
可以看到,小屏在没有触摸的时候一直返回的坐标是零,也是一直有返回坐标的,但是就是能产生BUTTON_REALEASED的消息。我把电容屏的程序也改成类似的,空闲的时候也返回0,这个时候指针就自动指向了(0,0),相当于我一直在触摸(0,0)这个点,而没有像小屏那样,没有触摸产生,只是返回坐标。

总结一下:我的主要问题就是按下按键之后不能弹起,按键一直处于按下状态。只要返回给电容屏坐标,就好像一直在触摸这个点一样,但是串口又没有输出,又没有中断,这样就不应该有触摸产生。
我考虑可能会有一下几个原因:
1.在中断中扫描触摸,而没有采用定时扫描的方式。    //后来我改成定时的,好像也不行,总是一直有触摸
2.是不是和最后的那3次无效触摸有关,导致有效触摸结束之后又迅速触摸了别的地方
3.小屏是一直有返回坐标给GUI,大屏是有触摸的时候才返回坐标给GUI,是不是需要一直返回坐标?
4.在网上查了很多资料,关键问题就是GUI没有得到应该释放按键这个消息,怎么才能让GUI知道没哟触摸,应该释放按键了呢?我看例程里面是有一个触摸的标志位的,怎么和GUI的触摸标志位联系起来从而让GUI知道已经没有触摸了呢?

比较急啊,求大神解答!搞了很多天,没有搞明白,到底怎样才能解决问题?








友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。