|
有需求的可以參考
在cubemx中將key引腳重命名為KEY,并設(shè)為下降沿觸發(fā)、上拉。
其中斷優(yōu)先級要設(shè)置比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)
復(fù)制代碼
- #ifndef _KEY_H_
- #define _KEY_H_
- #include "main.h"
- #define STRAIGHT_CLIK_NUM_MAX 3 //最多連續(xù)點擊次數(shù)
- #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);//放在按鍵中斷函數(shù)中,按鍵中斷優(yōu)先級必須比systick的小。
- #endif
- /*使用說明
- *配合HAL庫使用
- *需要在stm32xx_it.c中包含key.h頭文件
- *在按鍵中斷函數(shù)中調(diào)用key_handler()函數(shù)
- *在main函數(shù)中初始化綁定按鍵事件
- *綁定按鍵事件未例:
- 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;
-
- 其中l(wèi)ed_on、led_off等是用戶函數(shù),即
- void led_on(void);
- void led_off(void);等
- 按鍵采用綁定功能函數(shù)形式,增加靈活性。
- 除了初始化綁定外,還可以進程中動態(tài)綁定或更改綁定。
- */
復(fù)制代碼
51hei.png (3.23 KB, 下載次數(shù): 108)
下載附件
2021-7-18 14:37 上傳
為了方便保存,上面2個文件打包下載(或者直接從網(wǎng)頁復(fù)制粘貼也行):
stm32-hal多功能按鍵.zip
(2.05 KB, 下載次數(shù): 42)
2021-7-18 19:37 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|