找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 839|回复: 0
收起左侧

分享已在项目中使用的多功能按键程序-基于stm32 Hal库的多功能按键程序

[复制链接]
ID:142059 发表于 2021-7-18 12:06 | 显示全部楼层 |阅读模式
有需求的可以参考
在cubemx中将key引脚重命名为KEY,并设为下降沿触发、上拉。
其中断优先级要设置比systick中断要低。其他的具体使用请查看key.h
STM32单片机源程序如下:
  1. #include "key.h"

  2. KEY_PARAM key_param;

  3. void key_once_click_result_calculate(void)
  4. {
  5.         u32 priod_t=KEY_PRESS_TIMEOUT-key_param.press_time_count;
  6.         if(priod_t<1000)
  7.         {
  8.                 if(key_param.fun_once_click!=NULL) key_param.fun_once_click();//单击
  9.         }
  10.         else if(priod_t<2500)
  11.         {
  12.                 if(key_param.fun_once_click_2s!=NULL)key_param.fun_once_click_2s();//单击长按2s
  13.         }
  14.         else if(priod_t<KEY_PRESS_TIMEOUT)
  15.         {
  16.                 if(key_param.fun_once_click_4s!=NULL)key_param.fun_once_click_4s();//单击长按2s
  17.         }                                
  18.         key_param.press_up_time_count=0;
  19.         key_param.bool_press=FALSE;
  20. }
  21. <blockquote>void key_timer_handler(void)
复制代码

  1. #ifndef _KEY_H_
  2. #define _KEY_H_
  3. #include "main.h"


  4. #define STRAIGHT_CLIK_NUM_MAX  3  //最多连续点击次数
  5. #define KEY_PRESS_TIMEOUT 5000
  6. #define NO_CLIK_TIMEOUT 500

  7. //动作定义
  8. typedef enum
  9. {
  10.           KEY_NONE=0,                //无按下 - 无功能
  11.         KEY_TIMEOUT,        //超时  -
  12.         KEY_ONCE,                //单击        -               
  13.         KEY_DOUBLE,                //双击        -               
  14.         KEY_LONG_2S,        //单击后长按2秒        -        
  15.         KEY_LONG_4S                //单击后长按4秒        -        
  16. }KEY_ACTION;

  17. typedef struct
  18. {
  19.         u32 press_time_count;
  20.         u32 press_down_time_count;
  21.         u32 press_up_time_count;
  22.         u8 press_result;
  23.         u8 press_count;
  24.         u8 funcode;
  25.         u8 bool_press;
  26.         u8 bool_press_double_start;
  27.         u8 bool_ok;
  28.         u8 bool_pass;
  29.         fun fun_click_down;                        //按键按下的事件
  30.         fun fun_click_up;                        //按键抬起事件
  31.         fun fun_once_click;                 //单击事件
  32.         fun fun_once_click_2s;                //长按2S事件
  33.         fun fun_once_click_4s;                //长按4秒事件
  34.         fun fun_once_click_timeout;        //长按超时事件
  35.         fun fun_double_click;                //双击事件
  36. }KEY_PARAM;
  37. extern KEY_PARAM key_param;

  38. void key_handler(void);//放在按键中断函数中,按键中断优先级必须比systick的小。

  39. #endif

  40. /*使用说明
  41. *配合HAL库使用
  42. *需要在stm32xx_it.c中包含key.h头文件
  43. *在按键中断函数中调用key_handler()函数
  44. *在main函数中初始化绑定按键事件
  45. *绑定按键事件未例:
  46.   key_param.fun_click_down=led_on;
  47.   key_param.fun_click_up=led_off;
  48.   key_param.fun_once_click_2s=device_report_start;
  49.   key_param.fun_once_click_4s=device_report_end;
  50.   key_param.fun_once_click_timeout=device_reboot;
  51.   
  52.   其中led_on、led_off等是用户函数,即
  53.   void led_on(void);
  54.   void led_off(void);等
  55.   按键采用绑定功能函数形式,增加灵活性。
  56.   除了初始化绑定外,还可以进程中动态绑定或更改绑定。

  57. */


复制代码
51hei.png

为了方便保存,上面2个文件打包下载(或者直接从网页复制粘贴也行):
stm32-hal多功能按键.zip (2.05 KB, 下载次数: 18)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表