本篇博文最后修改时间:2017年03月24日,18:57。
一、简介
本文以SimpleBLEPeripheral为例,介绍如何将普通IO口(P01、P11、P12、P13、P14)自定义为长短按键,实现按键3S以内松开为短按键、3S之后松开为长按键。
注意:
1、本文添加按键方法不与协议栈的按键相冲突,但本文所用的P01引脚与协议栈的S1按键冲突,因此需屏蔽协议栈的按键。
2、P11没有内部上拉电阻,需外接10K电阻至VCC。其他引脚也建议外部上拉电阻,实测没有上拉电阻会导致乱进中断服务函数。
3、同一时间只能有一个按键,本驱动不支持组合按键。
二、实验平台
协议栈版本:BLE-CC254x-1.4.0
编译软件:IAR 8.20.2
硬件平台:smart RF开发板(主芯片CC2541)
三、版权声明
博主:甜甜的大香瓜
声明:喝水不忘挖井人,转载请注明出处。
原文地址:http://blog.csdn.NET/feilusia
联系方式:897503845@qq.com
香瓜BLE之CC2541群:127442605
香瓜BLE之CC2640群:557278427
1)《CC2541之按键》:http://blog.csdn.NET/feilusia/article/details/47336473
2)《CC2541之自定义按键》:http://blog.csdn.Net/feilusia/article/details/50535963
3)《CC2541之自定义长短按键》:http://blog.csdn.net/feilusia/article/details/50725055
五、基础知识
暂无
六、实验步骤
1、编写并添加自定义的按键驱动
1)写一个按键驱动GUA_Key.c(存放在“……\BLE-CC254x-1.4.0\Projects\ble\SimpleBLEPeripheral\Source\GUA”路径下)
//******************************************************************************
//name: GUA_Key.c
//introduce: 香瓜自定义的按键驱动
//author: 甜甜的大香瓜
//email: 897503845@qq.com
//QQ group 香瓜BLE之CC2541(127442605)
//changetime: 2017.01.03
//******************************************************************************
#include <ioCC2540.h>
#include "GUA_Key.h"
/*********************宏定义************************/
//注册时使用的宏
#define GUA_NO_TASK_ID 0xFF //没有注册时的任务id
#define GUA_NO_EVEN_ID 0x0000 //没有注册时的事件id
//中断消抖时使用的宏
#define GUA_KEY_DEBOUNCE_VALUE 20 //消抖时间20ms
/*********************内部变量************************/
static GUA_U8 sGUA_RegisteredKeyTaskID = GUA_NO_TASK_ID;
static GUA_U16 sGUA_RegisteredKeyEvenID = GUA_NO_EVEN_ID;
static GUA_U8 sGUA_Key_Value = GUA_KEY_VALUE_NULL;
/*********************外部变量************************/
GUA_U8 gGUA_Key_Time = 0; //按键按下的时长
GUA_U8 gGUA_Key_State = GUA_KEY_STATE_IDLE; //按键状态
/*********************函数声明************************/
extern GUA_U8 osal_start_timerEx(GUA_U8 task_id, GUA_U16 event_id, GUA_U32 timeout_value);
//******************************************************************************
//name: GUA_Key_Init
//introduce: 按键初始化
//parameter: none
//return: none
//author: 甜甜的大香瓜
//email: 897503845@qq.com
//QQ group 香瓜BLE之CC2541(127442605)
//changetime: 2017.01.03
//******************************************************************************
void GUA_Key_Init(void)
{
//P01
P0SEL &= ~(1 << 1); //P01设置为IO口
P0DIR &= ~(1 << 1); //P01设置为输入
P0INP &= ~(1 << 1); //P01上拉下拉模式
P2INP &= ~(1 << 5); //P0上拉
P0_1 = 1; //P01拉高
P0IFG &= ~(1 << 1); //初始化P01中断标志位
PICTL |= (1 << 0); //P00~P07下降沿触发
P0IEN |= (1 << 1); //使能P01中断
IEN1 |= (1 << 5); //允许P0口中断
//P11(需要外部上拉)
P1SEL &= ~(1 << 1); //P11设置为IO口
P1DIR &= ~(1 << 1); //P11设置为输入
P1_1 = 1; //P11拉高
P1IFG &= ~(1 << 1); //初始化P11中断标志位
PICTL |= (1 << 1); //P10~P13下降沿触发
P1IEN |= (1 << 1); //使能P11中断
IEN2 |= (1 << 4); //允许P1口中断
//P12
P1SEL &= ~(1 << 2); //P12设置为IO口
P1DIR &= ~(1 << 2); //P12设置为输入
P1INP &= ~(1 << 2); //P12上拉下拉模式
P2INP &= ~(1 << 6); //P1上拉
P1_2 = 1; //P12拉高
P1IFG &= ~(1 << 2); //初始化P12中断标志位
PICTL |= (1 << 1); //P10~P13下降沿触发
P1IEN |= (1 << 2); //使能P12中断
IEN2 |= (1 << 4); //允许P1口中断
//P13
P1SEL &= ~(1 << 3); //P13设置为IO口
P1DIR &= ~(1 << 3); //P13设置为输入
P1INP &= ~(1 << 3); //P13上拉下拉模式
P2INP &= ~(1 << 6); //P1上拉
P1_3 = 1; //P13拉高
P1IFG &= ~(1 << 3); //初始化P13中断标志位
PICTL |= (1 << 1); //P10~P13下降沿触发
P1IEN |= (1 << 3); //使能P13中断
IEN2 |= (1 << 4); //允许P1口中断
//P14
P1SEL &= ~(1 << 4); //P14设置为IO口
P1DIR &= ~(1 << 4); //P14设置为输入
P1INP &= ~(1 << 4); //P14上拉下拉模式
P2INP &= ~(1 << 6); //P1上拉
P1_4 = 1; //P14拉高
P1IFG &= ~(1 << 4); //初始化P14中断标志位
PICTL |= (1 << 2); //P14~P17下降沿触发
P1IEN |= (1 << 4); //使能P14中断
IEN2 |= (1 << 4); //允许P1口中断
}
//******************************************************************************
//name: GUA_RegisterForKey
//introduce: 注册任务号、处理事件号
//parameter: GUA_Task_Id:任务id
// GUA_Even_Id:事件id
//return: none
//author: 甜甜的大香瓜
//email: 897503845@qq.com
//QQ group 香瓜BLE之CC2541(127442605)
//changetime: 2017.01.03
//******************************************************************************
GUA_U8 GUA_RegisterForKey(GUA_U8 GUA_Task_Id, GUA_U16 GUA_Even_Id)
{
//没注册过则注册任务
if(sGUA_RegisteredKeyTaskID == GUA_NO_TASK_ID)
{
sGUA_RegisteredKeyTaskID = GUA_Task_Id;
}
else
{
return GUA_FALSE;
}
//没注册过则注册事件
if(sGUA_RegisteredKeyEvenID == GUA_NO_EVEN_ID)
{
sGUA_RegisteredKeyEvenID = GUA_Even_Id;
}
else
{
return GUA_FALSE;
}
return GUA_TRUE;
}
//******************************************************************************
//name: GUA_Key_Set_Value
//introduce: 保存当前按下的键值
//parameter: nGUA_Key_Value:
// GUA_KEY_VALUE_P01
// GUA_KEY_VALUE_P11
// GUA_KEY_VALUE_P12
// GUA_KEY_VALUE_P13
// GUA_KEY_VALUE_P14
// GUA_KEY_VALUE_NULL
//return: none
//author: 甜甜的大香瓜
//email: 897503845@qq.com
//QQ group 香瓜BLE之CC2541(127442605)
//changetime: 2017.01.03
//******************************************************************************
void GUA_Key_Set_Value(GUA_U8 nGUA_Key_Value)
{
sGUA_Key_Value = nGUA_Key_Value;
}
//******************************************************************************
//name: GUA_Key_Get_Value
//introduce: 读取当前按下的键值
//parameter: none
//return: GUA_KEY_VALUE_P01
// GUA_KEY_VALUE_P11
// GUA_KEY_VALUE_P12
// GUA_KEY_VALUE_P13
// GUA_KEY_VALUE_P14
// GUA_KEY_VALUE_NULL
//author: 甜甜的大香瓜
//email: 897503845@qq.com
//QQ group 香瓜BLE之CC2541(127442605)
//changetime: 2017.01.03
//******************************************************************************
GUA_U8 GUA_Key_Get_Value(void)
{
return sGUA_Key_Value;
}
//******************************************************************************
//name: GUA_Key_Check_Pin
//introduce: 按键检测高低电平状态
//parameter: nGUA_Key_Check_Pin:
// GUA_KEY_CHECK_P01
// GUA_KEY_CHECK_P11
// GUA_KEY_CHECK_P12
// GUA_KEY_CHECK_P13
// GUA_KEY_CHECK_P14
//return: none
//author: 甜甜的大香瓜
//email: 897503845@qq.com
//QQ group 香瓜BLE之CC2541(127442605)
//changetime: 2017.01.03
//******************************************************************************
GUA_U8 GUA_Key_Check_Pin(GUA_U8 nGUA_Key_Check_Pin)
{
//要检测的IO
switch(nGUA_Key_Check_Pin)
{
//P01
case GUA_KEY_CHECK_P01:
{
if(P0 & (1 << 1))
{
return GUA_KEY_LOOSEN;
}
else
{
return GUA_KEY_PRESS;
}
break;
}
//P11
case GUA_KEY_CHECK_P11:
{
if(P1 & (1 << 1))
{
return GUA_KEY_LOOSEN;
}
else
{
return GUA_KEY_PRESS;
}
break;
}
//P12
case GUA_KEY_CHECK_P12:
{
if(P1 & (1 << 2))
{
return GUA_KEY_LOOSEN;
}
else
{
return GUA_KEY_PRESS;
}
break;
}
//P13
case GUA_KEY_CHECK_P13:
{
if(P1 & (1 << 3))
{
return GUA_KEY_LOOSEN;
}
else
{
return GUA_KEY_PRESS;
}
break;
}
//P14
case GUA_KEY_CHECK_P14:
{
if(P1 & (1 << 4))
{
return GUA_KEY_LOOSEN;
}
else
{
return GUA_KEY_PRESS;
}
break;
}
//其它
default:break;
}
return GUA_KEY_LOOSEN;
}
//******************************************************************************
//name: P0_ISR
//introduce: P0的中断入口
//parameter: none
//return: none
//author: 甜甜的大香瓜
//email: 897503845@qq.com
//QQ group 香瓜BLE之CC2541(127442605)
//changetime: 2017.01.03
//******************************************************************************
#pragma vector = P0INT_VECTOR
__interrupt void P0_ISR(void)
{
GUA_U8 nGUA_Valid = GUA_FALSE;
//当前没有已按的按键,则处理
if(GUA_Key_Get_Value() == GUA_KEY_VALUE_NULL)
{
//检测P01口是否触发
if(GUA_Key_Check_Pin(GUA_KEY_CHECK_P01) == GUA_KEY_PRESS)
{
//存储键值
GUA_Key_Set_Value(GUA_KEY_VALUE_P01);
//有效键值的标志
nGUA_Valid = GUA_TRUE;
}
//判断是否有有效按键
if(nGUA_Valid == GUA_TRUE)
{
osal_start_timerEx(sGUA_RegisteredKeyTaskID, sGUA_RegisteredKeyEvenID, GUA_KEY_DEBOUNCE_VALUE);
}
}
//清除中断标志
P0IFG = 0;
P0IF = 0;
}
//******************************************************************************
//name: P1_ISR
//introduce: P1的中断入口
//parameter: none
//return: none
//author: 甜甜的大香瓜
//email: 897503845@qq.com
//QQ group 香瓜BLE之CC2541(127442605)
//changetime: 2017.01.03
//******************************************************************************
#pragma vector = P1INT_VECTOR
__interrupt void P1_ISR(void)
{
GUA_U8 nGUA_Valid = GUA_FALSE;
//当前没有已按的按键,则处理
if(GUA_Key_Get_Value() == GUA_KEY_VALUE_NULL)
{
//检测P11口是否触发
if(GUA_Key_Check_Pin(GUA_KEY_CHECK_P11) == GUA_KEY_PRESS)
{
//存储键值
GUA_Key_Set_Value(GUA_KEY_VALUE_P11);
//有效键值的标志
nGUA_Valid = GUA_TRUE;
}
//检测P12口是否触发
if(GUA_Key_Check_Pin(GUA_KEY_CHECK_P12) == GUA_KEY_PRESS)
{
//存储键值
GUA_Key_Set_Value(GUA_KEY_VALUE_P12);
//有效键值的标志
nGUA_Valid = GUA_TRUE;
}
//检测P13口是否触发
if(GUA_Key_Check_Pin(GUA_KEY_CHECK_P13) == GUA_KEY_PRESS)
{
//存储键值
GUA_Key_Set_Value(GUA_KEY_VALUE_P13);
//有效键值的标志
nGUA_Valid = GUA_TRUE;
}
//检测P14口是否触发
if(GUA_Key_Check_Pin(GUA_KEY_CHECK_P14) == GUA_KEY_PRESS)
{
//存储键值
GUA_Key_Set_Value(GUA_KEY_VALUE_P14);
//有效键值的标志
nGUA_Valid = GUA_TRUE;
}
//判断是否有有效按键
if(nGUA_Valid == GUA_TRUE)
{
osal_start_timerEx(sGUA_RegisteredKeyTaskID, sGUA_RegisteredKeyEvenID, GUA_KEY_DEBOUNCE_VALUE);
}
}
//清除中断标志
P1IFG = 0;
P1IF = 0;
}
2)写一个按键驱动头文件GUA_Key.h(存放在“……\BLE-CC254x-1.4.0\Projects\ble\SimpleBLEPeripheral\Source\GUA”路径下)
//******************************************************************************
//name: GUA_Key.h
//introduce: 香瓜自定义的按键驱动头文件
//author: 甜甜的大香瓜
//email: 897503845@qq.com
//QQ group 香瓜BLE之CC2541(127442605)
//changetime: 2017.01.03
//******************************************************************************
#ifndef _GUA_KEY_H_
#define _GUA_KEY_H_
/*********************宏定义************************/
#ifndef GUA_U8
typedef unsigned char GUA_U8;
#endif
#ifndef GUA_8
typedef signed char GUA_8;
#endif
#ifndef GUA_U16
typedef unsigned short GUA_U16;
#endif
#ifndef GUA_16
typedef signed short GUA_16;
#endif
#ifndef GUA_U32
typedef unsigned long GUA_U32;
#endif
#ifndef GUA_32
typedef signed long GUA_32;
#endif
#ifndef GUA_U64
typedef unsigned long long GUA_U64;
#endif
#ifndef GUA_64
typedef signed long long GUA_64;
#endif
#ifndef GUA_FALSE
#define GUA_FALSE 0
#endif
#ifndef GUA_TRUE
#define GUA_TRUE 1
#endif
//检测io口状态时使用的宏
#define GUA_KEY_LOOSEN 0x01
#define GUA_KEY_PRESS 0x00
//按键需要检测电平的宏
#define GUA_KEY_CHECK_P01 0
#define GUA_KEY_CHECK_P11 1
#define GUA_KEY_CHECK_P12 2
#define GUA_KEY_CHECK_P13 3
#define GUA_KEY_CHECK_P14 4
//按键键值的宏
#define GUA_KEY_VALUE_P01 0
#define GUA_KEY_VALUE_P11 1
#define GUA_KEY_VALUE_P12 2
#define GUA_KEY_VALUE_P13 3
#define GUA_KEY_VALUE_P14 4
#define GUA_KEY_VALUE_NULL 255
//按键扫描时间
#define SBP_GUA_KEY_CHECK_PROCESS_EVT_PERIOD 300
//超过这个时长,则算长按键
#define GUA_KEY_TIMER_OVER 10
//按键状态
#define GUA_KEY_STATE_IDLE 0
#define GUA_KEY_STATE_SHORT 1
#define GUA_KEY_STATE_LONG 2
/*********************外部变量************************/
extern GUA_U8 gGUA_Key_Time; //按键按下的时长
extern GUA_U8 gGUA_Key_State; //按键状态
/*********************外部函数声明************************/
extern void GUA_Key_Init(void);
extern GUA_U8 GUA_RegisterForKey(GUA_U8 GUA_Task_Id, GUA_U16 GUA_Even_Id);
extern void GUA_Key_Set_Value(GUA_U8 nGUA_Key_Value);
extern GUA_U8 GUA_Key_Get_Value(void);
extern GUA_U8 GUA_Key_Check_Pin(GUA_U8 nGUA_Key_Check_Pin) ;
#endif
3)工程中添加GUA_Key.c
4)在IAR设置中添加按键驱动源文件路径
$PROJ_DIR$\..\..\SimpleBLEPeripheral\Source\GUA
2、定义按键消抖事件、按键处理事件
1)定义按键消抖事件、按键处理事件(SimpleBLEPeripheral.c的SimpleBLEPeripheral_ProcessEvent中)
//按键消抖事件
if(events & SBP_GUA_KEY_DEBOUNCE_EVT)
{
GUA_U8 nGUA_Valid = GUA_FALSE;
//判断之前按下的按键是否消抖后还在
switch(GUA_Key_Get_Value())
{
//P01
case GUA_KEY_VALUE_P01:
{
//如果当前键值还在,则为有效按键
if(GUA_Key_Check_Pin(GUA_KEY_CHECK_P01) == GUA_KEY_PRESS)
{
nGUA_Valid = GUA_TRUE;
}
//如果当前按键不在,则为无效按键
else
{
GUA_Key_Set_Value(GUA_KEY_VALUE_NULL);
nGUA_Valid = GUA_FALSE;
}
break;
}
//P11
case GUA_KEY_VALUE_P11:
{
//如果当前键值还在,则为有效按键
if(GUA_Key_Check_Pin(GUA_KEY_CHECK_P11) == GUA_KEY_PRESS)
{
nGUA_Valid = GUA_TRUE;
}
//如果当前按键不在,则为无效按键
else
{
GUA_Key_Set_Value(GUA_KEY_VALUE_NULL);
nGUA_Valid = GUA_FALSE;
}
break;
}
//P12
case GUA_KEY_VALUE_P12:
{
//如果当前键值还在,则为有效按键
if(GUA_Key_Check_Pin(GUA_KEY_CHECK_P12) == GUA_KEY_PRESS)
{
nGUA_Valid = GUA_TRUE;
}
//如果当前按键不在,则为无效按键
else
{
GUA_Key_Set_Value(GUA_KEY_VALUE_NULL);
nGUA_Valid = GUA_FALSE;
}
break;
}
//P13
case GUA_KEY_VALUE_P13:
{
//如果当前键值还在,则为有效按键
if(GUA_Key_Check_Pin(GUA_KEY_CHECK_P13) == GUA_KEY_PRESS)
{
nGUA_Valid = GUA_TRUE;
}
//如果当前按键不在,则为无效按键
else
{
GUA_Key_Set_Value(GUA_KEY_VALUE_NULL);
nGUA_Valid = GUA_FALSE;
}
break;
}
//P14
case GUA_KEY_VALUE_P14:
{
//如果当前键值还在,则为有效按键
if(GUA_Key_Check_Pin(GUA_KEY_CHECK_P14) == GUA_KEY_PRESS)
{
nGUA_Valid = GUA_TRUE;
}
//如果当前按键不在,则为无效按键
else
{
GUA_Key_Set_Value(GUA_KEY_VALUE_NULL);
nGUA_Valid = GUA_FALSE;
}
break;
}
//其它
default:
{
GUA_Key_Set_Value(GUA_KEY_VALUE_NULL);
nGUA_Valid = GUA_FALSE;
}
}
//判断是否有有效按键
if(nGUA_Valid == GUA_TRUE)
{
//定时300ms检测一次按键,如果3S内松开则为短按键,超过3S松开则为长按键
osal_start_timerEx(simpleBLEPeripheral_TaskID, SBP_GUA_KEY_CHECK_PROCESS_EVT, SBP_GUA_KEY_CHECK_PROCESS_EVT_PERIOD);
}
return (events ^ SBP_GUA_KEY_DEBOUNCE_EVT);
}
//按键检测处理事件
if(events & SBP_GUA_KEY_CHECK_PROCESS_EVT)
{
GUA_U8 nGUA_Valid = GUA_FALSE;
//判断之前按下的按键是否消抖后还在
switch(GUA_Key_Get_Value())
{
//P01
case GUA_KEY_VALUE_P01:
{
//如果当前键值还在,则为有效按键
if(GUA_Key_Check_Pin(GUA_KEY_CHECK_P01) == GUA_KEY_PRESS)
{
nGUA_Valid = GUA_TRUE;
}
//如果当前按键不在,则为无效按键
else
{
nGUA_Valid = GUA_FALSE;
}
break;
}
//P11
case GUA_KEY_VALUE_P11:
{
//如果当前键值还在,则为有效按键
if(GUA_Key_Check_Pin(GUA_KEY_CHECK_P11) == GUA_KEY_PRESS)
{
nGUA_Valid = GUA_TRUE;
}
//如果当前按键不在,则为无效按键
else
{
nGUA_Valid = GUA_FALSE;
}
break;
}
//P12
case GUA_KEY_VALUE_P12:
{
//如果当前键值还在,则为有效按键
if(GUA_Key_Check_Pin(GUA_KEY_CHECK_P12) == GUA_KEY_PRESS)
{
nGUA_Valid = GUA_TRUE;
}
//如果当前按键不在,则为无效按键
else
{
nGUA_Valid = GUA_FALSE;
}
break;
}
//P13
case GUA_KEY_VALUE_P13:
{
//如果当前键值还在,则为有效按键
if(GUA_Key_Check_Pin(GUA_KEY_CHECK_P13) == GUA_KEY_PRESS)
{
nGUA_Valid = GUA_TRUE;
}
//如果当前按键不在,则为无效按键
else
{
nGUA_Valid = GUA_FALSE;
}
break;
}
//P14
case GUA_KEY_VALUE_P14:
{
//如果当前键值还在,则为有效按键
if(GUA_Key_Check_Pin(GUA_KEY_CHECK_P14) == GUA_KEY_PRESS)
{
nGUA_Valid = GUA_TRUE;
}
//如果当前按键不在,则为无效按键
else
{
nGUA_Valid = GUA_FALSE;
}
break;
}
//其它
default:
{
nGUA_Valid = GUA_FALSE;
}
}
//如果按键还按着,则计数
if(nGUA_Valid == GUA_TRUE)
{
//如果超时,则算长按键,直接进行长按键的处理
if(++gGUA_Key_Time > GUA_KEY_TIMER_OVER)
{
//标记为长按键
gGUA_Key_State = GUA_KEY_STATE_LONG;
//时长清零
gGUA_Key_Time = 0;
}
else
{
//定时300ms检测一次按键,如果3S内松开则为短按键,超过3S松开则为长按键
osal_start_timerEx(simpleBLEPeripheral_TaskID, SBP_GUA_KEY_CHECK_PROCESS_EVT, SBP_GUA_KEY_CHECK_PROCESS_EVT_PERIOD);
}
}
//如果按键松开了
else
{
//标记为短按键
gGUA_Key_State = GUA_KEY_STATE_SHORT;
//时长清零
gGUA_Key_Time = 0;
}
switch(gGUA_Key_State)
{
//短按键处理
case GUA_KEY_STATE_SHORT:
{
//执行短按键函数
GUA_Key_Short_Process();
//清除标志
gGUA_Key_State = GUA_KEY_STATE_IDLE;
break;
}
//长按键处理
case GUA_KEY_STATE_LONG:
{
//执行长按键函数
GUA_Key_Long_Process();
//清除标志
gGUA_Key_State = GUA_KEY_STATE_IDLE;
break;
}
//其他
default:break;
}
return (events ^ SBP_GUA_KEY_CHECK_PROCESS_EVT);
}
2)定义按键消抖事件的宏、按键处理事件的宏(SimpleBLEPeripheral.h中)
#define SBP_GUA_KEY_DEBOUNCE_EVT 0x1000 //按键消抖时间
#define SBP_GUA_KEY_CHECK_PROCESS_EVT 0x2000 //按键检测处理事件
3、定义并声明长、短按键处理函数(SimpleBLEPeripheral.c中)
1)定义长、短按键处理函数
//******************************************************************************
//name: GUA_Key_Short_Process
//introduce: 短按键处理函数
//parameter: none
//return: none
//author: 甜甜的大香瓜
//email: 897503845@qq.com
//QQ group 香瓜BLE之CC2541(127442605)
//changetime: 2017.01.03
//******************************************************************************
static void GUA_Key_Short_Process(void)
{
//判断之前按下的按键是否消抖后还在
switch(GUA_Key_Get_Value())
{
//P01
case GUA_KEY_VALUE_P01:
{
break;
}
//P11
case GUA_KEY_VALUE_P11:
{
break;
}
//P12
case GUA_KEY_VALUE_P12:
{
break;
}
//P13
case GUA_KEY_VALUE_P13:
{
break;
}
//P14
case GUA_KEY_VALUE_P14:
{
break;
}
//其它
default:break;
}
//清除键值
GUA_Key_Set_Value(GUA_KEY_VALUE_NULL);
}
//******************************************************************************
//name: GUA_Key_Long_Process
//introduce: 长按键处理函数
//parameter: none
//return: none
//author: 甜甜的大香瓜
//email: 897503845@qq.com
//QQ group 香瓜BLE之CC2541(127442605)
//changetime: 2017.01.03
//******************************************************************************
static void GUA_Key_Long_Process(void)
{
//判断之前按下的按键是否消抖后还在
switch(GUA_Key_Get_Value())
{
//P01
case GUA_KEY_VALUE_P01:
{
break;
}
//P11
case GUA_KEY_VALUE_P11:
{
break;
}
//P12
case GUA_KEY_VALUE_P12:
{
break;
}
//P13
case GUA_KEY_VALUE_P13:
{
break;
}
//P14
case GUA_KEY_VALUE_P14:
{
break;
}
//其它
default:break;
}
//清除键值
GUA_Key_Set_Value(GUA_KEY_VALUE_NULL);
}
2)声明长、短按键处理函数
static void GUA_Key_Short_Process(void);
static void GUA_Key_Long_Process(void);
4、在应用层中使用按键
1)初始化(SimpleBLEPeripheral.c的SimpleBLEPeripheral_Init中)
GUA_Key_Init();
GUA_RegisterForKey(simpleBLEPeripheral_TaskID, SBP_GUA_KEY_DEBOUNCE_EVT);
2)添加驱动头文件(SimpleBLEPeripheral.c中)
#include "GUA_Key.h"
5、屏蔽协议栈按键(IAR设置中)
HAL_KEY=FALSE
加入上述的宏。
七、注意事项
暂无
八、实验结果
分别设置断点在短按键处理函数、长按键处理函数中,rebuild all,仿真并全速运行。
拿一根跳线,一端接在GND,另一端短触或长触P01、P11、P12、P13、P14,则会发现进到对应处理函数中,并能判别出是哪个键值。
其中长按为超过3S则自动被认为是长按并执行,少于3S的则被认为是短按并执行。
因此,实验成功。