OpenEdv-开源电子网

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

关于正点原子触摸屏驱动的3个BUG

[复制链接]

12

主题

22

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2018-7-9
在线时间
23 小时
发表于 2020-2-25 15:05:16 | 显示全部楼层 |阅读模式
本帖最后由 憧憬明天 于 2020-2-25 16:26 编辑

emwin+gt911

各位大佬,正点的触摸屏驱动是不是有些问题哈:
1.我长按一个键不松开,会进入如下分支
    case WM_NOTIFICATION_RELEASED:

    break;


2.没有任何按键操作,某个键会被emwin 识别成按下。
3.按键-->松开处理完之后若干时间,这个键又会被按下,重复次数随机

关键代码如下
  1. <div>void GUI_TOUCH_X_ActivateX(void)
  2. {
  3. }</div><div>
  4. void GUI_TOUCH_X_ActivateY(void)
  5. {
  6. }

  7. </div><div>int  GUI_TOUCH_X_MeasureX(void)
  8. </div>{
  9.         int32_t xvalue;
  10.         if((lcddev.id == 0X5510)||(lcddev.id == 0X1963)||(lcddev.id==0X7084)||(lcddev.id==0X4342)||(lcddev.id==0X7016)) //电容屏的触摸值获取
  11.         {
  12.                 tp_dev.scan(0);
  13.                 xvalue=lcddev.width - tp_dev.x[0];
  14.                 return xvalue;
  15.         }else                                //电阻屏
  16.         {
  17.                 return TP_Read_XOY(0XD0);  //CMD_RDX=0XD0
  18.         }
  19. }

  20. int  GUI_TOUCH_X_MeasureY(void)
  21. {        
  22.         int32_t yvalue;
  23.    
  24.         if((lcddev.id == 0X5510)||(lcddev.id == 0X1963)||(lcddev.id==0X7084)||(lcddev.id==0X4342)||(lcddev.id==0X7016))//电容屏的触摸值获取
  25.         {
  26.                 tp_dev.scan(0);
  27.                 yvalue = tp_dev.y[0];
  28.                 return yvalue;
  29.         }else                                //电阻屏
  30.         {
  31.                 return TP_Read_XOY(0X90);  //CMD_RDX=0XD0
  32.         }
  33. }

  34. u8 GT911_Scan(u8 mode)
  35. {
  36.         u8 buf[4];
  37.         u8 i = 0;
  38.         u8 res = 0;
  39.         u8 temp;
  40.         static u8 t = 0;                                                                //控制查询间隔,从而降低CPU占用率   
  41.         
  42.         t++;
  43.         if((t%10)==0||t<10)                                                                //空闲时,每进入10次CTP_Scan函数才检测1次,从而节省CPU使用率
  44.         {
  45.                 GT911_RD_Reg(GT911_GSTID_REG, &mode, 1);        //读取触摸点的状态  
  46.                
  47.                  if(mode&0X80&&((mode&0XF)<6))
  48.                 {
  49.                         temp=0;
  50.                         GT911_WR_Reg(GT_GSTID_REG,&temp,1);                //清标志
  51.                 }               

  52.                 if((mode&0XF)&&((mode&0XF)<6))
  53.                 {
  54.                         temp=0XFF<<(mode&0XF);                                        //将点的个数转换为1的位数,匹配tp_dev.sta定义
  55.                         tp_dev.sta=(~temp)|TP_PRES_DOWN|TP_CATH_PRES;
  56.                         for(i=0;i<5;i++)
  57.                         {
  58.                                 if(tp_dev.sta&(1<<i))                                //触摸有效?
  59.                                 {
  60.                                         GT911_RD_Reg(GT911_TPX_TBL[i],buf,4);                                //读取XY坐标值

  61.                                         if(tp_dev.touchtype&0X01)//横屏                                                        
  62.                                         {
  63.                                                 tp_dev.x[i]=(((u16)(buf[1]&0X0F)<<8)+buf[0]);        //lcddev.width-
  64.                                                 tp_dev.y[i]=((u16)(buf[3]&0X0F)<<8)+buf[2];
  65.                                         }
  66.                                         else
  67.                                         {
  68.                                                 tp_dev.y[i]=((u16)(buf[1]&0X0F)<<8)+buf[0];
  69.                                                 tp_dev.x[i]=((u16)(buf[3]&0X0F)<<8)+buf[2];
  70.                                         }
  71.                                 }                        
  72.                         }
  73.                         res=1;

  74. //                        if(tp_dev.x[0]>lcddev.width||tp_dev.y[0]>lcddev.height)                        //非法数据(坐标超出了)
  75.                         if(tp_dev.x[0]>600||tp_dev.y[0]>1024)                 //非法数据(坐标超出了)

  76.                         {
  77.                                 if((mode&0XF)>1)                                        //有其他点有数据,则复第二个触点的数据到第一个触点.
  78.                                 {
  79.                                         tp_dev.x[0]=tp_dev.x[1];
  80.                                         tp_dev.y[0]=tp_dev.y[1];
  81.                                         t=0;                                                        //触发一次,则会最少连续监测10次,从而提高命中率
  82.                                 }
  83.                                 else                                                                //非法数据,则忽略此次数据(还原原来的)  
  84.                                 {
  85.                                         tp_dev.x[0]=tp_dev.x[4];
  86.                                         tp_dev.y[0]=tp_dev.y[4];
  87.                                         mode=0X80;               
  88.                                         tp_dev.sta = temp;                                //恢复tp_dev.sta
  89.                                 }
  90.                         }
  91.                         else
  92.                         {
  93.                                 t=0;                                                                //触发一次,则会最少连续监测10次,从而提高命中率
  94.                         }
  95.                 }
  96.         }
  97.         
  98.         if((mode&0X8F)==0X80)                                                        //无触摸点按下
  99.         {
  100.                 if(tp_dev.sta&TP_PRES_DOWN)                                        //之前是被按下的
  101.                 {
  102.                         tp_dev.sta&=~(1<<7);                                        //标记按键松开
  103.                 }
  104.                 else                                                                                //之前就没有被按下
  105.                 {
  106.                         tp_dev.x[0]=0xffff;
  107.                         tp_dev.y[0]=0xffff;
  108.                         tp_dev.sta&=0XE0;                                                //清除点有效标记        
  109.                 }         
  110.         }         
  111.         if(t>240)
  112.         {
  113.                 t=10;                                                                                //重新从10开始计数
  114.                 //printf("运行到SCAN\r\n");
  115.         }
  116.         return res;
  117. }
复制代码




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

使用道具 举报

5

主题

424

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1020
金钱
1020
注册时间
2014-9-4
在线时间
199 小时
发表于 2020-2-27 09:48:58 | 显示全部楼层

回帖奖励 +10 金钱

用自带例程试下是不是正常的,如果正常估计是移植有问题。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-22 17:24

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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