OpenEdv-开源电子网

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

7寸触摸屏移植过程中触摸部分的问题求助

[复制链接]

17

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2012-8-23
在线时间
0 小时
发表于 2013-6-26 22:20:29 | 显示全部楼层 |阅读模式
接着上次求助的关于7寸电容屏例程的移植,搞了几天,移植好了,可以正常显示了,还是头文件包含的问题。
但是接下来移植gt811触摸的驱动就又出现了问题:只要程序一运行,就自动默认一直在触摸电容屏的左下角,坐标为(0,480),用串口来输出看的话就是一直输出的是左下角的坐标。
我工程中移植了ucos和ucgui,ucos中新建一个touch_task每隔10ms来扫描是否有触摸,代码如下:
void touch_task(void *pdata)
{  
while(1)
{
GUI_TOUCH_Exec();
delay_ms(10);
  }
}

触摸屏的中断处理函数如下:

//触摸屏中断处理
void EXTI15_10_IRQHandler(void)
{
  if(CT_INT==0) //有触摸中断
{  
ctp_dev.tpsta|=0X80;//标记有有效触摸
}  
EXTI->R=1<<10;  //清除LINE10上的中断标志位     


中断中就置位有效触摸标记,然后在gui中扫描:
int  GUI_TOUCH_X_MeasureX(void) {
ctp_dev.scan();
printf(" LCD X:%x\r\n",ctp_dev.x);
return ctp_dev.x;
}

int  GUI_TOUCH_X_MeasureY(void) {
ctp_dev.scan();
printf(" LCD Y:%x\r\n",ctp_dev.y);
return ctp_dev.y;
}

我自己看着感觉没什么问题,触摸也能检测到,但是就是空闲没触摸的时候会默认触摸左下角,很奇怪。
用原子哥的例程就没有这个问题,唯一和原子哥有区别的就是我是主要用库函数编程,直接用的例程中sys.c文件中的函数,是寄存器版本的。其中在设置NVIC是,没有NVIC->IPR,我改为了NVIC->IP,在设置响应优先级和抢断优先级的时候。

不知各位大神有什么指教?








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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-6-27 00:05:16 | 显示全部楼层
回复【楼主位】lxc115:
---------------------------------
IP和IPR不能等同使用哦!!
下次我发布个最新版本的system文件夹,支持stm32f10x.h的.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

17

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2012-8-23
在线时间
0 小时
 楼主| 发表于 2013-6-27 09:37:07 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
那原子哥,如果我把寄存器的代码对照着全部换成库函数版本的,应该就没问题了吧?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-6-27 10:34:30 | 显示全部楼层
没问题
回复 支持 反对

使用道具 举报

17

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2012-8-23
在线时间
0 小时
 楼主| 发表于 2013-6-27 12:31:52 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
希望原子哥能尽快出个最新版本的sys.c啊
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-6-27 15:07:58 | 显示全部楼层
来了

SYSTEM.rar

11.03 KB, 下载次数: 131

回复 支持 反对

使用道具 举报

17

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2012-8-23
在线时间
0 小时
 楼主| 发表于 2013-6-27 19:55:51 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
原子哥,好像有问题的,我在你给的例程里输出tpsta和触摸的坐标:
u8 buf[34];//一次读取34字节
if((ctp_dev.tpsta&0X80)==0)return; //有有效触摸,则读取数据,否则直接退出
printf(" tpsta:%x\r\n",ctp_dev.tpsta);

   GT811_RD_Reg(CT_READ_XY_REG,buf,34); //一次读取34个字节
ctp_dev.tpsta=buf[0]&0X1F; //触摸点标记位,同时清除有效触摸标记
printf(" tpsta:%x\r\n",ctp_dev.tpsta);

#if CT_EXCHG_XY==1 //调转XY
ctp_dev.y[0]=480-(((u16)buf[2]<<8)+buf[3]); //触摸点0坐标
ctp_dev.x[0]=((u16)buf[4]<<8)+buf[5];   
ctp_dev.ppr[0]=buf[6];  
ctp_dev.y[1]=480-(((u16)buf[7]<<8)+buf[8]); //触摸点1坐标
ctp_dev.x[1]=((u16)buf[9]<<8)+buf[10];   
ctp_dev.ppr[1]=buf[11];
ctp_dev.y[2]=480-(((u16)buf[12]<<8)+buf[13]);//触摸点2坐标
ctp_dev.x[2]=((u16)buf[14]<<8)+buf[15];   
ctp_dev.ppr[2]=buf[16];    
ctp_dev.y[3]=480-(((u16)buf[17]<<8)+buf[24]);//触摸点3坐标
ctp_dev.x[3]=((u16)buf[25]<<8)+buf[26];   
ctp_dev.ppr[3]=buf[27];
ctp_dev.y[4]=480-(((u16)buf[28]<<8)+buf[29]);//触摸点4坐标
ctp_dev.x[4]=((u16)buf[30]<<8)+buf[31];   
ctp_dev.ppr[4]=buf[32];
#else 
ctp_dev.y[0]=((u16)buf[2]<<8)+buf[3]; //触摸点0坐标
ctp_dev.x[0]=800-(((u16)buf[4]<<8)+buf[5]);   
ctp_dev.ppr[0]=buf[6];  
ctp_dev.y[1]=((u16)buf[7]<<8)+buf[8]; //触摸点1坐标
ctp_dev.x[1]=800-(((u16)buf[9]<<8)+buf[10]);   
ctp_dev.ppr[1]=buf[11];
ctp_dev.y[2]=((u16)buf[12]<<8)+buf[13]; //触摸点2坐标
ctp_dev.x[2]=800-(((u16)buf[14]<<8)+buf[15]);   
ctp_dev.ppr[2]=buf[16];    
ctp_dev.y[3]=((u16)buf[17]<<8)+buf[24]; //触摸点3坐标
ctp_dev.x[3]=800-(((u16)buf[25]<<8)+buf[26]);   
ctp_dev.ppr[3]=buf[27];
ctp_dev.y[4]=((u16)buf[28]<<8)+buf[29]; //触摸点4坐标
ctp_dev.x[4]=800-(((u16)buf[30]<<8)+buf[31]);   
ctp_dev.ppr[4]=buf[32];
#endif  

printf(" LCD X:%d\r\n",ctp_dev.x[0]);
printf(" LCD Y:%d\r\n",ctp_dev.y[0]);

输出的数据:
tpsta:80
tpsta:1
LCD X:583
LCD Y:187
 
tpsta:81
tpsta:1
LCD X:583
LCD Y:187
 
tpsta:81
tpsta:1
LCD X:583
LCD Y:187
 
tpsta:81
tpsta:1
LCD X:583
LCD Y:187
 
tpsta:81
tpsta:0
LCD X:0
LCD Y:480
 
tpsta:80
tpsta:0
LCD X:0
LCD Y:480

可以看到,可以检测到触摸,但是空闲的时候tpsta=80,说明一直是有触摸的,而且坐标就是(0,480)。
是不是有问题啊,这样看来这个屏幕就是一直有触摸的,一直产生中断,所以tpsta一直是80,原子哥,求解啊。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-6-27 21:37:44 | 显示全部楼层
加入有效点判断,滤掉这几个无效的坐标.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-18 10:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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