stm8s 按键检测 单击不能实现,在51是没问题的

2019-07-19 20:34发布

以下按键程序,以前在51用过的,没问题,用到stm8s就不能正常使用了,长按很正常,单击就没有反应了。请大神花点时间帮忙看下,,,,主要是key_driver()的返回值key_return一直不会返回“单击”长按状态就正常,单击就不正常,用串口看了,偶尔有一个“单击”信息,但是板上就是没有反应, keyscan()也没有反应
用的是TIM4定时器 10ms轮询的,放在TIM4的中断里处理的

u8 buttonflay(void)  //按键状态
{
  if(GPIO_ReadInputPin(GPIOA,GPIO_PIN_3)==RESET) return key1_prss;  //1
  else
  if(GPIO_ReadInputPin(GPIOD,GPIO_PIN_3)==RESET) return key2_prss;  //2
  else
  if(GPIO_ReadInputPin(GPIOC,GPIO_PIN_5)==RESET) return key3_prss; //3
   else
      return RESET; //0
}
u8 key_driver(void)
{
    static u8 key_state = key_state_0, key_time = 0;

    u8 key_return = N_key,key_press=SET;

    key_press_flay=buttonflay();//读取按键状态

    if(key_press_flay!=RESET) //判断按键是否按下
      key_press=SET;        //有按键按下
    else
      key_press=RESET;        //有按键按下

    switch (key_state)
    {
      case key_state_0:                              // 按键初始态
      if (key_press==SET) key_state = key_state_1;     // 键被按下,状态转换到按键消抖和确认状态
      break;

      case key_state_1:            // 按键消抖与确认态
      if (key_press==SET)
       {
        key_time = RESET;
        key_state = key_state_2;   // 按键仍然处于按下,消抖完成,状态转换到按下键时间的计时状态,但返回的还是无键事件
       }
      else
       key_state = key_state_0;    // 按键已抬起,转换到按键初始态。此处完成和实现软件消抖,其实按键的按下和释放都在此消抖的。
      break;

      case key_state_2:
        if(key_press==RESET)
        {
         key_return = S_key;        // 此时按键释放,说明是产生一次短操作,回送S_key
         key_state = key_state_0;   // 转换到按键初始态
        }
        else if (++key_time >= 100) // 继续按下,计时加10ms(10ms为本函数循环执行间隔)
        {
         key_return = L_key;        // 按下时间>1000ms,此按键为长按操作,返回长键事件
         key_state = key_state_3;   // 转换到等待按键释放状态
        }
        break;

      case key_state_3:            // 等待按键释放状态,此状态只返回无按键事件
        if (key_press==1) key_state = key_state_0; //按键已释放,转换到按键初始态
        break;
    }
    return key_return;
}
u8 keyscan()  //四个按键,返回的是不同按键的不同值
{
  buttonreturn=key_driver(); //判断是 单击 还是 长按
  keychose=buttonflay();     //判断是哪个按键按下

  if((buttonreturn==L_key)&&(keychose==key1_prss)) return long_key1; //长按  button 1
  else
  if((buttonreturn==S_key)&&(keychose==key1_prss)) return click_key1;//单击  button 1
  else
  if((buttonreturn==S_key)&&(keychose==key2_prss)) return click_key2;//单击  button 2
  else
  if((buttonreturn==L_key)&&(keychose==key2_prss)) return long_key2; //长按  button 2
  else
  if((buttonreturn==S_key)&&(keychose==key3_prss)) return click_key3;//单击  button 3
  else
  if((buttonreturn==L_key)&&(keychose==key3_prss)) return long_key3; //长按  button 3
  else
  return   N_key; // N_key=0;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
5条回答
寒758264068
2019-07-20 13:18
炫 {MOD}康康 发表于 2018-3-18 10:35
延时不同吧

不管是增加还是减少刷新的时间还是没有用。单击很快就被覆盖了一样,把u8 key_return = N_key,key_press=SET;改为全局变量的话,只要“单击”或“长按”,按键放开后,key_return又是永远为“1”或
“3”

一周热门 更多>