具体代码和移植方法等下周教程发布后,直接看教程即可。
改成下面的方式,扩展更加方便:
#define HARD_KEY_NUM 8 /* 实体按键个数 */
#define KEY_COUNT (HARD_KEY_NUM + 2) /* 8个独立建 + 2个组合按键 */
/* 使能GPIO时钟 */
#define ALL_KEY_GPIO_CLK_ENABLE() {
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOG_CLK_ENABLE();
__HAL_RCC_GPIOH_CLK_ENABLE();
__HAL_RCC_GPIOI_CLK_ENABLE();
};
/* 依次定义GPIO */
typedef struct
{
GPIO_TypeDef* gpio;
uint16_t pin;
uint8_t ActiveLevel; /* 激活电平 */
}X_GPIO_T;
/* GPIO和PIN定义 */
static const X_GPIO_T s_gpio_list[HARD_KEY_NUM] = {
{GPIOI, GPIO_PIN_8, 0}, /* K1 */
{GPIOC, GPIO_PIN_13, 0}, /* K2 */
{GPIOH, GPIO_PIN_4, 0}, /* K3 */
{GPIOG, GPIO_PIN_2, 0}, /* JOY_U */
{GPIOB, GPIO_PIN_0, 0}, /* JOY_D */
{GPIOG, GPIO_PIN_3, 0}, /* JOY_L */
{GPIOG, GPIO_PIN_7, 0}, /* JOY_R */
{GPIOI, GPIO_PIN_11, 0}, /* JOY_OK */
};
/* 定义一个宏函数简化后续代码
判断GPIO引脚是否有效按下
*/
static KEY_T s_tBtn[KEY_COUNT] = {0};
static KEY_FIFO_T s_tKey; /* 按键FIFO变量,结构体 */
static void bsp_InitKeyVar(void);
static void bsp_InitKeyHard(void);
static void bsp_DetectKey(uint8_t i);
#define KEY_PIN_ACTIVE(id)
/*
*********************************************************************************************************
* 函 数 名: KeyPinActive
* 功能说明: 判断按键是否按下
* 形 参: 无
* 返 回 值: 返回值1 表示按下(导通),0表示未按下(释放)
*********************************************************************************************************
*/
static uint8_t KeyPinActive(uint8_t _id)
{
uint8_t level;
if ((s_gpio_list[_id].gpio->IDR & s_gpio_list[_id].pin) == 0)
{
level = 0;
}
else
{
level = 1;
}
if (level == s_gpio_list[_id].ActiveLevel)
{
return 1;
}
else
{
return 0;
}
}
/*
*********************************************************************************************************
* 函 数 名: IsKeyDownFunc
* 功能说明: 判断按键是否按下。单键和组合键区分。单键事件不允许有其他键按下。
* 形 参: 无
* 返 回 值: 返回值1 表示按下(导通),0表示未按下(释放)
*********************************************************************************************************
*/
static uint8_t IsKeyDownFunc(uint8_t _id)
{
/* 实体单键 */
if (_id < HARD_KEY_NUM)
{
uint8_t i;
uint8_t count = 0;
uint8_t save = 255;
/* 判断有几个键按下 */
for (i = 0; i < HARD_KEY_NUM; i++)
{
if (KeyPinActive(i))
{
count++;
save = i;
}
}
if (count == 1 && save == _id)
{
return 1; /* 只有1个键按下时才有效 */
}
return 0;
}
/* 组合键 K1K2 */
if (_id == HARD_KEY_NUM + 0)
{
if (KeyPinActive(KID_K1) && KeyPinActive(KID_K2))
{
return 1;
}
else
{
return 0;
}
}
/* 组合键 K2K3 */
if (_id == HARD_KEY_NUM + 1)
{
if (KeyPinActive(KID_K2) && KeyPinActive(KID_K3))
{
return 1;
}
else
{
return 0;
}
}
return 0;
} |