野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13077|回复: 2

关于秉火429核心板0-开机例程(即综合测试例程)KEY问题在于

[复制链接]
发表于 2018-3-26 22:48:23 | 显示全部楼层 |阅读模式
关于秉火429IGTX核心板0-开机例程(即综合测试例程)按键更改为按下延时消抖即点亮LED灯,松开LED灯灭。应怎样修改呢?
我修改了但只亮1分09秒又灭了再亮1分09秒又灭,只要这样按住不松开LED灯就这样循环亮。
修改如下,请教下
************************************************************************************************************************
*                              按键状态更新函数
*
* 函数描述:按键驱动函数,只适合STM32单片机库开发,其他类型的单片机可以自行修改。
*
*     参数:p_Key        指向按键控制变量的指针
*
*   返回值:无
*
*     注意:调用频率需要大于20Hz
*
************************************************************************************************************************
*/
void Key_RefreshState(KEY* p_Key)
{
  switch(p_Key->State)
  {
  /**********************/
    case KEY_UP:
    {
      if((*(p_Key->GetStatePtr))())//执行回调函数判断按键管脚状态
      {
#ifdef  KEY_FIXED_PERIOD   
        p_Key->Time_ms = 0;
        p_Key->State = KEY_DOWN_WOBBLE;//进行消抖延时
#else
        p_Key->State = KEY_DOWN_WOBBLE;
        key_delay1ms(KEY_WOBBLE_TIME);   
        if((*(p_Key->GetStatePtr))())
        {
          p_Key->StateChange=CHANGED;
          p_Key->State = KEY_DOWN;
        }
#endif
      }
    }break;
   
    #ifdef  KEY_FIXED_PERIOD
    case KEY_DOWN_WOBBLE:
    {
      p_Key->Time_ms += KEY_FIXED_PERIOD;
      if( p_Key->Time_ms >=KEY_WOBBLE_TIME )
      {
        if((*(p_Key->GetStatePtr))())
        {
          p_Key->StateChange=CHANGED;
          p_Key->State = KEY_DOWN;
        }
   
      }
    }break;
    #endif
  /******************/
    case KEY_DOWN:
    {
      if( (*(p_Key->GetStatePtr))() == 0 )
      {
#ifdef  KEY_FIXED_PERIOD
        p_Key->Time_ms = 0;
        p_Key->State = KEY_UP_WOBBLE;//进行消抖延时
#else
        key_delay1ms(KEY_WOBBLE_TIME);
        if( (*(p_Key->GetStatePtr))() == 0 )
        {
          p_Key->StateChange=CHANGED;
          p_Key->State = KEY_UP;  //此处原UP
         // p_Key->Times++;
          //if( p_Key->Times > 250)
            p_Key->Times = 1;//最多允许按下250次没处理
        }
#endif
      }
    }//break;
/********************/
#ifdef  KEY_FIXED_PERIOD
    case KEY_UP_WOBBLE:
    {
      p_Key->Time_ms += KEY_FIXED_PERIOD;
      if( p_Key->Time_ms >= KEY_WOBBLE_TIME )
      {
        if( (*(p_Key->GetStatePtr))()==1)   // //此处原0
        {
          p_Key->StateChange=CHANGED;
          p_Key->State = KEY_DOWN;  //此处原UP    原按键盘按下弹起才导通的,现按即导通了
         // p_Key->Times++;
         // if( p_Key->Times > 250)
           p_Key->Times = 1;//最多允许按下250次没处理
        }

      }
    }//break;
#endif   /*******************/
  }
}
回复

使用道具 举报

发表于 2018-3-27 11:29:43 | 显示全部楼层
这个要仔细分析下状态机逻辑对不对了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-27 20:35:14 | 显示全部楼层
不懂的在学习中,请教下
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2025-1-17 17:51 , Processed in 0.036154 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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