硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3500|回复: 3
收起左侧

[emWin] 长按BUTTON

[复制链接]

100

主题

94

回帖

394

积分

高级会员

积分
394
发表于 2020-2-25 13:48:03 | 显示全部楼层 |阅读模式
    case WM_NOTIFICATION_RELEASED:
    break

长按按钮居然会进入到如上分支,怎么回事呢?
效果如附件视频。

11571ad38d827e1a0b77332ef2b273d3.mp4

1.23 MB, 下载次数: 4

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115787
QQ
发表于 2020-2-25 14:17:15 | 显示全部楼层
如果长按会进入这个,说明你的触摸有bug,不能有消息区分按下和释放。
回复

使用道具 举报

100

主题

94

回帖

394

积分

高级会员

积分
394
 楼主| 发表于 2020-2-25 15:33:31 | 显示全部楼层
eric2013 发表于 2020-2-25 14:17
如果长按会进入这个,说明你的触摸有bug,不能有消息区分按下和释放。
  1. int  GUI_TOUCH_X_MeasureX(void)
  2. {
  3.         int32_t xvalue;
  4.         if((lcddev.id == 0X5510)||(lcddev.id == 0X1963)||(lcddev.id==0X7084)||(lcddev.id==0X4342)||(lcddev.id==0X7016)) //电容屏的触摸值获取
  5.         {
  6.                 tp_dev.scan(0);
  7.                 xvalue=lcddev.width - tp_dev.x[0];
  8.                 return xvalue;
  9.         }else                                //电阻屏
  10.         {
  11.                 return TP_Read_XOY(0XD0);  //CMD_RDX=0XD0
  12.         }
  13. }

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

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

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

  55.                                         if(tp_dev.touchtype&0X01)//横屏                                                       
  56.                                         {
  57.                                                 tp_dev.x[i]=(((u16)(buf[1]&0X0F)<<8)+buf[0]);        //lcddev.width-
  58.                                                 tp_dev.y[i]=((u16)(buf[3]&0X0F)<<8)+buf[2];
  59.                                         }
  60.                                         else
  61.                                         {
  62.                                                 tp_dev.y[i]=((u16)(buf[1]&0X0F)<<8)+buf[0];
  63.                                                 tp_dev.x[i]=((u16)(buf[3]&0X0F)<<8)+buf[2];
  64.                                         }
  65.                                 }                       
  66.                         }
  67.                         res=1;

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

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

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115787
QQ
发表于 2020-2-25 16:38:18 | 显示全部楼层
wen 发表于 2020-2-25 15:33
可否帮忙分析一下哈?

看不懂你这个代码的逻辑关系,这个帮不上,你自己解决下吧。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-5-18 18:16 , Processed in 0.215822 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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