硬件设置:
KEY012 -》 PE432 WAKE-UP ->PA0
软件配置:
初始化端口、时钟
按键检测处理
按键控制处理
代码:初始化以及按键检测
#include "key.h"
#include "SysTick.h"
void key_Init()
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOA,ENABLE); //使能端口A,E
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;//wake—up
GPIO_InitStructure.GPIO_Pin=wake_up_PIN;
GPIO_Init(KEY_UP_PORT,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin=KEY0_PIN|KEY1_PIN|KEY2_PIN;//或运算同时初始化(要在同意端口GPIOA下)
GPIO_Init(KEY_PORT,&GPIO_InitStructure);
}
u8 key_scan(u8 mode)
{
static u8 key=1;//mode==0,单次按键;反之,连续按键
if(mode)key=1;
if(key==1&&WAKE_UP_PRESS==1|KEY0==0|KEY1==0|KEY2==0)//模式为0,进入判断
{ //key变为0,如果此时一直按键不松手则key为0,没变化,无法连续按键
key=0; //松开,进入到key==0的判断,此时key变回1,在按下可以继续按键
delay_ms(10);
if(KEY0==1) // 模式为1,进入判断
return KEY0_PRESS; //key在判断里面变0后出来,if(mode)key=1;又变回1,此时可以连续按键
else if(KEY1==1)
return KEY1_PRESS;
else if(KEY2==0)
return KEY2_PRESS;
}
else if(key==0&&WAKE_UP_PRESS==0&&KEY0==1&&KEY1==1&&KEY2==0)
{
key=1;
}
return 0;
}
main函数:先进行初始化,在循环里检测按键状态,然后通过switch检测按键
#include "led.h"
#include "system.h"
#include "SysTick.h"
#include "key.h"
#include "beep.h"
int main()
{
u8 i=0;
key_Init();
u8 key=0;
while(1)
{
key=key_scan(0);
switch(key)
{
case WAKE_UP_PRESS:LED1=0;break;
case KEY0_PRESS:BEEP=0;break;
case KEY1_PRESS:LED1=1;break;
case KEY2_PRESS:BEEP=1;break;
}
i++;
if(i%20==0){
LED1=!LED1;
delay_ms(10);
}
}
}