还是接着上次的发问吧:
硬件环境:战舰板+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知道已经没有触摸了呢?
比较急啊,求大神解答!搞了很多天,没有搞明白,到底怎样才能解决问题?
--------------------------------
-好的 太感谢你了
一周热门 更多>