代码如下
/*********************按键1~14***********************/
#define KEY1 ~GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)
#define KEY2 ~GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10)<<1
#define KEY3 ~GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_2)<<2
#define KEY4 ~GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)<<3
#define KEY5 ~GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0)<<4
#define KEY6 ~GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_8)<<5
#define KEY7 ~GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_9)<<6
#define KEY8 ~GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_10)<<7
#define KEY9 ~GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11)<<8
#define KEY10 ~GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_12)<<9
#define KEY11 ~GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_15)<<10
#define KEY12 ~GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_3)<<11
#define KEY13 ~GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_8)<<12
#define KEY14 ~GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)<<13
#define OneKeyTime 300 //单键长按连续功能时长
#define MuxKeyTime 500 //组合键或长按功能时长
#define RepeatTime 5 //单键连续重复间隔
#define key_state_0 0 //初始态
#define key_state_1 1 //确认态
#define key_state_2 2 //组合键,长按确认态
#define key_state_3 3 //长按连发
#define key_state_4 4 //等待释放
#define Key_Mask (KEY1|KEY2|KEY3|KEY4|KEY5|KEY6|KEY7|KEY8|KEY9|KEY10|KEY11|KEY12|KEY13|KEY14)
typedef enum {
NO_KEY,
KEY_UP,
KEY_DOWN,
MODE,
UNIT,
KEY_START,
KEY_STOP,
MARK1,
MARK2,
MARK3,
MARK4,
MARK5,
MARK6,
MARK7,
MARK8,
memory1,
memory2,
memory3,
memory4,
memory5,
memory6,
memory7,
memory8,
} eKEY;
//按键初始化
void KEY_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
//按键处理
//返回值,枚举类型,键值
eKEY KEY_Scan(void)
{
static u16 key_time = 0;
static u8 key_state = 0;
static u16 key_press_old = 0;
static eKEY key_value_old = NO_KEY;
eKEY key_return = NO_KEY;
u16 key_press;
key_press = Key_Mask;
switch (key_state)
{
case key_state_0: //初始态
if (key_press)
{
key_state = key_state_1;
key_press_old = key_press;
}
break;
case key_state_1: //按键确认态
if (key_press == key_press_old)
{
key_time = 0;
switch(key_press)
{
case 1:
key_state = key_state_2;
key_return = KEY_UP;
break;
case 1<<1:
key_state = key_state_2;
key_return = KEY_DOWN;
break;
case 1<<2:
key_state = key_state_4;
key_return = MODE;
break;
case 1<<3:
key_state = key_state_4;
key_return = UNIT;
break;
case 1<<4:
key_state = key_state_4;
key_return = KEY_START;
break;
case 1<<5:
key_state = key_state_4;
key_return = KEY_STOP;
break;
case 1<<6:
key_state = key_state_2;
break;
case 1<<7:
key_state = key_state_2;
break;
case 1<<8:
key_state = key_state_2;
break;
case 1<<9:
key_state = key_state_2;
break;
case 1<<10:
key_state = key_state_2;
break;
case 1<<11:
key_state = key_state_2;
break;
case 1<<12:
key_state = key_state_2;
break;
case 1<<13:
key_state = key_state_2;
break;
default:
key_state = key_state_4;
break;
}
}
else if (!key_press)
key_state = key_state_0;
else
key_state = key_state_4;
key_value_old = key_return;
break;
case key_state_2:
if (key_press == key_press_old)
{
++key_time;
if (key_press >= 1<<6) //记忆按键长短按不同键值
{
if(key_time >= MuxKeyTime)
{
key_state = key_state_4;
switch (key_press)
{
case 1<<6:key_return = memory1;break;
case 1<<7:key_return = memory2;break;
case 1<<8:key_return = memory3;break;
case 1<<9:key_return = memory4;break;
case 1<<10:key_return = memory5;break;
case 1<<11:key_return = memory6;break;
case 1<<12:key_return = memory7;break;
case 1<<13:key_return = memory8;break;
default :break;
}
}
else
{
key_state = key_state_4;
switch (key_press)
{
case 1<<6:key_return = MARK1;break;
case 1<<7:key_return = MARK2;break;
case 1<<8:key_return = MARK3;break;
case 1<<9:key_return = MARK4;break;
case 1<<10:key_return = MARK5;break;
case 1<<11:key_return = MARK6;break;
case 1<<12:key_return = MARK7;break;
case 1<<13:key_return = MARK8;break;
default :break;
}
}
}
else
{
if(key_time >= OneKeyTime) //+-单按键长按
{
key_state = key_state_3; //长按返回相同键值,连按
key_time = 0;
key_return = key_value_old;
}
}
}
else
key_state = key_state_4;
break;
case key_state_3: //单键连按 +-
if (key_press == key_press_old)
{
if (++key_time >= RepeatTime)
{
key_time = 0;
key_return = key_value_old;
}
}
else
key_state = key_state_4;
break;
case key_state_4:
//if (!key_press)
if (key_press != key_press_old)
key_state = key_state_0;
break;
}
return key_return;
}
就是没效果,求指点
|