有需求的可以参考
在cubemx中将key引脚重命名为KEY,并设为下降沿触发、上拉。
其中断优先级要设置比systick中断要低。其他的具体使用请查看key.h
STM32单片机源程序如下:- #include "key.h"
- KEY_PARAM key_param;
- void key_once_click_result_calculate(void)
- {
- u32 priod_t=KEY_PRESS_TIMEOUT-key_param.press_time_count;
- if(priod_t<1000)
- {
- if(key_param.fun_once_click!=NULL) key_param.fun_once_click();//单击
- }
- else if(priod_t<2500)
- {
- if(key_param.fun_once_click_2s!=NULL)key_param.fun_once_click_2s();//单击长按2s
- }
- else if(priod_t<KEY_PRESS_TIMEOUT)
- {
- if(key_param.fun_once_click_4s!=NULL)key_param.fun_once_click_4s();//单击长按2s
- }
- key_param.press_up_time_count=0;
- key_param.bool_press=FALSE;
- }
- <blockquote>void key_timer_handler(void)
复制代码
- #ifndef _KEY_H_
- #define _KEY_H_
- #include "main.h"
- #define STRAIGHT_CLIK_NUM_MAX 3 //最多连续点击次数
- #define KEY_PRESS_TIMEOUT 5000
- #define NO_CLIK_TIMEOUT 500
- //动作定义
- typedef enum
- {
- KEY_NONE=0, //无按下 - 无功能
- KEY_TIMEOUT, //超时 -
- KEY_ONCE, //单击 -
- KEY_DOUBLE, //双击 -
- KEY_LONG_2S, //单击后长按2秒 -
- KEY_LONG_4S //单击后长按4秒 -
- }KEY_ACTION;
- typedef struct
- {
- u32 press_time_count;
- u32 press_down_time_count;
- u32 press_up_time_count;
- u8 press_result;
- u8 press_count;
- u8 funcode;
- u8 bool_press;
- u8 bool_press_double_start;
- u8 bool_ok;
- u8 bool_pass;
- fun fun_click_down; //按键按下的事件
- fun fun_click_up; //按键抬起事件
- fun fun_once_click; //单击事件
- fun fun_once_click_2s; //长按2S事件
- fun fun_once_click_4s; //长按4秒事件
- fun fun_once_click_timeout; //长按超时事件
- fun fun_double_click; //双击事件
- }KEY_PARAM;
- extern KEY_PARAM key_param;
- void key_handler(void);//放在按键中断函数中,按键中断优先级必须比systick的小。
- #endif
- /*使用说明
- *配合HAL库使用
- *需要在stm32xx_it.c中包含key.h头文件
- *在按键中断函数中调用key_handler()函数
- *在main函数中初始化绑定按键事件
- *绑定按键事件未例:
- key_param.fun_click_down=led_on;
- key_param.fun_click_up=led_off;
- key_param.fun_once_click_2s=device_report_start;
- key_param.fun_once_click_4s=device_report_end;
- key_param.fun_once_click_timeout=device_reboot;
-
- 其中led_on、led_off等是用户函数,即
- void led_on(void);
- void led_off(void);等
- 按键采用绑定功能函数形式,增加灵活性。
- 除了初始化绑定外,还可以进程中动态绑定或更改绑定。
- */
复制代码
为了方便保存,上面2个文件打包下载(或者直接从网页复制粘贴也行):
stm32-hal多功能按键.zip
(2.05 KB, 下载次数: 42)
|