/********************************************************************************
* 模块名称:独立按键驱动模块
* 功能说明:扫描独立按键,具有软件滤波机制,具有按键FIFO。可以检测如下事件:
* (1) 按键按下
* (2) 按键弹起
* (3) 长按键
* (4) 长按时自动连发
* 日期:2018.08.15
********************************************************************************/
#include "Skey.h"
/* 为每个按键定义一个结构体变量 */
static KEY_T s_key3; //结构体变量
static KEY_T s_key4;
static KEY_T s_key5;
static KEY_T s_key6;
//static KEY_T s_key01; //按键0/1组合按键, 结构体变量
/* 按键FIFO的结构体变量 */
static KEY_FIFO_T s_tKey;
/********************************************************************************
*函数名 : IsKeyDownX
*功能说明: 判断按键是否按下
*输入参数: 无
*返回值 : 1 表示按下; 0表示未按下;
*备注 : 移植时注意修改
********************************************************************************/
static uint8_t IsKeyDown_key3(void) {if(key_3_val == 0) return 1;else return 0;}
static uint8_t IsKeyDown_key4(void) {if(key_4_val == 0) return 1;else return 0;}
static uint8_t IsKeyDown_key5(void) {if(key_5_val == 0) return 1;else return 0;}
static uint8_t IsKeyDown_key6(void) {if(key_6_val == 0) return 1;else return 0;}
/* 按键0/1的组合键 */
//static uint8_t IsKeyDown_01(void) {if(IsKeyDown_key0() && IsKeyDown_key1()) return 1;else return 0;}
/********************************************************************************
* 函 数 名: bsp_InitKeyVar
* 功能说明: 初始化按键变量
* 形 参: 无
* 返 回 值: 无
********************************************************************************/
static void bsp_InitKeyVar(void)
{
/* 对按键FIFO读写指针清零 */
s_tKey.Read = 0;
s_tKey.Write = 0;
/* 参考模板
// 初始化按键 2 变量,支持按下、弹起、长按、连按
s_key2.IsKeyDownFunc = IsKeyDown_key2; //判断按键按下的函数
s_key2.FilterTime = KEY_FILTER_TIME; //按键滤波时间
s_key2.LongTime = KEY_LONG_TIME; //需要触发长按的时间
s_key2.Count = s_key2.FilterTime >>1; //滤波器计数器。此处的设置无意义。
s_key2.State = 0; //按键缺省状态,0为未按下
s_key2.KeyCodeDown = KEY_2_DOWN; //按键按下的键值代码;0表示不检测按键按下
s_key2.KeyCodeUp = KEY_2_UP; //按键弹起的键值代码;0表示不检测按键弹起
s_key2.KeyCodeLong = KEY_2_LONG; //按键被持续长按按下的键值代码;0表示不检测按键长按
s_key2.RepeatSpeed = 50; //按键连发的速度,即x个时间单位触发一次连按。
//0为不支持连发。(如要检测连发,则长按也必须被支持)
s_key2.RepeatCount = 0; //连发计数器。此项初始值都为0
*/
/* 初始化按键 3 变量,支持按下 */
s_key3.IsKeyDownFunc = IsKeyDown_key3; //判断按键按下的函数
s_key3.FilterTime = KEY_FILTER_TIME; //按键滤波时间
s_key3.LongTime = KEY_LONG_TIME; //需要触发长按的时间
s_key3.Count = s_key3.FilterTime >>1; //滤波器计数器。此处的设置无意义。
s_key3.State = 0; //按键缺省状态,0为未按下
s_key3.KeyCodeDown = KEY_3_DOWN; //按键按下的键值代码;0表示不检测按键按下
s_key3.KeyCodeUp = 0; //按键弹起的键值代码;0表示不检测按键弹起
s_key3.KeyCodeLong = 0; //按键被持续长按按下的键值代码;0表示不检测按键长按
s_key3.RepeatSpeed = 0; //按键连发的速度,即x个时间单位触发一次连按。
//0为不支持连发。(如要检测连发,则长按也必须被支持)
s_key3.RepeatCount = 0; //连发计数器。此项初始值都为0
/* 初始化按键 4 变量,支持按下 */
s_key4.IsKeyDownFunc = IsKeyDown_key4; //判断按键按下的函数
s_key4.FilterTime = KEY_FILTER_TIME; //按键滤波时间
s_key4.LongTime = KEY_LONG_TIME; //需要触发长按的时间
s_key4.Count = s_key4.FilterTime >>1; //滤波器计数器。此处的设置无意义。
s_key4.State = 0; //按键缺省状态,0为未按下
s_key4.KeyCodeDown = KEY_4_DOWN; //按键按下的键值代码;0表示不检测按键按下
s_key4.KeyCodeUp = 0; //按键弹起的键值代码;0表示不检测按键弹起
s_key4.KeyCodeLong = 0; //按键被持续长按按下的键值代码;0表示不检测按键长按
s_key4.RepeatSpeed = 0; //按键连发的速度,即x个时间单位触发一次连按。
//0为不支持连发。(如要检测连发,则长按也必须被支持)
s_key4.RepeatCount = 0; //连发计数器。此项初始值都为0
/* 初始化按键 5 变量,支持按下 */
s_key5.IsKeyDownFunc = IsKeyDown_key5; //判断按键按下的函数
s_key5.FilterTime = KEY_FILTER_TIME; //按键滤波时间
s_key5.LongTime = KEY_LONG_TIME; //需要触发长按的时间
s_key5.Count = s_key5.FilterTime >>1; //滤波器计数器。此处的设置无意义。
s_key5.State = 0; //按键缺省状态,0为未按下
s_key5.KeyCodeDown = KEY_5_DOWN; //按键按下的键值代码;0表示不检测按键按下
s_key5.KeyCodeUp = 0; //按键弹起的键值代码;0表示不检测按键弹起
s_key5.KeyCodeLong = 0; //按键被持续长按按下的键值代码;0表示不检测按键长按
s_key5.RepeatSpeed = 0; //按键连发的速度,即x个时间单位触发一次连按。
//0为不支持连发。(如要检测连发,则长按也必须被支持)
s_key5.RepeatCount = 0; //连发计数器。此项初始值都为0
/* 初始化按键 6 变量,支持按下 */
s_key6.IsKeyDownFunc = IsKeyDown_key6; //判断按键按下的函数
s_key6.FilterTime = KEY_FILTER_TIME; //按键滤波时间
s_key6.LongTime = KEY_LONG_TIME; //需要触发长按的时间
s_key6.Count = s_key6.FilterTime >>1; //滤波器计数器。此处的设置无意义。
s_key6.State = 0; //按键缺省状态,0为未按下
s_key6.KeyCodeDown = KEY_6_DOWN; //按键按下的键值代码;0表示不检测按键按下
s_key6.KeyCodeUp = 0; //按键弹起的键值代码;0表示不检测按键弹起
s_key6.KeyCodeLong = 0; //按键被持续长按按下的键值代码;0表示不检测按键长按
s_key6.RepeatSpeed = 0; //按键连发的速度,即x个时间单位触发一次连按。
//0为不支持连发。(如要检测连发,则长按也必须被支持)
s_key6.RepeatCount = 0; //连发计数器。此项初始值都为0
// /* 初始化组合按键 01 变量,支持按下、弹起、长按 */
// s_key01.IsKeyDownFunc = IsKeyDown_01; //判断按键按下的函数
// s_key01.FilterTime = KEY_FILTER_TIME; //按键滤波时间
// s_key01.LongTime = KEY_LONG_TIME; //需要触发长按的时间
// s_key01.Count = s_key01.FilterTime >>1; //滤波器计数器。此处的设置无意义。
// s_key01.State = 0; //按键缺省状态,0为未按下
// s_key01.KeyCodeDown = KEY_01_DOWN; //按键按下的键值代码;0表示不检测按键按下
// s_key01.KeyCodeUp = KEY_01_UP; //按键弹起的键值代码;0表示不检测按键弹起
// s_key01.KeyCodeLong = KEY_01_LONG; //按键被持续长按按下的键值代码;0表示不检测按键长按
// s_key01.RepeatSpeed = 0; //按键连发的速度,即x个时间单位触发一次连按。
// //0为不支持连发。(如要检测连发,则长按也必须被支持)
// s_key01.RepeatCount = 0; //连发计数器。此项初始值都为0
}
/********************************************************************************
* 函 数 名: bsp_InitKeyHard
* 功能说明: 配置按键对应的GPIO
* 形 参: 无
* 返 回 值: 无
********************************************************************************/
static void bsp_InitKeyHard(void)
{
//如果使用STM32CubeMX配置,则此处可不再写相关配置
}
/********************************************************************************
* 函 数 名: bsp_InitKey
* 功能说明: 初始化按键。
* 形 参: 无
* 返 回 值: 无
* 备注:该函数需在FreeRTOS的开始任务中调用,以初始化按键。
********************************************************************************/
void bsp_InitKey(void)
{
bsp_InitKeyVar(); /* 初始化按键变量 */
bsp_InitKeyHard(); /* 初始化按键硬件 */
}
/********************************************************************************
* 函 数 名: bsp_PutKey
* 功能说明: 将1个键值写入按键FIFO缓冲区。
* 形 参: _KeyCode : 按键代码
* 返 回 值: 无
* 备注:此函数可用于模拟一个按键。
********************************************************************************/
void bsp_PutKey(uint8_t _KeyCode)
{
s_tKey.Buf[s_tKey.Write] = _KeyCode;
if(++s_tKey.Write >= KEY_FIFO_SIZE)
{
s_tKey.Write = 0;
}
}
/********************************************************************************
* 函 数 名: bsp_GetKey
* 功能说明: 从按键FIFO缓冲区读取一个键值。
* 形 参: 无
* 返 回 值: