羿日光年 发表于 2015-1-7 12:49:25

键盘消抖程序 怎么写

本帖最后由 羿日光年 于 2015-1-7 12:50 编辑

大家是怎么做按键消抖的
我是用一定时器做20ms定时,定时到在中断里设专门标志(20ms是否到,初始化为0),在主循环里当按键按下时在判断此标志,为0,就开启定时中断,而后返回主流程,当此标志为1时在执行按键操作
uint32_t BUTTONScan(void)
{
      static u8 key_up = 1;

      if (key_up==1&&(BUTTON_GetState(BUTTON1)==0||BUTTON_GetState(BUTTON2)==0
                ||BUTTON_GetState(BUTTON3)==0)) //||BUTTON_GetState(BUTTON4)==0
      {
                        if(keymark !=1)                                                   //keymark为20ms定时到的标志
                        {
                              TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);//开启定时3通道1中断
                              TIM_Cmd(TIM3, ENABLE);
                        return 0;
                        }
                  else
      {
                                  keyread=1;
                                        key_up=0;
                                        keymark=0;
                                        TIM_ITConfig(TIM3,TIM_IT_Update,DISABLE);//定时3中断关
                                        TIM_Cmd(TIM3, DISABLE);
                                  if( BUTTON_GetState(BUTTON1)==0)      
                                                {
                                                //      Freq_Low=Freq_Low+1000000;//,Freq_Up_Down
                                                      return 1;
                                          }

                                  else if( BUTTON_GetState(BUTTON2)==0)
                                        {
                                        //      Freq_High=Freq_Low+1000000;
                                                return 2;      
                                        }
                                                      
                                       
                                        else if( BUTTON_GetState(BUTTON3)==0)
                                                {
                                                //      Freq_Up_Down=Freq_Up_Down+100000;
                                                return 3;
                                                }
                                                               
                              //      else if( BUTTON_GetState(BUTTON4)==0) return 4;
             }      
}
      else if (BUTTON_GetState(BUTTON1)==1 && BUTTON_GetState(BUTTON2)==1
                     && BUTTON_GetState(BUTTON3)==1)//BUTTON_GetState(BUTTON4)==1
      {
                        if(keymark !=1)
                        {
                              TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);//开启定时3通道1中断
                              TIM_Cmd(TIM3, ENABLE);
                        return 0;
                        }
                         else
      {
                                        key_up=0;
                                        keymark=0;
                                        TIM_ITConfig(TIM3,TIM_IT_Update,DISABLE);//定时3中断关
                                        TIM_Cmd(TIM3, DISABLE);
               key_up=1;
   return 0;
                        }
      }

}


讲的不清楚,望见谅,总觉得不太好,大家有什么好的消抖程序吗

QianFan 发表于 2015-1-7 13:09:18

这个消抖消的,真麻烦。。。

羿日光年 发表于 2015-1-7 13:11:43

QianFan 发表于 2015-1-7 13:09
这个消抖消的,真麻烦。。。

你是怎么消的啊

QianFan 发表于 2015-1-7 13:14:01

羿日光年 发表于 2015-1-7 13:11
你是怎么消的啊

最简单的方式延时就行了

zam52013 发表于 2015-1-7 13:19:36

一般先检测键盘是否按下,然后延时10ms在一次检测就行了。

QianFan 发表于 2015-1-7 13:20:26

羿日光年 发表于 2015-1-7 13:11
你是怎么消的啊

复杂一点的,设置一个变量,
bool keyIsDown(void)
{
uint32_t keyDownCycle=0;
while(GPIOA->IDR&0x01)
{
    keyDownCycle++;
}
if(keyDownCycle<CYCLE) return false; //CYCLE可以取1000
else
return true;
}

true表示键确实按下,false表示没有按下

羿日光年 发表于 2015-1-7 13:21:39

delay 么 那执行它时,cpu不就什么做不了 还得等它delay完

damiaa 发表于 2015-1-7 13:37:46

本帖最后由 damiaa 于 2015-1-7 13:55 编辑

https://www.stmcu.org.cn/module/forum/thread-598869-1-1.html这里我搞了个简单的。

舞动青春2 发表于 2015-1-7 14:09:43

延时咯。。。。。。。。

红玫瑰的偏爱 发表于 2015-1-7 15:23:41

我之前有个帖子,详细了讲解了各种按键的出来方法,你可以参考一下https://www.stmcu.org.cn/module/forum/forum.php?mod=viewthread&tid=584383&highlight=按键处理
页: [1] 2
查看完整版本: 键盘消抖程序 怎么写