UP 按键扫描支持

This commit is contained in:
JiXieShi
2024-06-22 11:08:31 +08:00
parent 99dcb14b60
commit 2d867be49a
13 changed files with 454 additions and 40 deletions

102
lib/inc/key/key.h Normal file
View File

@@ -0,0 +1,102 @@
#ifndef HW_LIB_KEY_H
#define HW_LIB_KEY_H
#ifdef __cplusplus
extern "C" {
#endif
#include <stdint.h>
#include <string.h>
#define KEY_TICKS_INTERVAL 5 // 定时器间隔时间,单位为毫秒
#define DEBOUNCE_TICKS 3 // 按键去抖动计数阈值最大为70 ~ 7
#define SHORT_TICKS (300 / KEY_TICKS_INTERVAL) // 短按阈值,单位为定时器间隔的倍数
#define LONG_TICKS (1000 / KEY_TICKS_INTERVAL) // 长按阈值,单位为定时器间隔的倍数
#define KEY_STOP_FREE 1 // 按键停止释放状态标识
typedef struct Key_List Key_t; // 定义结构体Key_t为Key_List的别名
typedef void (*Key_Callback_t)(Key_t *key); // 定义函数指针类型Key_Callback_t接受一个Key_t结构体指针参数
typedef enum {
KEY_PRESS_DOWN = 0, // 按下事件
KEY_PRESS_UP, // 弹起事件
KEY_PRESS_REPEAT, // 重复按下事件
KEY_SINGLE_CLICK, // 单击事件
KEY_DOUBLE_CLICK, // 双击事件
KEY_LONG_PRESS_START, // 长按开始事件
KEY_LONG_PRESS_HOLD, // 长按保持事件
number_of_event, // 事件总数
KEY_ALL_EVENT, // 所有事件
NONE_PRESS // 无按键事件
} PressEvent; // 定义枚举类型PressEvent表示按键事件类型
struct Key_List {
Key_t *next; // 指向下一个按键结构体的指针
uint16_t ticks; // 计时器
uint8_t repeat: 4; // 按键重复次数占4位
uint8_t event: 4; // 当前按键事件类型占4位
uint8_t state: 3; // 按键状态占3位
uint8_t debounce_cnt: 3; // 按键去抖计数占3位
uint8_t active_level: 1; // 按键激活电平占1位
uint8_t key_level: 1; // 当前按键电平占1位
uint8_t key_id; // 按键ID
uint8_t (*hal_key_Level)(uint8_t key_id_); // 函数指针,用于获取按键电平
Key_Callback_t cb[number_of_event]; // 按键事件回调函数数组
};
/**
* @brief 初始化按键模块
* @param key: [输入] 指向按键结构体的指针
* @param pin_level: [输入] 获取按键电平的回调函数
* @param active_level: [输入] 激活电平
* @param key_id: [输入] 按键ID
* @return void
* @example key_init(&my_key, get_pin_level, ACTIVE_HIGH, 1);
*/
void key_init(Key_t *key, uint8_t(*pin_level)(uint8_t), uint8_t active_level, uint8_t key_id);
/**
* @brief 绑定按键事件回调函数
* @param key: [输入] 指向按键结构体的指针
* @param event: [输入] 按键事件类型
* @param cb: [输入] 按键事件回调函数
* @return void
* @example key_attach(&my_key, PRESS_DOWN, key_press_callback);
*/
void key_attach(Key_t *key, PressEvent event, Key_Callback_t cb);
/**
* @brief 获取按键当前事件
* @param key: [输入] 指向按键结构体的指针
* @return 当前按键事件
* @example PressEvent current_event = get_key_event(&my_key);
*/
PressEvent get_key_event(Key_t *key);
/**
* @brief 启动按键检测
* @param key: [输入] 指向按键结构体的指针
* @return 错误码0表示成功
* @example int result = key_start(&my_key);
*/
int key_start(Key_t *key);
/**
* @brief 停止按键检测
* @param key: [输入] 指向按键结构体的指针
* @return void
* @example key_stop(&my_key);
*/
void key_stop(Key_t *key);
/**
* @brief 按键定时处理函数
* @return void
* @example key_ticks();
*/
void key_ticks(void);
#ifdef __cplusplus
}
#endif
#endif //HW_LIB_KEY_H

View File

@@ -13,8 +13,8 @@ typedef struct List_Node_t { //节点结构
} List_Node_t;
typedef struct { //链表结构
struct List_Node_t *head;
struct List_Node_t *tail;
List_Node_t *head;
List_Node_t *tail;
long len;
} List_t;

29
lib/inc/oled/oled.h Normal file
View File

@@ -0,0 +1,29 @@
#ifndef HW_LIB_OLED_H
#define HW_LIB_OLED_H
#ifdef __cplusplus
extern "C" {
#endif
// OLED初始化指令数组
const uint8_t OLED_Init_Cmd[] = {
0xAE, // 关闭显示
0xD5, 0x80, // 设置显示时钟分频因子/震荡频率
0xA8, 0x3F, // 设置多路复用比
0xD3, 0x00, // 设置显示偏移
0x40, // 设置起始行
0x8D, 0x14, // 启用电荷泵
0x20, 0x00, // 设置内存地址模式
0xA0, // 设置列地址映射
0xC0, // 设置扫描方向
0xDA, 0x12, // 设置COM硬件引脚配置
0x81, 0xCF, // 设置对比度
0xD9, 0xF1, // 设置预充电周期
0xDB, 0x40, // 设置VCOMH电压倍率
0xA4, // 全局显示开启
0xA6, // 设置显示方式
0xAF // 打开显示
};
#ifdef __cplusplus
}
#endif
#endif //HW_LIB_OLED_H

