OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6241|回复: 15

[急]ucgui中触摸的问题

[复制链接]

17

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2012-8-23
在线时间
0 小时
发表于 2013-6-30 13:56:25 | 显示全部楼层 |阅读模式
还是接着上次的发问吧:
硬件环境:战舰板+7寸电容屏
软件环境:uC/OS+uC/GUI
在移植触摸的时候出现了问题:点击按键的时候,按键就不能释放了,处于一直点击的状态
在扫描触摸的程序里面加了串口输出的代码,发现输出有问题:
u8 buf[7];//一次读取7字节
if((ctp_dev.tpsta&0X80)==0)    return; //有有效触摸,则读取数据,否则直接退出
printf("\ntpsta:%x\r\n",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\r\n",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\r\n",ctp_dev.x);
printf("LCD Y:%d\r\n",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("\ntpsta:%x\r\n",tp_dev.sta);
printf("LCD X:%d\r\n",tp_dev.x);
printf("LCD Y:%d\r\n",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知道已经没有触摸了呢?

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








正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2013-6-30 21:03:52 | 显示全部楼层
关键要了解下ucGUI认为触摸释放的标准是什么?
得到这个才好分析.
如果0,0,不可以,那么0XFFFF,0XFFFF,可以么?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

17

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2012-8-23
在线时间
0 小时
 楼主| 发表于 2013-7-1 09:34:50 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
应该在没有触摸的时候返回0xffff,这样GUI就认为没有触摸了
回复 支持 反对

使用道具 举报

16

主题

77

帖子

0

精华

初级会员

Rank: 2

积分
166
金钱
166
注册时间
2013-6-14
在线时间
8 小时
发表于 2013-7-17 15:55:51 | 显示全部楼层
回复【3楼】lxc115:
---------------------------------
请问你现在设置好没,我也是战舰板+7寸屏,能不能把你移植好的源码分享下呢?这个问题我也纠结好多天了,,,,急。。。。。
回复 支持 反对

使用道具 举报

17

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2012-8-23
在线时间
0 小时
 楼主| 发表于 2013-7-17 16:27:24 | 显示全部楼层
回复【4楼】s1q23:
---------------------------------
搞好了,还是在中断中处理的,就是不知道会不会对之后uC/GUI的使用产生隐患。
我把相关的源码发出来你可以参考一下

gt811.c

6.77 KB, 下载次数: 165

gt811.h

2.09 KB, 下载次数: 138

回复 支持 反对

使用道具 举报

16

主题

77

帖子

0

精华

初级会员

Rank: 2

积分
166
金钱
166
注册时间
2013-6-14
在线时间
8 小时
发表于 2013-7-17 16:28:06 | 显示全部楼层
回复【5楼】lxc115:
--------------------------------
-好的 太感谢你了
回复 支持 反对

使用道具 举报

17

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2012-8-23
在线时间
0 小时
 楼主| 发表于 2013-7-17 16:30:38 | 显示全部楼层
回复【6楼】s1q23:
---------------------------------
你先看看,试试能不能解决
回复 支持 反对

使用道具 举报

16

主题

77

帖子

0

精华

初级会员

Rank: 2

积分
166
金钱
166
注册时间
2013-6-14
在线时间
8 小时
发表于 2013-7-17 16:37:14 | 显示全部楼层
回复【7楼】lxc115:
---------------------------------
if(EXTI_GetITStatus(EXTI_Line10)!=RESET)
这句话报错了,这个库的头文件包含问题我还没怎么搞的懂
能不能把你的整个工程发给我研究研究啊,底子还不够硬啊
回复 支持 反对

使用道具 举报

17

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2012-8-23
在线时间
0 小时
 楼主| 发表于 2013-7-17 17:06:05 | 显示全部楼层
回复【8楼】s1q23:
---------------------------------

实验56 UCOSII+UCGUI实验-7寸电容屏.rar

2.09 MB, 下载次数: 337

回复 支持 反对

使用道具 举报

138

主题

362

帖子

0

精华

高级会员

Rank: 4

积分
997
金钱
997
注册时间
2012-9-17
在线时间
29 小时
发表于 2013-11-12 13:29:57 | 显示全部楼层
我想问一下楼主,你用的是电容屏 ,对吧?   可是ucgui可以做电容屏么?    我记得ucgui里只有接受电阻屏的信号的函数。
回复 支持 反对

使用道具 举报

17

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2012-8-23
在线时间
0 小时
 楼主| 发表于 2013-11-12 15:01:34 | 显示全部楼层
回复【10楼】一个好人:
---------------------------------
可以的,我用的就是原子哥的7寸电容屏,修改一下触摸的函数就行了
回复 支持 反对

使用道具 举报

138

主题

362

帖子

0

精华

高级会员

Rank: 4

积分
997
金钱
997
注册时间
2012-9-17
在线时间
29 小时
发表于 2013-11-12 16:05:29 | 显示全部楼层
回复【11楼】lxc115:
---------------------------------
你的QQ多少?  我加你QQ详聊! 我的QQ814592216
回复 支持 反对

使用道具 举报

17

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2012-8-23
在线时间
0 小时
 楼主| 发表于 2013-11-12 16:41:24 | 显示全部楼层
回复【12楼】一个好人:
---------------------------------
409284490
回复 支持 反对

使用道具 举报

8

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
90
金钱
90
注册时间
2014-4-22
在线时间
0 小时
发表于 2014-5-18 16:37:44 | 显示全部楼层
回复【9楼】lxc115:
---------------------------------
这个程序运行后白屏啊
回复 支持 反对

使用道具 举报

8

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
90
金钱
90
注册时间
2014-4-22
在线时间
0 小时
发表于 2014-5-19 14:41:37 | 显示全部楼层
解决了三天发现是中断和楼主的不一样,擦,中断必须
//触摸屏中断处理
//在中断中扫描有没有有效触摸产生
void EXTI15_10_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line10)!=RESET)
//  if(CT_INT==0)  //有触摸中断
{   
tp_dev.tpsta|=0X80;//标记有有效触摸
GUI_TOUCH_Exec();
// GUI_Exec();
}  
EXTI_ClearITPendingBit(EXTI_Line10);  //清除LINE2上的中断标志位  
// EXTI->R=1<<10;  //清除LINE10上的中断标志位      
}
回复 支持 反对

使用道具 举报

20

主题

143

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2015-8-28
在线时间
108 小时
发表于 2017-1-7 16:56:41 | 显示全部楼层
yujietangying 发表于 2014-5-19 14:41
解决了三天发现是中断和楼主的不一样,擦,中断必须
//触摸屏中断处理
//在中断中扫描有没有有效触摸产生
v ...

中断里面只执行一次GUI_TOUCH_Exec()
不就只读出了Y坐标吗?
菜鸟请大神指教下,添加触摸之后的ucgui不知道怎么整了,
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-29 05:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表