Key.h 4.82 KB
Newer Older
崔立宝's avatar
崔立宝 committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
/******************************************************************************
文 件 名:Key.h
功能描述:按键检测函数库头文件
作    者:张暄
版    本:V1.0
日    期:2016.11.21
******************************************************************************/

#ifndef _KEY_H_
#define _KEY_H_

#include "Line_In.h"
/******************************************************************************
按键列表
******************************************************************************/

/*** 按键属性结构 ***/
typedef struct
{
  volatile  uint8_t   *pInputSignal;    //输入信号
  uint8_t   HoldDetMode;      //长按检测模式
  uint8_t   DoubleDetEn;      //连按(双击)检测使能
} KeyAttrStruct;

/*** 长按检测模式 ***/
#define   KEY_HOLD_DISABLE                  0x00      //不支持长按检测
#define   KEY_HOLD_ONLY                     0x01      //仅支持按住检测
#define   KEY_STUCK_ONLY                    0x02      //仅支持卡住检测
#define   KEY_HOLD_STUCK                    0x03      //支持按住/卡住检测
#define   KEY_HOLD_LONG                     0x04      //支持按住/长按检测
#define   KEY_HOLD_LONG_STUCK               0x05      //支持按住/长按/卡住检测

/*** 按键ID列表 ***/
#define   KEY_LEFT          0x00
#define   KEY_RIGHT         0x01
#define   KEY_ENTER         0x02

/*** 按键属性列表 ***/
static const KeyAttrStruct KeyAttrTable[] =
{
  /*=====================================================================
  注意:1.应定义按键ID为该按键的属性位于本属性列表中的序号
        2.如果只启用一种长按状态检测,应使能HoldDetEn而不是LongDetEn
  -----------------------------------------------------------------------
      ID  |       输入信号       |    长按检测模式    | 连按检测使能
  ---------------------------------------------------------------------*/
  {/* 00 */  &KEY_LEFT_SIGNAL,       KEY_HOLD_LONG,             0, },
  {/* 01 */  &KEY_RIGHT_SIGNAL,       KEY_HOLD_LONG,             0, },
  {/* 02 */  &KEY_ENTER_SIGNAL,       KEY_HOLD_LONG,             0, },
  {/* 03 */  NULL,       KEY_HOLD_ONLY,             0, },
  /*===================================================================*/
};

/******************************************************************************
按键检测配置
******************************************************************************/
#define   KEY_DOUBLE_INTERVAL               500       //连按(双击)最长间隔
#define   KEY_HOLD_THRESHOLD                800       //按住判定时间阈值
#define   KEY_LONG_THRESHOLD                2000      //长按判定时间阈值
#define   KEY_STUCK_THRESHOLD               15000     //按键卡住判定时间阈值
#define   KEY_TOTAL_NUMBER                  (sizeof(KeyAttrTable) / sizeof(KeyAttrStruct))

/******************************************************************************
按键状态枚举
******************************************************************************/
typedef enum
{
  KEY_IDLE = 0,   //空闲,按键未按下
  KEY_PRESS,      //按键短按
  KEY_HOLD,       //按键按住(比KEY_LONG时间短)
  KEY_LONG,       //按键长按
  KEY_STUCK,      //按键卡住
  KEY_DOUBLE,     //按键连续按下两次(双击)
} KeyStatusEnum;

/******************************************************************************
按键状态检测结构
******************************************************************************/
typedef struct
{
  uint8_t         UpdateEnable;
  uint16_t        Timer;
  uint16_t        IdleTimer;
  KeyStatusEnum   FinalStatus;
  KeyStatusEnum   CurrentStatus;
} KeyDetectStruct;

/******************************************************************************
旋转按键结构体
******************************************************************************/
typedef struct
{
    INT8U     Rotary1Old;
    INT8U     RotateState;
     INT8U    Rotary1Old1;
     INT8U     Rotary2Old;
    INT8U    RotateValid ; 

} RotateKeyAttrStruct ;

#define               clockwise                1
#define               widdershins              0
#define               OldDir                   2
#define               keep_local               255

extern RotateKeyAttrStruct KeyMenu ;

/******************************************************************************
旋扭按键状态检测结构
******************************************************************************/
/*typedef union
{
  uint8_t Byte;
  struct
  {

    uint8_t KEY_LINE_L  : 1;
    uint8_t KEY_LINE_R  : 1;
    uint8_t KEY_NEWKEY  : 2;
    uint8_t KEY_MIDKEY  : 2;
    uint8_t KEY_OLDKEY  : 2;
    uint8_t KEY_LINE_D;
  } KnobSwitch;
} KEY_Union;
*/
/******************************************************************************
函数声明
******************************************************************************/
void Key_Status_Init(void);
void Key_Status_Detect_Service(void);
void Reset_Key_Status(uint8_t Key);
//void Key_Knob(void);
KeyStatusEnum Key_Get_Status(uint8_t Key);
KeyStatusEnum Key_Get_Current_Status(uint8_t Key);

void RotaryKey_Status_Detect_Service(RotateKeyAttrStruct *KeyMenu) ; 

#endif