背景
实现了一个基于gpio的按键,但是发现有时候会因为按动的时间过长,导致会触发两次按键的事件。因此考虑将原来的电平触发模式改为边沿触发模式,即将原来的按键被按下执行动作,改为按键的状态改变的时候再执行动作。其实是通过一个标志位记录了之前的按键状态,用于下次的状态判断。
源码
if(//按键按下事件 void keyPress(void) { //低电平标示按键按下 KEY1== 0) { //按键去抖 delay_ms(10); if(KEY1== 0) { //如果原来按键松开,则执行按键按下操作 if(1== focusFarButtonValue) { //按键按下 focusFarButtonValue= 0; //如果KEY4按下时,不执行聚焦操作了 if(1== KEY4_press_flag) { //如果按下KEY4,又按下其他按键,模拟按键松开,也不再执行KEY4松开的其他操作了 KEY4_Event_exec_flag= 2; return; } //执行按键按下操作,聚焦远 SetCameraValue(9,4,1); } } } //低电平标示按键按下 if(KEY2== 0) { //按键去抖 delay_ms(10); if(KEY2== 0) { //如果原来按键松开,则执行按键按下操作 if(1== focusNearButtonValue) { //按键按下 focusNearButtonValue= 0; //如果KEY4按下时,不执行聚焦操作了 if(1== KEY4_press_flag) { //如果按下KEY4,又按下其他按键,模拟按键松开,也不再执行KEY4松开的其他操作了 KEY4_Event_exec_flag= 2; return; } //执行按键按下操作,聚焦近 SetCameraValue(9,4,0); } } } }
//按键松开事件
void keyRelease(void) { //高电平标示按键松开 if(KEY1== 1) { //按键去抖 delay_ms(10); if(KEY1== 1) { //如果原来按键按下,则执行按键松开操作 if(0== focusFarButtonValue) { //按键松开 focusFarButtonValue= 1; //执行按键松开操作,聚焦停止 sendBPcmd2(4);//调焦停止 } } } //高电平标示按键松开 if(KEY2== 1) { //按键去抖 delay_ms(10); if(KEY1== 1) { //如果原来按键按下,则执行按键松开操作 if(0== focusNearButtonValue) { //按键松开 focusNearButtonValue= 1; //执行按键松开操作,聚焦停止 sendBPcmd2(4);//调焦停止 } } } }