View File

@@ -29,36 +29,85 @@ struct TaskList {
void *userdata;
};
//时间基准注册建议1-10ms的基准
/**
* @brief 初始化任务模块
* @param TicksFunc: [输入] 时间基准函数指针
* @return TaskStatus_t 返回任务状态
* @example TaskInit(GetPlatformTicks);
*/
TaskStatus_t TaskInit(PlatformTicksFunc_t TicksFunc);
//创建任务
// time:间隔时间
// runcnt:执行次数 为-1无限制执行 为0只创建不运行
// callback:回调函数
// userdata:用户数据传参
/**
* @brief 创建任务
* @param task: [输入/输出] 任务结构体指针
* @param time: [输入] 间隔时间
* @param runcnt: [输入] 执行次数,-1为无限制执行0为只创建不运行
* @param callback: [输入] 回调函数
* @param userdata: [输入] 用户数据传参
* @return TaskStatus_t 返回任务状态
* @example TaskCreat(&myTask, 100, -1, myCallbackFunc, &myData);
*/
TaskStatus_t TaskCreat(Task_t *task, TaskTime_t time, TaskCnt_t runcnt, Task_Callback_t callback, void *userdata);
//添加任务
/**
* @brief 添加任务
* @param task: [输入] 任务结构体指针
* @return TaskStatus_t 返回任务状态
* @example TaskAdd(&myTask);
*/
TaskStatus_t TaskAdd(Task_t *task);
//删除任务
/**
* @brief 删除任务
* @param task: [输入] 任务结构体指针
* @return TaskStatus_t 返回任务状态
* @example TaskDel(&myTask);
*/
TaskStatus_t TaskDel(Task_t *task);
//重新开始以停止的任务
/**
* @brief 重新开始停止的任务
* @param task: [输入] 任务结构体指针
* @return TaskStatus_t 返回任务状态
* @example TaskStart(&myTask);
*/
TaskStatus_t TaskStart(Task_t *task);
//暂停任务执行
/**
* @brief 暂停任务执行
* @param task: [输入] 任务结构体指针
* @return TaskStatus_t 返回任务状态
* @example TaskStop(&myTask);
*/
TaskStatus_t TaskStop(Task_t *task);
//重设任务执行次数
/**
* @brief 重设任务执行次数
* @param task: [输入] 任务结构体指针
* @param runcnt: [输入] 新的执行次数
* @return TaskStatus_t 返回任务状态
* @example TaskSetCnt(&myTask, 5);
*/
TaskStatus_t TaskSetCnt(Task_t *task, TaskCnt_t runcnt);
//重设任务间隔时间
/**
* @brief 重设任务间隔时间
* @param task: [输入] 任务结构体指针
* @param time: [输入] 新的间隔时间
* @return TaskStatus_t 返回任务状态
* @example TaskSetTime(&myTask, 50);
*/
TaskStatus_t TaskSetTime(Task_t *task, TaskTime_t time);
//任务调度
/**
* @brief 任务调度
* @return TaskStatus_t 返回任务状态
* @example TaskRun();
*/
TaskStatus_t TaskRun(void);
#ifdef __cplusplus
}
#endif

View File

@@ -29,16 +29,16 @@ typedef union {
u16 u16;
} Data16_t;
typedef enum { // 定义枚举类型Type_t包含不同数据类型
U8, // 无符号8位整数
U16, // 无符号16位整数
U32, // 无符号32位整数
T_U8, // 无符号8位整数
T_U16, // 无符号16位整数
T_U32, // 无符号32位整数
CHAR, // 字符
SHORT, // 短整数
INT, // 整数
T_CHAR, // 字符
T_SHORT, // 短整数
T_INT, // 整数
FLOAT, // 浮点数
DOUBLE, // 双精度浮点数
T_FLOAT, // 浮点数
T_DOUBLE, // 双精度浮点数
} Type_t;
#define TYPE_T(v) _Generic((v), \
@@ -69,7 +69,7 @@ typedef enum { // 定义枚举类型Type_t包含不同数据类型
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof(arr[0])) // 计算数组的元素个数
#define in , // 定义逗号为in
//#define in , // 定义逗号为in
#define _foreach(e, a) for(size_t e = 0; e < ARRAY_SIZE(a); e++) // 实现foreach宏遍历数组ae为当前元素下标
#define foreach(exp) _foreach(exp) // 定义foreach宏用于遍历数组
@@ -150,7 +150,7 @@ float Str2Float(char *str);
**/
#define PRINT_ARRAY(arr, fmt, frame) do { \
printf("\n"#arr ":\n"); \
foreach(i in arr) {\
for(size_t i = 0; i < ARRAY_SIZE(arr); i++) {\
if(i%frame==0&&i!=0) printf("\n");\
printf(fmt " ", arr[i]); }\
printf("\n"); } while (0)