本帖最后由 羿日光年 于 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; } } } 讲的不清楚,望见谅,总觉得不太好,大家有什么好的消抖程序吗 |
你是怎么消的啊
最简单的方式延时就行了
复杂一点的,设置一个变量,
bool keyIsDown(void)
{
uint32_t keyDownCycle=0;
while(GPIOA->IDR&0x01)
{
keyDownCycle++;
}
if(keyDownCycle<CYCLE) return false; //CYCLE可以取1000
else
return true;
}
true表示键确实按下,false表示没有按下
https://www.stmcu.org.cn/module/forum/thread-598869-1-1.html这里我搞了个简单的。