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 函数,支持两种 扫描方式,通过 mode 参数来设置。
当 mode 为 0 的时候,KEY_Scan 函数将不支持连续按,扫描某个按键,该按键按下之后必 须要松开,才能第二次触发,否则不会再响应这个按键,这样的好处就是可以防止按一次多次 触发,而坏处就是在需要长按的时候比较不合适。
当 mode 为 1 的时候,KEY_Scan 函数将支持连续按,如果某个按键一直按下,则会一直返回这个按键的键值,这样可以方便的实现长按检测。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律