按键初始化:
void KEY_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE, ENABLE); //使能PORTA,PORTE 时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
GPIO_Init(GPIOE, &GPIO_InitStructure); //初始化GPIOE.2,3,4
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //设置成下拉输入
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIOA.0
}
注:以上函数初始化GPIOE.2,3,4作为上拉输入,GPIOA.0作为下拉输入。上或下拉根据硬件电路来选择,若硬件电路触发输出高电平,对应IO配置为下拉输入,反之亦然。
长或短按配置:
u8 KEY_Scan(u8 mode)
{
static u8 key_up = 1;
if(mode)key_up = 1;
if(key_up && (KEY0==0||KEY1==0||KEY2==0||KEY3==1))
{
delay_ms(20); //按键消抖
key_up = 0;
if(KEY0==0) return 1;
else if(KEY1==0) return 2;
else if(KEY2==0) return 3;
else if(KEY3==1) return 4;
delay_ms(500); //按键延时
}
else if(KEY0==1 && KEY1==1 && KEY2==1 && KEY3==0)
key_up = 1;
return 0;
}
注:上述程序中,形参mode为模式选择。mode=0,若触发其中之一按键,key_up=0,此时返回对应键值,而后结束程序。为短按;mode=1,若触发其中按键之一,key_up=1,返回对应按键值,延时500毫秒,满足循环条件继续返回对应键值。为长按。