You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

85 lines
3.1 KiB

/*
*
* 10ms < T < 1 s, T >1 s
* 使10ms,10ms刚好跳过抖动
* 使switch case语句实现状态之间的跳转
* lock变量用于判断是否是第一次进行按键确认状态
*
*/
#include "bsp_btn.h"
#include "bsp_config.h"
#include "bsp_config.h"
#include "../msp/UART0.h"
extern KEY_STATE KeyState = KEY_CHECK; // 初始化按键状态为检测状态
KEY_TYPE g_KeyActionFlag = NULL_KEY; // 用于区别长按和短按
KEY_VALUE g_Key = KEY_NULL;
u8 g_KeyFlag = 0; // 按键有效标志,0 无效 1 有效
static u8 TimeCnt = 0; //10ms为颗粒
static u8 lock = 0; //lock变量用于判断是否是第一次进行按键确认状态
void Key_Scan(void)
{
static u8 TimeCnt = 0; //10ms为颗粒
static u8 lock = 0;
switch (KeyState)
{
//按键未按下状态,此时判断Key的值
case KEY_CHECK:
if(!Key) //如果按键Key值为0,说明按键开始按下,进入下一个状态
{
KeyState = KEY_COMFIRM;
}
TimeCnt = 0; //计数复位
lock = 0;
break;
//按键按下状态确认:
case KEY_COMFIRM:
if(!Key) //查看当前Key是否还是0,再次确认是否按下
{
if(!lock) lock = 1; //第一次进来置1
TimeCnt ++;
// 多按键判断
if(0 == key1) g_Key = KEY_UP;
else if(0 == key2) g_Key = KEY_DOWN;
else if(0 == key3) g_Key = KEY_PWR;
if(TimeCnt > 200) // 长按 2 s
{
L0_uart0_uc('#');
g_KeyActionFlag = LONG_KEY;
TimeCnt = 0;
lock = 0; //重新检查
KeyState = KEY_RELEASE; // 需要进入按键释放状态
}
// ???????????????????????
}
else
{
if(lock) //不是第一次进入,释放按键才执行
{
g_KeyActionFlag = SHORT_KEY; // 短按
KeyState = KEY_RELEASE; // 需要进入按键释放状态
}
else // 当前Key值为1,确认为抖动,则返回上一个状态
{
KeyState = KEY_CHECK; // 返回上一个状态
}
}
break;
//按键释放状态
case KEY_RELEASE:
if(Key) //当前Key值为1,说明按键已经释放,返回开始状态
{
KeyState = KEY_CHECK;
}
break;
default:
break;
}
}