stm32的GPIO按键弹起、按下的事件

447 阅读2分钟

背景

实现了一个基于gpio的按键,但是发现有时候会因为按动的时间过长,导致会触发两次按键的事件。因此考虑将原来的电平触发模式改为边沿触发模式,即将原来的按键被按下执行动作,改为按键的状态改变的时候再执行动作。其实是通过一个标志位记录了之前的按键状态,用于下次的状态判断。

源码

//按键按下事件

void keyPress(void)

{ //低电平标示按键按下

     if(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);//调焦停止

                        }

               }

     }

}