📄 bsp_button.c
字号:
/*
*********************************************************************************************************
*
* 模块名称 : 按键驱动模块
* 文件名称 : bsp_button.c
* 版 本 : V2.0
* 说 明 : 实现按键的检测,具有软件滤波机制,可以检测如下事件:
* (1) 按键按下
* (2) 按键弹起
* (3) 长按键
* (4) 长按时自动连发
* (5) 组合键
*
* 修改记录 :
* 版本号 日期 作者 说明
* v0.1 2009-12-27 armfly 创建该文件,ST固件库版本为V3.1.2
* v1.0 2011-01-11 armfly ST固件库升级到V3.4.0版本。
* v2.0 2011-10-16 armfly ST固件库升级到V3.5.0版本。
*
* Copyright (C), 2010-2011, 安富莱电子 www.armfly.com
*
*********************************************************************************************************
*/
#include "stm32f10x.h"
#include <stdio.h>
#include "bsp_button.h"
static BUTTON_T s_BtnUser; /* USER 键 */
static BUTTON_T s_BtnTamper; /* TAMPER 键 */
static BUTTON_T s_BtnWakeUp; /* WAKEUP 键 */
static BUTTON_T s_BtnUp; /* 摇杆UP键 */
static BUTTON_T s_BtnDown; /* 摇杆DOWN键 */
static BUTTON_T s_BtnLeft; /* 摇杆LEFT键 */
static BUTTON_T s_BtnRight; /* 摇杆RIGHT键 */
static BUTTON_T s_BtnOk; /* 摇杆OK键 */
static BUTTON_T s_BtnUserTamper;/* 组合键,USER和TAMPER键 */
static KEY_FIFO_T s_Key; /* 按键FIFO变量,结构体 */
static void bsp_InitButtonVar(void);
static void bsp_InitButtonHard(void);
static void bsp_DetectButton(BUTTON_T *_pBtn);
/*
安富莱STM32F103ZE-EK 按键口线分配:
USER键 : PG8 (低电平表示按下)
TAMPEER键 : PC13 (低电平表示按下)
WKUP键 : PA0 (!!!高电平表示按下)
摇杆UP键 : PG15 (低电平表示按下)
摇杆DOWN键 : PD3 (低电平表示按下)
摇杆LEFT键 : PG14 (低电平表示按下)
摇杆RIGHT键: PG13 (低电平表示按下)
摇杆OK键 : PG7 (低电平表示按下)
定义函数判断按键是否按下,返回值1 表示按下,0表示未按下
*/
static uint8_t IsKeyDownUser(void) {if (GPIO_ReadInputDataBit(GPIOG, GPIO_Pin_8) == Bit_SET) return 0; return 1;}
static uint8_t IsKeyDownTamper(void) {if (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13) == Bit_SET) return 0; return 1;}
static uint8_t IsKeyDownWakeUp(void) {if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == Bit_SET) return 1; return 0;}
static uint8_t IsKeyDownUp(void) {if (GPIO_ReadInputDataBit(GPIOG, GPIO_Pin_15) == Bit_SET) return 0; return 1;}
static uint8_t IsKeyDownDown(void) {if (GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_3) == Bit_SET) return 0; return 1;}
static uint8_t IsKeyDownLeft(void) {if (GPIO_ReadInputDataBit(GPIOG, GPIO_Pin_14) == Bit_SET) return 0; return 1;}
static uint8_t IsKeyDownRight(void) {if (GPIO_ReadInputDataBit(GPIOG, GPIO_Pin_13) == Bit_SET) return 0; return 1;}
static uint8_t IsKeyDownOk(void) {if (GPIO_ReadInputDataBit(GPIOG, GPIO_Pin_7) == Bit_SET) return 0; return 1;}
static uint8_t IsKeyDownUserTamper(void) {if (IsKeyDownUser() && IsKeyDownTamper()) return 1; return 0;} /* 组合键 */
/*
*********************************************************************************************************
* 函 数 名: bsp_InitButton
* 功能说明: 初始化按键
* 形 参:无
* 返 回 值: 无
*********************************************************************************************************
*/
void bsp_InitButton(void)
{
bsp_InitButtonVar(); /* 初始化按键变量 */
bsp_InitButtonHard(); /* 初始化按键硬件 */
}
/*
*********************************************************************************************************
* 函 数 名: bsp_PutKey
* 功能说明: 将1个键值压入按键FIFO缓冲区。可用于模拟一个按键。
* 形 参:_KeyCode : 按键代码
* 返 回 值: 无
*********************************************************************************************************
*/
void bsp_PutKey(uint8_t _KeyCode)
{
s_Key.Buf[s_Key.Write] = _KeyCode;
if (++s_Key.Write >= KEY_FIFO_SIZE)
{
s_Key.Write = 0;
}
}
/*
*********************************************************************************************************
* 函 数 名: bsp_GetKey
* 功能说明: 从按键FIFO缓冲区读取一个键值。
* 形 参:无
* 返 回 值: 按键代码
*********************************************************************************************************
*/
uint8_t bsp_GetKey(void)
{
uint8_t ret;
if (s_Key.Read == s_Key.Write)
{
return KEY_NONE;
}
else
{
ret = s_Key.Buf[s_Key.Read];
if (++s_Key.Read >= KEY_FIFO_SIZE)
{
s_Key.Read = 0;
}
return ret;
}
}
/*
*********************************************************************************************************
* 函 数 名: bsp_KeyState
* 功能说明: 读取按键的状态
* 形 参:无
* 返 回 值: 无
*********************************************************************************************************
*/
uint8_t bsp_KeyState(uint8_t _ucKeyID)
{
uint8_t ucState = 0;
switch (_ucKeyID)
{
case KID_TAMPER:
ucState = s_BtnTamper.State;
break;
case KID_WAKEUP:
ucState = s_BtnWakeUp.State;
break;
case KID_USER:
ucState = s_BtnUser.State;
break;
case KID_JOY_UP:
ucState = s_BtnUp.State;
break;
case KID_JOY_DOWN:
ucState = s_BtnDown.State;
break;
case KID_JOY_LEFT:
ucState = s_BtnLeft.State;
break;
case KID_JOY_RIGHT:
ucState = s_BtnRight.State;
break;
case KID_JOY_OK:
ucState = s_BtnOk.State;
break;
}
return ucState;
}
/*
*********************************************************************************************************
* 函 数 名: bsp_InitButtonHard
* 功能说明: 初始化按键硬件
* 形 参:无
* 返 回 值: 无
*********************************************************************************************************
*/
static void bsp_InitButtonHard(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/*
安富莱STM32F103ZE-EK 按键口线分配:
USER键 : PG8 (低电平表示按下)
TAMPEER键 : PC13 (低电平表示按下)
WKUP键 : PA0 (!!!高电平表示按下)
摇杆UP键 : PG15 (低电平表示按下)
摇杆DOWN键 : PD3 (低电平表示按下)
摇杆LEFT键 : PG14 (低电平表示按下)
摇杆RIGHT键: PG13 (低电平表示按下)
摇杆OK键 : PG7 (低电平表示按下)
*/
/* 第1步:打开GPIOA GPIOC GPIOD GPIOF GPIOG的时钟
注意:这个地方可以一次性全打开
*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC
| RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOG, ENABLE);
/* 第2步:配置所有的按键GPIO为浮动输入模式(实际上CPU复位后就是输入状态) */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure); /* PA0 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_Init(GPIOC, &GPIO_InitStructure); /* PC13 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_Init(GPIOD, &GPIO_InitStructure); /* PD3 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_13
| GPIO_Pin_14 | GPIO_Pin_15;
GPIO_Init(GPIOG, &GPIO_InitStructure); /* PG7,8,13,14,15 */
}
/*
*********************************************************************************************************
* 函 数 名: bsp_InitButtonVar
* 功能说明: 初始化按键变量
* 形 参:strName : 例程名称字符串
* strDate : 例程发布日期
* 返 回 值: 无
*********************************************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -