OpenEdv-开源电子网

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

开发板emWin例程,自动触发屏幕点击回调函数。

[复制链接]

1

主题

8

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2014-7-25
在线时间
4 小时
发表于 2016-6-6 16:55:21 | 显示全部楼层 |阅读模式
10金钱
这两天在学习emWin的时候,发现有两个问题。
1.不定时会在鼠标所停留位置触发一次鼠标按下事件,仅是按下事件没有松开事件。如果停留的位置是一个button的话,就是触发WM_NOTIFICATION_CLICKED而不触发WM_NOTIFICATION_RELEASED
  同时界面上能看到button处于选中的状态。
2.不定时的出现界面卡死(操作系统的所有任务正常运行)。这个问题在http://www.openedv.com/thread-70174-1-1.html 帖子中说是代码的bug,我使用新的代码发现确实没有这个问题。
我使用的开发板是Explorer版,用的屏为4.3的电容屏,例程是“EMWIN实验14 GUIBulider使用“和“EMWIN实验16 BUTTON位图显示” ,其他的例程我估计也有相应的问题,因为我按照"STM32F4 EMWIN开发手册_V3.1.pdf"进行移植时,新工程就会出现上面的问题。
上面两个问题出现的时间不定,一般为程序运行后3-10分钟。
下面是我运行“EMWIN实验14 GUIBulider使用“时的截图。
首先下载代码,然后点击一下"OK"将鼠标放到OK按钮上,这里没有显示鼠标。
2.jpg
然后等待一段时间就会发现,OK按钮自动处于选中状态。
1.jpg
    如果使用的是“EMWIN实验16 BUTTON位图显示”例程,将WM_NOTIFICATION_RELEASED事件的内容复制给WM_NOTIFICATION_CLICKED事件,正常的试验现象是按钮按下灯亮(蜂鸣器响),按钮松开灯灭(蜂鸣器不响)。可是如果将鼠标放到LED的按钮上,过一段时间就会发现LED灯亮,而且不灭,直到触屏屏幕任意位置。
    这是不是也是代码的bug啊,另外,我也想知道上面帖子中死机的bug出在哪啊,在我里工程中应该如何修改才能解决这两个问题。

最佳答案

查看完整内容[请看2#楼]

这个应该是驱动bug,GT9147驱动老是出问题!给你发一个专门针对4.3寸GT9147驱动芯片版本的emwin移植例程,只是重新写了GUI_X_Touch_Analog.c这个文件,用这个文件替换到你原来工程中的就可以了。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2016-6-6 16:55:22 | 显示全部楼层
本帖最后由 zuozhongkai 于 2016-6-7 10:05 编辑

这个应该是驱动bug,GT9147驱动老是出问题!给你发一个专门针对4.3寸GT9147驱动芯片版本的emwin移植例程,只是重新写了GUI_X_Touch_Analog.c这个文件,用这个文件替换到你原来工程中的就可以了。
EMWIN实验14 GUIBulider使用(GT9147专用).rar (3.91 MB, 下载次数: 485)
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2014-7-25
在线时间
4 小时
 楼主| 发表于 2016-6-7 13:32:36 | 显示全部楼层
zuozhongkai 发表于 2016-6-7 10:03
这个应该是驱动bug,GT9147驱动老是出问题!给你发一个专门针对4.3寸GT9147驱动芯片版本的emwin移植例程, ...

感谢您的回复,是的,我也发现是查询读点的函数有问题。我用7寸屏就没有任何问题。主要是读0X814E寄存器时,就算没有坐标按下也能读到最高位置一(坐标准备好)。而且这个寄存器的第五位和第四位表示的含义也不明确。第四位置一表示有按键按下,但是我按键按下时寄存器值为0x81,第四位并没有置位。
最后我仿照7寸屏驱动的u8 FT5206_Scan(u8 mode)处理函数从新写了一下u8 GT9147_Scan(u8 mode)函数,目前还没有发现其他问题。我先用我的扫描函数继续测试一下吧,等出现什么问题用这个新的GUI_X_Touch_Analog文件。下面是我用的扫描函数
u8 GT9147_Scan(u8 mode)
{
        u8 buf[4];
        u8 i=0;
        u8 res=0;
        u8 temp = 0;
        u8 tempsta;
        static u8 t=0;//控制查询间隔,从而降低CPU占用率   
       
        int orgX = 0;
        int orgY = 0;
       
       
        t++;
        if((t%10)==0||t<10)//空闲时,每进入10次CTP_Scan函数才检测1次,从而节省CPU使用率
        {
                GT9147_RD_Reg(GT_GSTID_REG,&mode,1);        //读取触摸点的状态  
                GT9147_WR_Reg(GT_GSTID_REG,&temp,1);//每次读都清一下标志
//                 if((mode&0X80&&((mode&0XF)<6))||(mode&0x20))
                if((mode&0X80&&((mode&0XF)<= 5)))                //坐标准备好,有按键按下,按键数小于等于5
                {                
                        if((mode&0XF)&&((mode&0XF)<6))                //按键数大于0小于6
                        {
                                temp=0XFF<<(mode&0XF);                //将点的个数转换为1的位数,匹配tp_dev.sta定义
                                tempsta=tp_dev.sta;                        //保存当前的tp_dev.sta值
                                tp_dev.sta=(~temp)|TP_PRES_DOWN|TP_CATH_PRES;
//                                tp_dev.x[4]=tp_dev.x[0];        //保存触点0的数据
//                                tp_dev.y[4]=tp_dev.y[0];
                                orgX = tp_dev.x[0];
                                orgY = tp_dev.y[0];
                               
                                for(i=0;i<5;i++)
                                {
                                        if(tp_dev.sta&(1<<i))        //触摸有效?
                                        {
                                                GT9147_RD_Reg(GT9147_TPX_TBL,buf,4);        //读取XY坐标值
                                                if(tp_dev.touchtype&0X01)//横屏
                                                {
                                                        tp_dev.y=((u16)buf[1]<<8)+buf[0];
                                                        tp_dev.x=800-(((u16)buf[3]<<8)+buf[2]);
                                                }else
                                                {
                                                        tp_dev.x=((u16)buf[1]<<8)+buf[0];
                                                        tp_dev.y=((u16)buf[3]<<8)+buf[2];
                                                }  
                                                //printf("x[%d]:%d,y[%d]:%d\r\n",i,tp_dev.x,i,tp_dev.y);
                                        }                       
                                }
                                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=tempsta;        //恢复tp_dev.sta
//                                        }
                                        tp_dev.x[0] = orgX;
                                        tp_dev.y[0] = orgY;                //数据非法,使用上次触发数据
                                }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开始计数
        return res;
}
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2016-6-7 14:47:02 | 显示全部楼层
balabala 发表于 2016-6-7 13:32
感谢您的回复,是的,我也发现是查询读点的函数有问题。我用7寸屏就没有任何问题。主要是读0X814E寄存器 ...

行,你先测试一下你的这个函数,如果没问题的话可以公开出来,防止其他人也遇到这个问题
开往春天的手扶拖拉机
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2014-7-25
在线时间
4 小时
 楼主| 发表于 2016-6-7 16:45:02 | 显示全部楼层
zuozhongkai 发表于 2016-6-7 14:47
行,你先测试一下你的这个函数,如果没问题的话可以公开出来,防止其他人也遇到这个问题

我的函数虽然解决了上面的问题,但是触摸屏变的不灵敏了。我决定还是用你的那个例程。你的那个跑起来非常流畅,官方果然厉害。
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2016-6-7 16:50:12 | 显示全部楼层
balabala 发表于 2016-6-7 16:45
我的函数虽然解决了上面的问题,但是触摸屏变的不灵敏了。我决定还是用你的那个例程。你的那个跑起来非常 ...

我那个也是暂缓之计啊,最根本的解决方法就是带GT9147的驱动,但是这个bug出现的很没规律,让人蛋疼啊,改个代码要等好久问题才出现,当时弄了一天实在受不了了就没弄了。
开往春天的手扶拖拉机
回复

使用道具 举报

0

主题

16

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2017-8-22
在线时间
5 小时
发表于 2017-8-22 18:02:38 | 显示全部楼层
zuozhongkai 发表于 2016-6-7 16:50
我那个也是暂缓之计啊,最根本的解决方法就是带GT9147的驱动,但是这个bug出现的很没规律,让人蛋疼啊, ...

请问这个问题有彻底解决么?最近在探索板子上碰到类似问题。
回复

使用道具 举报

0

主题

16

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2017-8-22
在线时间
5 小时
发表于 2017-8-23 07:12:24 | 显示全部楼层
zuozhongkai 发表于 2016-6-7 16:50
我那个也是暂缓之计啊,最根本的解决方法就是带GT9147的驱动,但是这个bug出现的很没规律,让人蛋疼啊, ...

在网盘上下载,解压后的gt9147.c的最新更新日期为15年5月,是最新的么?
回复

使用道具 举报

0

主题

16

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2017-8-22
在线时间
5 小时
发表于 2017-8-23 15:29:45 | 显示全部楼层
zuozhongkai 发表于 2016-6-6 16:55
这个应该是驱动bug,GT9147驱动老是出问题!给你发一个专门针对4.3寸GT9147驱动芯片版本的emwin移植例程, ...

“这个应该是驱动bug,GT9147驱动老是出问题”,这个确实解决了么?
回复

使用道具 举报

0

主题

16

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2017-8-22
在线时间
5 小时
发表于 2017-8-23 15:31:13 | 显示全部楼层
帖子http://www.openedv.com/forum.php?mod=viewthread&tid=95168&highlight=%B5%E7%C8%DD%C6%C1中提到仍有bug
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-23 07:46

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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