关于ST触摸按键连续响应

yuyangln198   2010-5-25 09:24 楼主
用STM8S做了一个触摸按键,按下按键后通过UART发送一个数据

     能不能实现我手指触摸按键后,就不停的发送数据,手指离开按键的时候就停止发送呢?
     我用sSCKeyInfo[1].Setting.b.DETECTED这个变量做循环控制条件好像不行

    多谢

回复评论 (14)

                                 可以增加一个变量,然后你的想法就很容易实现了。
点赞  2010-5-25 11:38
                                 其实用sSCKeyInfo[0].Setting.b.DETECTED作为判断条件,也可以实现的
点赞  2010-5-25 11:41
谢谢你啊

我用sSCKeyInfo[0].Setting.b.DETECTED作为判断条件的时候,串口会不停的发送数据,调试状态下sSCKeyInfo[0].Setting.b.DETECTED的值始终为1,不发生改变,循环无法停止。

如果增加变量,思路如何,请指教!多谢!
点赞  2010-5-25 11:55

那你手指离开的时候,又没把这个变量清掉呢?
个人想法,如果有手指触发,那么等待发送完毕,检测是否还有手指按着,又继续发送数据,没有清楚这个变量状态,不知道这样说对不对
点赞  2010-5-25 12:25
谢谢你啊

我用sSCKeyInfo[0].Setting.b.DETECTED作为判断条件的时候,串口会不停的发送数据,调试状态下sSCKeyInfo[0].Setting.b.DETECTED的值始终为1,不发生改变,循环无法停止。

如果增加变量,思路如何,请指 ...
调试状态下sSCKeyInfo[0].Setting.b.DETECTED的值始终为1,这说明触摸按键还没有正常工作?
正常情况下,手指离开后sSCKeyInfo[0].Setting.b.DETECTED的值应该变成0
点赞  2010-5-25 13:02



   也就是说sSCKeyInfo[0].Setting.b.DETECTED这个位变量初始为0
   当我手指触摸按键后,就会自动变为1,手指移开就自动恢复为0
   如果是这个原理,应该可以实现我想要的结果
点赞  2010-5-25 13:16
                                 楼主所说的,通过稍微修改下现有软件应该不难实现
点赞  2010-5-25 15:46
6# IJK  


   也就是说sSCKeyInfo[0].Setting.b.DETECTED这个位变量初始为0
   当我手指触摸按键后,就会自动变为1,手指移开就自动恢复为0

正常情况就是这样
点赞  2010-5-25 16:34


   大哥,我遇到不正常情况了


void ExtraCode_StateMachine(void)
{
if ((TSL_GlobalSetting.b.CHANGED) && (TSLState == TSL_IDLE_STATE))
  {
   
  TSL_GlobalSetting.b.CHANGED = 0;
   
    if (sSCKeyInfo[0].Setting.b.DETECTED) /* KEY 1 touched */
  {
      if (Led1State == OFF)
      {
        LED1_ON();
      }
      else
      {
        LED1_OFF();
      }
      
    UART2_DR = key1;
    while (!(UART2_SR & 0x80));
      
    }
   
    if (sSCKeyInfo[1].Setting.b.DETECTED) /* KEY 2 touched */
    {
      if (Led2State == OFF)
      {
        LED2_ON();
      }
      else
      {
        LED2_OFF();
      }
   while (sSCKeyInfo[1].Setting.b.DETECTED == 1)
   {
   UART2_DR = key2;
   while (!(UART2_SR & 0x80));
    }
    }
   
    if (sSCKeyInfo[2].Setting.b.DETECTED) /* KEY 3 touched */
    {
      if (Led3State == OFF)
      {
        LED3_ON();
      }
      else
      {
        LED3_OFF();
      }
   UART2_DR = key3;
   while (!(UART2_SR & 0x80));
    }
  }
}

   我的程序是上面这段,我按下key2后,就进入死循环,串口不停的输出数据key2;单步执行,发现sSCKeyInfo[1].Setting.b.DETECTED的值为1保持不变,只有经过((TSL_GlobalSetting.b.CHANGED) && (TSLState == TSL_IDLE_STATE))这行代码后才变为0;
   对这个软件库不熟悉,还请指教如何实现我想要的效果,增加变量也行啊!
点赞  2010-5-25 17:10
代码写得有问题。
不应该在 ExtraCode_StateMachine函数里面通过串口发送数据
点赞  2010-5-25 17:45
                                 可以增加一个变量试试
点赞  2010-5-25 18:58
代码写得有问题,在 ExtraCode_StateMachine函数里用while是不妥的,改成这样应该可行

    if (sSCKeyInfo[1].Setting.b.DETECTED) /* KEY 2 touched */
    {
      if (Led2State == OFF)
      {
        LED2_ON();
      }
      else
      {
        LED2_OFF();
      }
     if(UART2_SR & 0x80) /* 如果串口2 可以发送数据 */
     {
       UART2_DR = key2;
      }
    }
点赞  2010-5-26 09:39
                                 让串口一直不停地发数据不是个好办法,串口太过繁忙, 有可能会影响程序的其他地方
点赞  2010-5-26 09:47
按下按键后通过UART发送数据,其实没有必要。

调试STM8的触摸按键,有更好的方式,就是在watch窗口加入需要看的变量,比如sSCKeyInfo[1].Setting.b.DETECTED,然后点右键打开read-on-the-fly,就会不停刷新watch窗口的变量了。
点赞  2010-5-26 10:35
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复