键盘消抖程序 怎么写
本帖最后由 羿日光年 于 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
这个消抖消的,真麻烦。。。
你是怎么消的啊 羿日光年 发表于 2015-1-7 13:11
你是怎么消的啊
最简单的方式延时就行了 一般先检测键盘是否按下,然后延时10ms在一次检测就行了。 羿日光年 发表于 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表示没有按下 delay 么 那执行它时,cpu不就什么做不了 还得等它delay完 本帖最后由 damiaa 于 2015-1-7 13:55 编辑
https://www.stmcu.org.cn/module/forum/thread-598869-1-1.html这里我搞了个简单的。
延时咯。。。。。。。。 我之前有个帖子,详细了讲解了各种按键的出来方法,你可以参考一下https://www.stmcu.org.cn/module/forum/forum.php?mod=viewthread&tid=584383&highlight=按键处理
页:
[1]
2