[技术问答] 关于触摸开关的这个问题,该如何解决?

[复制链接]
6432|68
 楼主| lmn2005 发表于 2023-9-7 12:39 | 显示全部楼层 |阅读模式
本帖最后由 lmn2005 于 2023-9-7 12:49 编辑

近日应用了SC92F84H3的触摸功能,调试正常,就是有一个问题,不知道怎样解决。请各位大佬指教,谢谢!

  1. while (1)
  2.         {
  3.                 /*<UserCodeStart>*/ /*<SinOne-Tag><14>*/
  4.         if(SOCAPI_TouchKeyStatus & 0x80)
  5.         {
  6.             /*<UserCodeStart>*//*<SinOne-Tag><22>*/
  7.             SOCAPI_TouchKeyStatus &= 0x7f;
  8.             /*<UserCodeEnd>*//*<SinOne-Tag><22>*/
  9.             /*<UserCodeStart>*//*<SinOne-Tag><18>*/
  10.             exKeyValueFlag = TouchKeyScan();
  11.             /*<UserCodeEnd>*//*<SinOne-Tag><18>*/
  12.             /*<UserCodeStart>*//*<SinOne-Tag><35>*/        
  13.                 if(exKeyValueFlag & TK17)        i++;
  14.             //UserCode();
  15.             /*<UserCodeEnd>*//*<SinOne-Tag><35>*/
  16.             /*<UserCodeStart>*//*<SinOne-Tag><36>*/
  17.             TouchKeyRestart();
  18.             /*<UserCodeEnd>*//*<SinOne-Tag><36>*/
  19.         }
  20.                 TM1636_display(i/100, i/10%10, i%10,25, 0);//显示
  21.                 /***User program***/
  22.                 /*<UserCodeEnd>*/ /*<SinOne-Tag><14>*/
  23.                  /*<Begin-Inserted by EasyCodeCube for Condition>*/
  24.         }

如果使用上面的代码来获取触控信号并处理数据(i++)时,每次i加1的幅度太大、速度太快,长按触摸开关时,i在不断增加,当然i都在取值范围内。
如果采用下面的代码,效果也不如愿以偿:
  
  1. while (1)
  2.         {
  3.                 /*<UserCodeStart>*/ /*<SinOne-Tag><14>*/
  4.         if(SOCAPI_TouchKeyStatus & 0x80)
  5.         {
  6.             /*<UserCodeStart>*//*<SinOne-Tag><22>*/
  7.             SOCAPI_TouchKeyStatus &= 0x7f;
  8.             /*<UserCodeEnd>*//*<SinOne-Tag><22>*/
  9.             /*<UserCodeStart>*//*<SinOne-Tag><18>*/
  10.             exKeyValueFlag = TouchKeyScan();
  11.             /*<UserCodeEnd>*//*<SinOne-Tag><18>*/
  12.             /*<UserCodeStart>*//*<SinOne-Tag><35>*/        
  13.                 if(exKeyValueFlag & TK17)        
  14.                 {
  15.                 while(TouchKeyScan()& TK17);//等待按键弹起
  16.                 i++;        
  17.                 }
  18.             //UserCode();
  19.             /*<UserCodeEnd>*//*<SinOne-Tag><35>*/
  20.             /*<UserCodeStart>*//*<SinOne-Tag><36>*/
  21.             TouchKeyRestart();
  22.             /*<UserCodeEnd>*//*<SinOne-Tag><36>*/
  23.         }
  24.                 TM1636_display(i/100, i/10%10, i%10,25, 0);//显示
  25.                 /***User program***/
  26.                 /*<UserCodeEnd>*/ /*<SinOne-Tag><14>*/
  27.                  /*<Begin-Inserted by EasyCodeCube for Condition>*/
  28.         }


如果采用上述代码来获取触控信号并处理数据的话,变量 i 加1的速度却显得太慢,也就是在按键弹起后,不随即加1,大约要延迟1秒以上才加1,不像普通轻触开关的速度。

请问大佬,像这种情况,该如何修改代码,才能使触控的效果与普通轻触开关一样,按一下、上来,i 才随即加1不延迟?

supernan 发表于 2023-9-7 22:28 | 显示全部楼层
不懂,坐等高手
zwsam 发表于 2023-9-8 09:01 | 显示全部楼层
不错啊
 楼主| lmn2005 发表于 2023-9-8 14:21 | 显示全部楼层
