STM32 按键检测

c语言关键词 :static

  • stantic申请的局部变量(函数中),储存在静态储存区;
  • 它在函数调用后,不会被释放 。它的值会被保留。
  • 所以stantic申请的局部变量,具有记忆。

 硬件

 KEY0  是低电平有效的,所以,需要在 STM32F1 内部设置上拉(默认高电平)。

 软件

#define     u8    unsigned char
#define     KEY0  HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_4) //KEY0 按键 PE4
复制代码
/***************************************************************
  *  @brief     连续按键检测
  *  @param     输入参数:无
                返 回 值:0或1               
  *  @note      按键按下返回1,松手返回0.
  *  @Sample usage: 按键按下没有松开,一直返回1,算多次     
 **************************************************************/
u8 KEY_Scan1(void)
{            
    if(KEY0==0)
    {
        HAL_Delay(10);
        if(KEY0==0)
        {
            return 1;
        }
        return 0;
    }
    return 0;
}
/***************************************************************
  *  @brief     不连续按键检测
  *  @param     输入参数:无
                返 回 值:0或1               
  *  @note      按键按下时刻返回1,之后返回0
  *  @Sample usage:  按键按下,没有松开,返回一次1,之后一直返回0,只能算一次,    
 **************************************************************/
u8 KEY_Scan2(void)
{
  static u8 key_up=1;
    if(key_up &&  KEY0==0)
    {
        HAL_Delay(10);//延时,防抖
        key_up=0;//标记这次key已经按下
        if(KEY0==0)
        {
         return 1;
        }
    }else if(KEY0!=0)  key_up=1;
    return 0;
}
复制代码

 按键扫描(2种模式2合一)

复制代码
u8 KEY_Scan(u8 mode)
{
 static u8 key_up=1; //按键松开标志
 if(mode==1)key_up=1; //支持连按
 if(key_up && KEY0==0)
 {
   HAL_Delay(10);
   key_up=0;
   if(KEY0==0) return 1;
     
 }else if(KEY0==1)key_up=1;
 return 0; //无按键按下
}
复制代码
KEY_Scan 函数,则是用来扫描这  IO 口是否有按键按下。
KEY_Scan 函数,支持两种 扫描方式,通过 mode 参数来设置。
当 mode 为 0 的时候,KEY_Scan 函数将不支持连续按,扫描某个按键,该按键按下之后必 须要松开,才能第二次触发,否则不会再响应这个按键,这样的好处就是可以防止按一次多次 触发,而坏处就是在需要长按的时候比较不合适。
当 mode 为 1 的时候,KEY_Scan 函数将支持连续按,如果某个按键一直按下,则会一直返回这个按键的键值,这样可以方便的实现长按检测。
posted @   Yoku  阅读(612)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示