【BLE】CC2541之多个自定义长短按键

本篇博文最后修改时间: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

香瓜BLE之Android群:541462902

香瓜单片机之STM8/STM32群:164311667
甜甜的大香瓜的小店(淘宝店):https://shop217632629.taobao.com/?spm=2013.1.1000126.d21.hd2o8i


四、 实验前提
1、在进行本文步骤前,请先 阅读 以下博文:

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


2、在进行本文步骤前,请先 实现以下博文:
暂无


五、基础知识

暂无


六、实验步骤

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的则被认为是短按并执行。

因此,实验成功。





  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值