关于触摸的所有函数原型,都打包在一个叫SC92F8XHX_HighSensitive_lib_T1_L_V1.0.0.lib的函数库中,至于每个函数或中断具体是怎样实施的,只有赛元工程师才清楚,我们这帮用户都是不得而知的。
xiaochentongzhi 发表于 2023-9-18 13:44 | 显示全部楼层
这个函数因为是采用扫描的关系,扫一轮的时间与你的按键个数有关系,放此处时间会不准确,正确做法是放一个标志位,在定时器中断里面去判断累计时间即可。

评论

不知道触摸的中断在哪里,没办法设置标志位。  发表于 2023-9-19 08:02
zhu1982lin 发表于 2023-9-22 01:18 | 显示全部楼层
一般代码中都不能使用 while循环等待.
正常做法是在  if(exKeyValueFlag & TK17) 设置一个 按键按下标志(如:keyDown = 1),
然后在后面 if(TouchKeyScan()& TK17)判断 改为 if((keyDown == 1) && (TouchKeyScan()& TK17));//按键弹起后的处理.
--------------
if(exKeyValueFlag & TK17)        
{
       while(TouchKeyScan()& TK17);//等待按键弹起
       i++;        
}
---------  改为 ---------
if(exKeyValueFlag & TK17)        
{
   keyDown = 1;
   i  ++;
}
if( (keyDown == 1) && (TouchKeyScan()& TK17) )
{
    keyDown = 0;
    //按键弹起 后的处理
}

评论

试了,上面的思路看是没有错,就是实际上也不好用。  发表于 2023-9-26 10:58
有空试一试。  发表于 2023-9-25 15:48
 楼主| lmn2005 发表于 2023-10-8 19:07 | 显示全部楼层
看起来这个问题是无法解决的了
caigang13 发表于 2023-10-8 20:48 来自手机 | 显示全部楼层
加个延时判断处理
tpgf 发表于 2023-10-9 16:37 | 显示全部楼层
需要在每次循环的时候加一个小小的延时吗
drer 发表于 2023-10-9 16:48 | 显示全部楼层
还是应该使用其他判定语句 这样容易死循环
wiba 发表于 2023-10-9 17:19 | 显示全部楼层
用示波器看一下实际的电平是不是回复正常了
kxsi 发表于 2023-10-10 16:25 | 显示全部楼层
上边的代码基本没有时间间隔 下边的代码长时间等待也不好
coshi 发表于 2023-10-10 16:48 | 显示全部楼层
考虑使用中断方式来解决这个问题吗

评论

找不到中断的入口,估计集成在SC92F8XHX_HighSensitive_lib_T1_L_V1.0.0.lib中  发表于 2023-11-2 10:45
中断函数原型,可能打包在一个叫SC92F8XHX_HighSensitive_lib_T1_L_V1.0.0.lib的函数库中  发表于 2023-10-10 18:46
qcliu 发表于 2023-10-10 17:34 | 显示全部楼层
只能采用一种折中的办法了  这样不太耗费资源
udaidfa002 发表于 2023-11-2 09:20 | 显示全部楼层
使用中断进行识别试试。

评论

找不到中断的入口,估计集成在SC92F8XHX_HighSensitive_lib_T1_L_V1.0.0.lib中  发表于 2023-11-2 10:44
LLGTR 发表于 2023-12-4 18:19 | 显示全部楼层
只能有一个折衷的解决方案,不会太耗费资源

评论

现在都搁置了,因为暂时找不到有效的方法。  发表于 2023-12-4 18:57
 楼主| lmn2005 发表于 2024-4-9 14:59 | 显示全部楼层
请问SC92F8XHX触控开发,可以直接用代码不再用厂方的.lib库了吗?
RDS小定 发表于 2024-4-9 18:50 | 显示全部楼层
lmn2005 发表于 2024-4-9 14:59
请问SC92F8XHX触控开发,可以直接用代码不再用厂方的.lib库了吗?

触摸必须使用厂家提供的触摸库
RDS小定 发表于 2024-4-9 18:53 | 显示全部楼层
每个触摸MCU都有触摸例程和配套文档,照搬例程里的框架,这都是经过了无数次验证的。  

评论

请提供一下配套文档的下载网址,谢谢!  发表于 2024-4-9 19:01
chenqianqian 发表于 2024-4-9 20:05 来自手机 | 显示全部楼层
逻辑上处理就行,当检测到触摸有效,先不执行下一步,等检测到触摸失效后,才执行下一步。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

73

主题

608

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部