|
发表于 2016-5-13 09:26:30
|
显示全部楼层
- #include "string.h"
- #include "stm32f2xx.h"
- #include "FreeRTOS.h"
- #include "task.h"
- #include "bsp_key.h"
- static KEY_T s_tBtn[KEY_COUNT];
- static KEY_FIFO_T s_tKey; /* 按键FIFO变量,结构体 */
- static void bsp_InitKeyVar(void);
- static void bsp_InitKeyHard(void);
- static void bsp_DetectKey(uint8_t i);
- /*
- *********************************************************************************************************
- * 函 数 名: IsKeyDownX
- * 功能说明: 判断按键是否按下
- * 形 参: 无
- * 返 回 值: 返回值1 表示按下,0表示未按下
- *********************************************************************************************************
- */
- static uint8_t IsKeyDown1(void)
- {
- if ((GPIO_PORT_K1->IDR & GPIO_PIN_K1) == 0 &&
- (GPIO_PORT_K2->IDR & GPIO_PIN_K2) != 0 &&
- (GPIO_PORT_K3->IDR & GPIO_PIN_K3) != 0 &&
- (GPIO_PORT_K4->IDR & GPIO_PIN_K4) != 0 &&
- (GPIO_PORT_K5->IDR & GPIO_PIN_K5) != 0 &&
- (GPIO_PORT_K6->IDR & GPIO_PIN_K6) != 0)
- {
- return 1;
- }
- else
- {
- return 0;
- }
- }
- static uint8_t IsKeyDown2(void)
- {
- if ((GPIO_PORT_K1->IDR & GPIO_PIN_K1) != 0 &&
- (GPIO_PORT_K2->IDR & GPIO_PIN_K2) == 0 &&
- (GPIO_PORT_K3->IDR & GPIO_PIN_K3) != 0 &&
- (GPIO_PORT_K4->IDR & GPIO_PIN_K4) != 0 &&
- (GPIO_PORT_K5->IDR & GPIO_PIN_K5) != 0 &&
- (GPIO_PORT_K6->IDR & GPIO_PIN_K6) != 0)
- {
- return 1;
- }
- else
- {
- return 0;
- }
- }
- static uint8_t IsKeyDown3(void)
- {
- if ((GPIO_PORT_K1->IDR & GPIO_PIN_K1) != 0 &&
- (GPIO_PORT_K2->IDR & GPIO_PIN_K2) != 0 &&
- (GPIO_PORT_K3->IDR & GPIO_PIN_K3) == 0 &&
- (GPIO_PORT_K4->IDR & GPIO_PIN_K4) != 0 &&
- (GPIO_PORT_K5->IDR & GPIO_PIN_K5) != 0 &&
- (GPIO_PORT_K6->IDR & GPIO_PIN_K6) != 0)
- {
- return 1;
- }
- else
- {
- return 0;
- }
- }
- static uint8_t IsKeyDown4(void)
- {
- if ((GPIO_PORT_K1->IDR & GPIO_PIN_K1) != 0 &&
- (GPIO_PORT_K2->IDR & GPIO_PIN_K2) != 0 &&
- (GPIO_PORT_K3->IDR & GPIO_PIN_K3) != 0 &&
- (GPIO_PORT_K4->IDR & GPIO_PIN_K4) == 0 &&
- (GPIO_PORT_K5->IDR & GPIO_PIN_K5) != 0 &&
- (GPIO_PORT_K6->IDR & GPIO_PIN_K6) != 0)
- {
- return 1;
- }
- else
- {
- return 0;
- }
- }
- static uint8_t IsKeyDown5(void)
- {
- if ((GPIO_PORT_K1->IDR & GPIO_PIN_K1) != 0 &&
- (GPIO_PORT_K2->IDR & GPIO_PIN_K2) != 0 &&
- (GPIO_PORT_K3->IDR & GPIO_PIN_K3) != 0 &&
- (GPIO_PORT_K4->IDR & GPIO_PIN_K4) != 0 &&
- (GPIO_PORT_K5->IDR & GPIO_PIN_K5) == 0 &&
- (GPIO_PORT_K6->IDR & GPIO_PIN_K6) != 0)
- {
- return 1;
- }
- else
- {
- return 0;
- }
- }
- static uint8_t IsKeyDown6(void)
- {
- if ((GPIO_PORT_K1->IDR & GPIO_PIN_K1) != 0 &&
- (GPIO_PORT_K2->IDR & GPIO_PIN_K2) != 0 &&
- (GPIO_PORT_K3->IDR & GPIO_PIN_K3) != 0 &&
- (GPIO_PORT_K4->IDR & GPIO_PIN_K4) != 0 &&
- (GPIO_PORT_K5->IDR & GPIO_PIN_K5) != 0 &&
- (GPIO_PORT_K6->IDR & GPIO_PIN_K6) == 0)
- {
- return 1;
- }
- else
- {
- return 0;
- }
- }
- static uint8_t IsKeyDown7(void) /* K1 K6组合键 */
- {
- if ((GPIO_PORT_K1->IDR & GPIO_PIN_K1) == 0 &&
- (GPIO_PORT_K2->IDR & GPIO_PIN_K2) != 0 &&
- (GPIO_PORT_K3->IDR & GPIO_PIN_K3) != 0 &&
- (GPIO_PORT_K4->IDR & GPIO_PIN_K4) != 0 &&
- (GPIO_PORT_K5->IDR & GPIO_PIN_K5) != 0 &&
- (GPIO_PORT_K6->IDR & GPIO_PIN_K6) == 0)
- {
- return 1;
- }
- else
- {
- return 0;
- }
- }
- static uint8_t IsKeyDown8(void) /* K2 K6组合键 */
- {
- if ((GPIO_PORT_K1->IDR & GPIO_PIN_K1) != 0 &&
- (GPIO_PORT_K2->IDR & GPIO_PIN_K2) == 0 &&
- (GPIO_PORT_K3->IDR & GPIO_PIN_K3) != 0 &&
- (GPIO_PORT_K4->IDR & GPIO_PIN_K4) != 0 &&
- (GPIO_PORT_K5->IDR & GPIO_PIN_K5) != 0 &&
- (GPIO_PORT_K6->IDR & GPIO_PIN_K6) == 0)
- {
- return 1;
- }
- else
- {
- return 0;
- }
- }
- static uint8_t IsKeyDown9(void) /* K3 K6组合键 */
- {
- if ((GPIO_PORT_K1->IDR & GPIO_PIN_K1) != 0 &&
- (GPIO_PORT_K2->IDR & GPIO_PIN_K2) != 0 &&
- (GPIO_PORT_K3->IDR & GPIO_PIN_K3) == 0 &&
- (GPIO_PORT_K4->IDR & GPIO_PIN_K4) != 0 &&
- (GPIO_PORT_K5->IDR & GPIO_PIN_K5) != 0 &&
- (GPIO_PORT_K6->IDR & GPIO_PIN_K6) == 0)
- {
- return 1;
- }
- else
- {
- return 0;
- }
- }
- static uint8_t IsKeyDown10(void) /* K4 K6组合键 */
- {
- if ((GPIO_PORT_K1->IDR & GPIO_PIN_K1) != 0 &&
- (GPIO_PORT_K2->IDR & GPIO_PIN_K2) != 0 &&
- (GPIO_PORT_K3->IDR & GPIO_PIN_K3) != 0 &&
- (GPIO_PORT_K4->IDR & GPIO_PIN_K4) == 0 &&
- (GPIO_PORT_K5->IDR & GPIO_PIN_K5) != 0 &&
- (GPIO_PORT_K6->IDR & GPIO_PIN_K6) == 0)
- {
- return 1;
- }
- else
- {
- return 0;
- }
- }
- /*
- *********************************************************************************************************
- * 函 数 名: bsp_InitKey
- * 功能说明: 初始化按键. 该函数被 bsp_Init() 调用。
- * 形 参: 无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- 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缓冲区读取一个键值。
- * 形 参: 无
- * 返 回 值: 按键代码
- *********************************************************************************************************
- */
- uint8_t bsp_GetKey(void)
- {
- uint8_t ret;
-
- #if FREERTOS_ENABLED //如FREERTOS_ENABLED定义了,说明使用FreeRTOS了.
- vTaskDelay(5/portTICK_RATE_MS);//GUI靠按键阻塞的
- #endif
-
- if (s_tKey.Read == s_tKey.Write)
- {
- return KEY_NONE;
- }
- else
- {
- ret = s_tKey.Buf[s_tKey.Read];
- if (++s_tKey.Read >= KEY_FIFO_SIZE)
- {
- s_tKey.Read = 0;
- }
- return ret;
- }
- }
- /*
- *********************************************************************************************************
- * 函 数 名: bsp_GetKeyState
- * 功能说明: 读取按键的状态
- * 形 参: _ucKeyID : 按键ID,从0开始
- * 返 回 值: 1 表示按下, 0 表示未按下
- *********************************************************************************************************
- */
- uint8_t bsp_GetKeyState(KEY_ID_E _ucKeyID)
- {
- return s_tBtn[_ucKeyID].State;
- }
- /*
- *********************************************************************************************************
- * 函 数 名: bsp_SetKeyParam
- * 功能说明: 设置按键参数
- * 形 参:_ucKeyID : 按键ID,从0开始
- * _LongTime : 长按事件时间
- * _RepeatSpeed : 连发速度
- * 返 回 值: 无
- *********************************************************************************************************
- */
- void bsp_SetKeyParam(uint8_t _ucKeyID, uint16_t _LongTime, uint8_t _RepeatSpeed)
- {
- s_tBtn[_ucKeyID].LongTime = _LongTime; /* 长按时间 0 表示不检测长按键事件 */
- s_tBtn[_ucKeyID].RepeatSpeed = _RepeatSpeed; /* 按键连发的速度,0表示不支持连发 */
- s_tBtn[_ucKeyID].RepeatCount = 0; /* 连发计数器 */
- }
- /*
- *********************************************************************************************************
- * 函 数 名: bsp_ClearKey
- * 功能说明: 清空按键FIFO缓冲区
- * 形 参:无
- * 返 回 值: 按键代码
- *********************************************************************************************************
- */
- void bsp_ClearKey(void)
- {
- s_tKey.Read = s_tKey.Write;
- }
- /*
- *********************************************************************************************************
- * 函 数 名: bsp_InitKeyHard
- * 功能说明: 配置按键对应的GPIO
- * 形 参: 无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- static void bsp_InitKeyHard(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_ALL_KEY, ENABLE);
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//输入输出设置,输入/输出/复用/模拟
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//输入模式,上拉
-
- GPIO_InitStructure.GPIO_Pin = GPIO_PIN_K1;
- GPIO_Init(GPIO_PORT_K1, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = GPIO_PIN_K2;
- GPIO_Init(GPIO_PORT_K2, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = GPIO_PIN_K3;
- GPIO_Init(GPIO_PORT_K3, &GPIO_InitStructure);
-
- GPIO_InitStructure.GPIO_Pin = GPIO_PIN_K4;
- GPIO_Init(GPIO_PORT_K4, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = GPIO_PIN_K5;
- GPIO_Init(GPIO_PORT_K5, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = GPIO_PIN_K6;
- GPIO_Init(GPIO_PORT_K6, &GPIO_InitStructure);
- }
- /*
- *********************************************************************************************************
- * 函 数 名: bsp_InitKeyVar
- * 功能说明: 初始化按键变量
- * 形 参: 无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- static void bsp_InitKeyVar(void)
- {
- uint8_t i;
- /* 对按键FIFO读写指针清零 */
- s_tKey.Read = 0;
- s_tKey.Write = 0;
- s_tKey.Read2 = 0;
- /* 给每个按键结构体成员变量赋一组缺省值 */
- for (i = 0; i < KEY_COUNT; i++)
- {
- s_tBtn[i].LongTime = 0; /* 长按时间 0 表示不检测长按键事件 */
- s_tBtn[i].Count = KEY_FILTER_TIME / 2; /* 计数器设置为滤波时间的一半 */
- s_tBtn[i].State = 0; /* 按键缺省状态,0为未按下 */
- s_tBtn[i].KeyCodeDown = 3 * i + 1; /* 按键按下的键值代码 */
- s_tBtn[i].KeyCodeUp = 3 * i + 2; /* 按键弹起的键值代码 */
- s_tBtn[i].KeyCodeLong = 3 * i + 3; /* 按键被持续按下的键值代码 */
- s_tBtn[i].RepeatSpeed = 0; /* 按键连发的速度,0表示不支持连发 */
- s_tBtn[i].RepeatCount = 0; /* 连发计数器 */
- s_tBtn[5].attribute = 0; //按键属性,通用按键
- }
- /* 如果需要单独更改某个按键的参数,可以在此单独重新赋值 */
- //长按连发配置
- s_tBtn[KID_K1].LongTime = KEY_LONG_TIME;
- s_tBtn[KID_K1].RepeatSpeed = 5; /* 每隔50ms自动发送键值 */
- s_tBtn[KID_K2].LongTime = KEY_LONG_TIME;
- s_tBtn[KID_K2].RepeatSpeed = 5; /* 每隔50ms自动发送键值 */
- s_tBtn[KID_K3].LongTime = KEY_LONG_TIME;
- s_tBtn[KID_K3].RepeatSpeed = 5; /* 每隔50ms自动发送键值 */
- s_tBtn[KID_K4].LongTime = KEY_LONG_TIME;
- s_tBtn[KID_K4].RepeatSpeed = 5; /* 每隔50ms自动发送键值 */
-
- s_tBtn[KID_K9].LongTime = KEY_LONG_TIME;
- s_tBtn[KID_K9].RepeatSpeed = 5; /* 每隔50ms自动发送键值 */
- s_tBtn[KID_K10].LongTime = KEY_LONG_TIME;
- s_tBtn[KID_K10].RepeatSpeed = 5;/* 每隔50ms自动发送键值 */
- //按键属性
- s_tBtn[KID_K6].attribute = 2;//shift键
- s_tBtn[KID_K7].attribute = 1;//组合键
- s_tBtn[KID_K8].attribute = 1;//组合键
- s_tBtn[KID_K9].attribute = 1;//组合键
- s_tBtn[KID_K10].attribute = 1;//组合键
-
- /* 判断按键按下的函数 */
- s_tBtn[KID_K1].IsKeyDownFunc = IsKeyDown1;
- s_tBtn[KID_K2].IsKeyDownFunc = IsKeyDown2;
- s_tBtn[KID_K3].IsKeyDownFunc = IsKeyDown3;
- s_tBtn[KID_K4].IsKeyDownFunc = IsKeyDown4;
- s_tBtn[KID_K5].IsKeyDownFunc = IsKeyDown5;
- s_tBtn[KID_K6].IsKeyDownFunc = IsKeyDown6;
- s_tBtn[KID_K7].IsKeyDownFunc = IsKeyDown7;
- s_tBtn[KID_K8].IsKeyDownFunc = IsKeyDown8;
- s_tBtn[KID_K9].IsKeyDownFunc = IsKeyDown9;
- s_tBtn[KID_K10].IsKeyDownFunc = IsKeyDown10;
- }
- /*
- *********************************************************************************************************
- * 函 数 名: bsp_DetectKey
- * 功能说明: 检测一个按键。非阻塞状态,必须被周期性的调用。
- * 形 参: 按键结构变量指针
- * 返 回 值: 无
- *********************************************************************************************************
- */
- static void bsp_DetectKey(uint8_t i)
- {
- static u8 flag = 0;//组合按键触发标识
- KEY_T *pBtn = &s_tBtn[i];
- if (pBtn->IsKeyDownFunc()) //读按键状态,按下
- {
- if (pBtn->Count < KEY_FILTER_TIME)
- {
- pBtn->Count = KEY_FILTER_TIME;
- }
- else if(pBtn->Count < 2 * KEY_FILTER_TIME) //滤波
- {
- pBtn->Count++;
- }
- else
- {
- if (pBtn->State == 0) //保证只触发一次
- {
- pBtn->State = 1;
- if(pBtn->attribute == 1) //组合按键,需要消除独立按键的干扰
- {
- flag = 1;
- bsp_ClearKey();//发送组合按键前,要清一次键值
- }
- /* 发送按钮按下的消息 */
- bsp_PutKey(s_tBtn[i].KeyCodeDown);
- }
- if (pBtn->LongTime > 0) //长按处理代码
- {
- if (pBtn->LongCount < pBtn->LongTime)
- {
- /* 发送按钮持续按下的消息 */
- if (++pBtn->LongCount == pBtn->LongTime)
- {
- /* 键值放入按键FIFO */
- bsp_PutKey(s_tBtn[i].KeyCodeLong);//第一个长按键发送
- }
- }
- else
- {
- if (pBtn->RepeatSpeed > 0) //连续按键周期
- {
- if (++pBtn->RepeatCount >= pBtn->RepeatSpeed)
- {
- pBtn->RepeatCount = 0;
- /* 常按键后,每隔10ms发送1个按键 */
- bsp_PutKey(s_tBtn[i].KeyCodeDown);//长安键值周期发送
- }
- }
- }
- }
- }
- }
- else //弹起
- {
- if(pBtn->Count > KEY_FILTER_TIME)
- {
- pBtn->Count = KEY_FILTER_TIME;
- }
- else if(pBtn->Count != 0)
- {
- pBtn->Count--;
- }
- else
- {
- if (pBtn->State == 1)
- {
- pBtn->State = 0;
-
- /* 发送按钮弹起的消息 */
- bsp_PutKey(s_tBtn[i].KeyCodeUp);
-
- if((flag == 1) && //触发了组合键
- ((pBtn->attribute == 2) || ((bsp_GetKeyState(KID_K6) == 0) && (pBtn->attribute == 1)))) //shift键释放或者组合键同时释放清键值
- {
- flag = 0;
- bsp_ClearKey();//要清一次键值
- }
- }
- }
- pBtn->LongCount = 0;
- pBtn->RepeatCount = 0;
- }
- }
- /*
- *********************************************************************************************************
- * 函 数 名: bsp_KeyScan
- * 功能说明: 扫描所有按键。非阻塞,被systick中断周期性的调用
- * 形 参: 无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- void bsp_KeyScan(void)
- {
- #if KEY_CLEAR //定时请键
- static uint32_t cont = 0;//计数
- #endif
- uint8_t i;
-
- #if KEY_CLEAR //定时请键
- if(cont++ >= 50)
- {
- cont = 0;
- bsp_ClearKey();//要清一次键值
- }
- #endif
-
- for (i = 0; i < KEY_COUNT; i++)
- {
- bsp_DetectKey(i);
- }
- }
复制代码 - #ifndef __BSP_KEY_H
- #define __BSP_KEY_H
- #define KEY6 (GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_15))//读取按键6【exit】
- #define KEY5 (GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5)) //读取按键5【ok】
- #define KEY4 (GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_14))//读取按键4【↓】
- #define KEY3 (GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_12))//读取按键3【↑】
- #define KEY2 (GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_11))//读取按键2【→】
- #define KEY1 (GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_13))//读取按键1【←】
- /* 按键口对应的RCC时钟 */
- #define RCC_ALL_KEY (RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOG)
- #define GPIO_PORT_K1 GPIOG
- #define GPIO_PIN_K1 GPIO_Pin_13
- #define GPIO_PORT_K2 GPIOG
- #define GPIO_PIN_K2 GPIO_Pin_11
- #define GPIO_PORT_K3 GPIOG
- #define GPIO_PIN_K3 GPIO_Pin_12
- #define GPIO_PORT_K4 GPIOG
- #define GPIO_PIN_K4 GPIO_Pin_14
- #define GPIO_PORT_K5 GPIOB
- #define GPIO_PIN_K5 GPIO_Pin_5
- #define GPIO_PORT_K6 GPIOG
- #define GPIO_PIN_K6 GPIO_Pin_15
- /*
- 按键滤波时间50ms, 单位10ms。
- 只有连续检测到50ms状态不变才认为有效,包括弹起和按下两种事件
- 即使按键电路不做硬件滤波,该滤波机制也可以保证可靠地检测到按键事件
- */
- #define KEY_COUNT 10 /* 按键个数, 6个独立建 + 4个组合键 */
- #define KEY_FIFO_SIZE 10 /* 按键FIFO用到变量 */
- #define KEY_FILTER_TIME 2 /* 滤波时间 */
- #define KEY_LONG_TIME 100 /* 单位10ms, 持续1秒,认为长按事件 */
- #define KEY_CLEAR 50 /* 定时清除按键,以10ms为单位,不定义则不使用;
- 按键fifo带来一个问题:按键具有记忆功能,如果应用程序和按键(优先级高一些)产生了异步,会产生连锁响应*/
- /* 根据应用程序的功能重命名按键宏 */
- #define KEY_LEFT_PRESS KEY_1_DOWN //【←】
- //#define KEY_LEFT_UNDO KEY_1_UP
- //#define KEY_LEFT_LONG KEY_1_LONG
- #define KEY_RIGHT_PRESS KEY_2_DOWN //【→】
- //#define KEY_RIGHT_UNDO KEY_2_UP
- //#define KEY_RIGHT_LONG KEY_2_LONG
- #define KEY_UP_PRESS KEY_3_DOWN //【↑】
- //#define KEY_UP_UNDO KEY_3_UP
- //#define KEY_UP_LONG KEY_3_LONG
- #define KEY_DOWN_PRESS KEY_4_DOWN //【↓】
- //#define KEY_DOWN_UNDO KEY_4_UP
- //#define KEY_DOWN_LONG KEY_4_LONG
- #define KEY_ENTER_PRESS KEY_5_DOWN //【OK】
- //#define KEY_ENTER_UNDO KEY_5_UP
- //#define KEY_ENTER_LONG KEY_5_LONG
- //#define KEY_ESC_PRESS KEY_6_DOWN //【Esc】
- #define KEY_ESC_UNDO KEY_6_UP
- //#define KEY_ESC_LONG KEY_6_LONG
- //组合键
- #define KEY_SET_PRESS KEY_7_DOWN
- //#define KEY_SET_UNDO KEY_7_UP
- //#define KEY_SET_LONG KEY_7_LONG
- #define KEY_SHIFT1_PRESS KEY_8_DOWN
- //#define KEY_SHIFT1_UNDO KEY_8_UP
- //#define KEY_SHIFT1_LONG KEY_8_LONG
- #define KEY_SHIFT_UP_PRESS KEY_9_DOWN
- //#define KEY_SHIFT_UP_UNDO KEY_9_UP
- //#define KEY_SHIFT_UP_LONG KEY_9_LONG
- #define KEY_SHIFT_DOWN_PRESS KEY_10_DOWN
- //#define KEY_SHIFT_DOWN_UNDO KEY_10_UP
- //#define KEY_SHIFT_DOWN_LONG KEY_10_LONG
- /* 按键ID, 主要用于bsp_KeyState()函数的入口参数 */
- typedef enum
- {
- KID_K1 = 0,
- KID_K2,
- KID_K3,
- KID_K4,
- KID_K5,
- KID_K6,
- KID_K7,
- KID_K8,
- KID_K9,
- KID_K10
- }KEY_ID_E;
- /*
- 每个按键对应1个全局的结构体变量。
- */
- typedef struct
- {
- /* 下面是一个函数指针,指向判断按键手否按下的函数 */
- uint8_t (*IsKeyDownFunc)(void); /* 按键按下的判断函数,1表示按下 */
- uint8_t Count; /* 滤波器计数器 */
- uint16_t LongCount; /* 长按计数器 */
- uint16_t LongTime; /* 按键按下持续时间, 0表示不检测长按 */
- uint8_t State; /* 按键当前状态(按下还是弹起) */
- uint8_t KeyCodeDown; /* 按键按下的键值代码 */
- uint8_t KeyCodeUp; /* 按键弹起的键值代码 */
- uint8_t KeyCodeLong; /* 按键被持续按下的键值代码 */
- uint8_t RepeatSpeed; /* 连续按键周期 */
- uint8_t RepeatCount; /* 连续按键计数器 */
- uint8_t attribute; //属性,0,通用按键(独立按键);1,组合按键;2,shift键
- }KEY_T;
- /*
- 定义键值代码, 必须按如下次序定时每个键的按下、弹起和长按事件
- */
- typedef enum
- {
- KEY_NONE = 0, /* 0 表示按键事件 */
- KEY_1_DOWN, /* 1键按下 */
- KEY_1_UP, /* 1键弹起 */
- KEY_1_LONG, /* 1键长按 */
- KEY_2_DOWN, /* 2键按下 */
- KEY_2_UP, /* 2键弹起 */
- KEY_2_LONG, /* 2键长按 */
- KEY_3_DOWN, /* 3键按下 */
- KEY_3_UP, /* 3键弹起 */
- KEY_3_LONG, /* 3键长按 */
- KEY_4_DOWN, /* 4键按下 */
- KEY_4_UP, /* 4键弹起 */
- KEY_4_LONG, /* 4键长按 */
- KEY_5_DOWN, /* 5键按下 */
- KEY_5_UP, /* 5键弹起 */
- KEY_5_LONG, /* 5键长按 */
- KEY_6_DOWN, /* 6键按下 */
- KEY_6_UP, /* 6键弹起 */
- KEY_6_LONG, /* 6键长按 */
-
- /* 组合键 */
- KEY_7_DOWN, /* 7键按下 */
- KEY_7_UP, /* 7键弹起 */
- KEY_7_LONG, /* 7键长按 */
- KEY_8_DOWN, /* 8键按下 */
- KEY_8_UP, /* 8键弹起 */
- KEY_8_LONG, /* 8键长按 */
-
- KEY_9_DOWN, /* 9键按下 */
- KEY_9_UP, /* 9键弹起 */
- KEY_9_LONG, /* 9键长按 */
- KEY_10_DOWN, /* 10键按下 */
- KEY_10_UP, /* 10键弹起 */
- KEY_10_LONG, /* 10键长按 */
- }KEY_ENUM;
- typedef struct
- {
- uint8_t Buf[KEY_FIFO_SIZE]; /* 键值缓冲区 */
- uint8_t Read; /* 缓冲区读指针1 */
- uint8_t Write; /* 缓冲区写指针 */
- uint8_t Read2; /* 缓冲区读指针2 */
- }KEY_FIFO_T;
- /* 供外部调用的函数声明 */
- void bsp_InitKey(void);
- void bsp_KeyScan(void);
- void bsp_PutKey(uint8_t _KeyCode);
- uint8_t bsp_GetKey(void);
- uint8_t Key_GetState(KEY_ID_E _ucKeyID);
- void bsp_SetKeyParam(uint8_t _ucKeyID, uint16_t _LongTime, uint8_t _RepeatSpeed);
- void bsp_ClearKey(void);
- #endif //__BSP_KEY_H
复制代码 |
|