OpenEdv-开源电子网

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

STM32F4开发板 实验28触摸屏实验中 u8 GT9147_Scan(u8 mode)和GT9147驱动有点疑惑

[复制链接]

22

主题

104

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2015-5-4
在线时间
34 小时
发表于 2016-4-22 10:38:28 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 shblh 于 2016-4-22 16:59 编辑

原子大哥和各位大神,对STM32F4开发板 实验28触摸屏实验中 u8 GT9147_Scan(u8 mode)这个函数有点疑惑
贴代码如下:

u8 GT9147_Scan(u8 mode)
{
        u8 buf[4];
        u8 i=0;
        u8 res=0;
        u8 temp;
        u8 tempsta;
        static u8t=0;//控制查询间隔,从而降低CPU占用率   
        t++;
       if((t%10)==0||t<10)//空闲时,每进入10CTP_Scan函数才检测1,从而节省CPU使用率
        {
               GT9147_RD_Reg(GT_GSTID_REG,&mode,1);       //读取触摸点的状态  
               if(mode&0X80&&((mode&0XF)<6))
               {
                       temp=0;
                      GT9147_WR_Reg(GT_GSTID_REG,&temp,1);//清标志               
               }               
               if((mode&0XF)&&((mode&0XF)<6))
               {
                      temp=0XFF<<(mode&0XF);               //将点的个数转换为1的位数,匹配tp_dev.sta定义         将mode转化为temp后把temp存到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];

                       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
                               }

                       }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;
}

对于此程序,有点不懂:1、红色粗体标记的地方,为什么这个时候要保存触电0的数据到触电4呢?
2、GT9147读出来的触电坐标不需要根据LCD的分辨率吧进行转换吗?代码中好像没有进行转换?
3、蓝色粗体标记的地方,这部分代码有什么意义??
4、绿色粗体标记的地方,有非法数据,为什么只是对触点1的数据进行了处理?为什么这么处理呢?
5、该触摸屏可以支持5点触摸,但我实际测试的时候,比如两个点同时按下去,会直接用红色线连成线??是不是最好只是一个点触摸会比较好???
6、根据GT9147编程手册P13-P16的介绍对[size=15.199999809265137px]GT9147_Scan函数的疑惑:

QQ截图20160422150457.png QQ截图20160422150837.png QQ截图20160422150845.png QQ截图20160422150856.png

6.1、
上图一(GT9147编程手册P13)显示的0x8150  R  PxyOk  Reserved   
                                                           0x8151  R  PxyOk  Reserved
上图二(GT9147编程手册P14)显示0X8178~0x817B才是第5个触电的坐标
例程中读取5个触电的坐标信息是读0X8150~0x8153、0X8158~0x815B、0X8160~0x8163、0X8168~0x816B、0X8170~0x8173这些寄存器读出的,这样处理的是对的吗??
6.2、
上图三(GT9147编程手册P15)怎么对0x8150 1.png 又是这么描述?
0x8150这个地址怎么对应两个解释呢??

最佳答案

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

这些问题,楼主自己一一验证就知道了。手册不一定对。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

22

主题

104

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2015-5-4
在线时间
34 小时
 楼主| 发表于 2016-4-22 15:25:11 | 显示全部楼层
本帖最后由 shblh 于 2016-4-22 21:12 编辑

@正点原子@各位大神
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2016-4-22 10:38:29 | 显示全部楼层
这些问题,楼主自己一一验证就知道了。手册不一定对。
回复

使用道具 举报

22

主题

104

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2015-5-4
在线时间
34 小时
 楼主| 发表于 2016-4-25 11:35:37 | 显示全部楼层
本帖最后由 shblh 于 2016-4-25 11:36 编辑
正点原子 发表于 2016-4-23 13:49
这些问题,楼主自己一一验证就知道了。手册不一定对。

if((mode&0XF)&&((mode&0XF)<6))
               {
                      temp=0XFF<<(mode&0XF);               //将点的个数转换为1的位数,匹配tp_dev.sta定义         将mode转化为temp后把temp存到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];

                       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
                               }
                       }else t=0;                                     //触发一次,则会最少连续监测10次,从而提高命中率
               }
原子大哥,如果是5个点同时按下,然后第一个点超出范围,按程序的话,就是   tp_dev.x[0]=tp_dev.x[4]; tp_dev.y[0]=tp_dev.y[4];,可是上面程序已经读取坐标到tp_dev.x[4]、dev.y[4],dev.x[4]、dev.y[4]已经不是   tp_dev.x[4]=tp_dev.x[0];       //保存触点0的数据        tp_dev.y[4]=tp_dev.y[0];,这个地方是不是有bug??

回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2016-4-25 23:35:57 | 显示全部楼层
shblh 发表于 2016-4-25 11:35
if((mode&0XF)&&((mode&0XF)

不存在 这个bug,tp_dev.x[4]=tp_dev.x[0];       //保存触点0的数据
发生在读取数据之前。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

22

主题

104

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2015-5-4
在线时间
34 小时
 楼主| 发表于 2016-4-28 13:05:38 | 显示全部楼层
正点原子 发表于 2016-4-25 23:35
不存在 这个bug,tp_dev.x[4]=tp_dev.x[0];       //保存触点0的数据
发生在读取数据之前。

但是,  tp_dev.x[0]=tp_dev.x[4]; tp_dev.y[0]=tp_dev.y[4];这个是发生在读取数据之后,如果五个点同时按下,tp_dev.x[4]、tp_dev.y[4]就是第5个触摸点的数据了,那tp_dev.x[4]=tp_dev.x[0];       //保存触点0的数据  不就没什么意义了么
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2016-5-1 11:38:58 | 显示全部楼层
shblh 发表于 2016-4-28 13:05
但是,  tp_dev.x[0]=tp_dev.x[4]; tp_dev.y[0]=tp_dev.y[4];这个是发生在读取数据之后,如果五个点同时 ...

请看这个大前提:
if(tp_dev.x[0]>lcddev.width||tp_dev.y[0]>lcddev.height)//非法数据(坐标超出了)
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2016-4-10
在线时间
5 小时
发表于 2016-7-8 00:27:19 | 显示全部楼层
原子大哥,楼主的疑问我也碰到了,能否详细解答一下?关于资料内寄存器述错误的可以不讲,但程序代码被楼主标成彩色的部份好想让你指点一下迷津。
回复

使用道具 举报

8

主题

49

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2016-7-16
在线时间
31 小时
发表于 2016-8-4 10:30:09 | 显示全部楼层
尤其不同蓝色部分是什么意思
回复

使用道具 举报

8

主题

49

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2016-7-16
在线时间
31 小时
发表于 2016-8-4 10:30:38 | 显示全部楼层
尤其不懂蓝色部分是什么意思
回复

使用道具 举报

8

主题

49

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2016-7-16
在线时间
31 小时
发表于 2016-8-4 11:22:40 | 显示全部楼层
刚刚测试了一下,蓝色部分应该是松键功能吧!就是把上一次按下的标志位清0 ;
回复

使用道具 举报

9

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
191
金钱
191
注册时间
2016-10-11
在线时间
32 小时
发表于 2016-12-12 20:32:14 | 显示全部楼层
同疑问,有木有会的兄台帮忙解答一下。。。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-3-1 19:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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