你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

键盘消抖程序 怎么写

[复制链接]
羿日光年 提问时间:2015-1-7 12:49 /
本帖最后由 羿日光年 于 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;
                        }
        }

}


讲的不清楚,望见谅,总觉得不太好,大家有什么好的消抖程序吗
收藏 评论14 发布时间:2015-1-7 12:49

举报

14个回答
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

最简单的方式延时就行了
zam52013 回答时间:2015-1-7 13:19:36
一般先检测键盘是否按下,然后延时10ms在一次检测就行了。
qianfan 回答时间:2015-1-7 13:20:26

复杂一点的,设置一个变量,
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/ ... 4383&highlight=按键处理
我是酱油哥 回答时间:2015-1-7 15:31:03
先判断是否有剑按下,再延时,再判断是否有键按下
mryao4 回答时间:2015-1-7 17:46:24
看各大开发版资料的都是delay延时。。。。
馒头弟 回答时间:2015-1-7 22:10:26
中断延时
zhous 回答时间:2015-1-7 22:15:10
延时就行了
Johnqian123 回答时间:2018-6-15 11:14:58
参考下原子的按键实例吧

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版