金牌会员
- 积分
- 1236
- 金钱
- 1236
- 注册时间
- 2015-5-14
- 在线时间
- 352 小时
|
一个按键,分为长按和短按的中间层。
#ifndef __KEY_H__
#define __KEY_H__
#include "../heard/include.h"
struct key_struct
{
_UBYTE IO_ValueReadLase;
_UBYTE IO_ValueReadNow;
_UBYTE IO_ValueCnt;
_UBYTE IO_ValueNow;
_UBYTE IO_ValueLast;
_UBYTE IO_Value;
_UBYTE IO_ValueActionLast;
_UBYTE IO_ValueActionNow;
};
/***************************按键驱动相关********************************/
#define KEY_COLUMN2_Direction TRISCbits.TRISC1
#define KEY_COLUMN2 PORTCbits.RC1
#define KEY_ROW2_Direction TRISBbits.TRISB0
#define KEY_ROW2 PORTBbits.RB0
#define KEY_IO_Init() do{ \
KEY_COLUMN2_Direction=OUTPUT_PIN; \
KEY_COLUMN2=0; \
TRISBbits.TRISB0=INPUT_PIN; \
}while(0)
#define KEY_IO_Value() (KEY_ROW2) //返回按键IO口值
/***************************配置相关***********************************/
#define KEY_READ_TIMERS 10 //消抖次数
#define KET_LongTimers 200 //长按时间=N*心跳时间
#define KEY_NormalValue 0x01 //按键常态值
/***************************相关函数************************************/
void KEY_Init(void); //初始化函数
void KEY_ReadValue(void); //放到心跳定时器中
//按键状态
#define KEY_InvalidState 0
#define KEY_ShortState 1
#define KEY_LongState 2
_UBYTE KEY_ReturnState(void); //用户调用,返回按键状态
//清除按键状态,当用户调用KEY_ReturnState(),
//执行完相应动作后,需要调用此函数清除按键状态,
//否则,如果硬件驱动按键状态没有改变,则会重复执行。
void KEY_ClearFlag(void);
#endif
#include "../heard/key.h"
static struct key_struct key_value;
static _UWORD KET_LongTimersCnt;
void KEY_Init(void)
{
KEY_IO_Init();
KET_LongTimersCnt=0;
key_value.IO_ValueReadLase =KEY_NormalValue;
key_value.IO_ValueReadNow =KEY_NormalValue;
key_value.IO_ValueCnt =0;
key_value.IO_ValueNow =KEY_NormalValue;
key_value.IO_ValueLast =KEY_NormalValue;
key_value.IO_Value =KEY_InvalidState;
key_value.IO_ValueActionLast=KEY_InvalidState;
key_value.IO_ValueActionNow =KEY_InvalidState;
}
void KEY_ReadValue(void)
{
key_value.IO_ValueReadNow=KEY_IO_Value();
if(key_value.IO_ValueReadNow != key_value.IO_ValueReadLase)
{
key_value.IO_ValueReadLase=key_value.IO_ValueReadNow;
key_value.IO_ValueCnt=0;
return;
}
key_value.IO_ValueCnt++;
if(key_value.IO_ValueCnt>=KEY_READ_TIMERS)
{
key_value.IO_ValueCnt=0;
key_value.IO_ValueNow=key_value.IO_ValueReadNow;
}
if(key_value.IO_ValueNow != KEY_NormalValue)
{
if(KET_LongTimersCnt<KET_LongTimers) KET_LongTimersCnt++;
}
else
{
KET_LongTimersCnt=0;
}
if(KET_LongTimersCnt>=KET_LongTimers)
{
key_value.IO_Value=KEY_LongState;
if(key_value.IO_Value != key_value.IO_ValueActionLast)//防止按键一直按着,重复判定按键状态
{
key_value.IO_ValueActionLast=key_value.IO_Value;
key_value.IO_ValueActionNow=key_value.IO_Value;
}
}
else
{
if((key_value.IO_ValueLast!=KEY_NormalValue) && (key_value.IO_ValueNow==KEY_NormalValue))
{
if(key_value.IO_Value!=KEY_LongState)//防止按键松开,误认为短按
{
key_value.IO_Value=KEY_ShortState;
if(key_value.IO_Value != key_value.IO_ValueActionLast)//防止按键一直按着,重复判定按键状态
{
key_value.IO_ValueActionLast=key_value.IO_Value;
key_value.IO_ValueActionNow=key_value.IO_Value;
}
}
}
else
{
if((key_value.IO_ValueLast==KEY_NormalValue) && (key_value.IO_ValueNow==KEY_NormalValue))
{
key_value.IO_Value=KEY_InvalidState;
if(key_value.IO_Value != key_value.IO_ValueActionLast)//防止按键一直按着,重复判定按键状态
{
key_value.IO_ValueActionLast=key_value.IO_Value;
if(!key_value.IO_ValueActionNow)//防止按键函数来不及动作,状态被清除
key_value.IO_ValueActionNow=key_value.IO_Value;
}
}
}
}
key_value.IO_ValueLast = key_value.IO_ValueNow;
}
_UBYTE KEY_ReturnState(void)
{
return key_value.IO_ValueActionNow;
}
void KEY_ClearFlag(void)
{
key_value.IO_ValueActionNow = KEY_InvalidState;
}
|
|