1.硬件图
对应的按键分别为PA0,PE4,PE3,PE2。其中KEY_UP按下时,PA0为高电平,因此应设置下拉输入。K1~K3按下时,PE4~PE2为低电平,因此应设置上拉输入。
2.按键扫描:首先,按键输入这一从高电平变为低电平的动作才能任为按键按下,并不只是检测到有按键输入就是按键按下。其次,这里需要考虑按键一直处于按下状态时的情况。最后,需要对按键按下进行防抖确认。
3.针对按键扫描的不同结果(如是否有按键按下,如有按键按下,是哪个按键)输出不同动作。
#include
#include
#include
//#define Key_Status 0;
void Key_Init(void){
GPIO_InitTypeDef GPIO_Struct1;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);
GPIO_Struct1.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_3|GPIO_Pin_2;
GPIO_Struct1.GPIO_Mode=GPIO_Mode_IN;
GPIO_Struct1.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Struct1.GPIO_PuPd=GPIO_PuPd_UP;
GPIO_Init(GPIOE,&GPIO_Struct1);
//key1~key3
GPIO_InitTypeDef GPIO_Struct2;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
GPIO_Struct2.GPIO_Pin=GPIO_Pin_0;
GPIO_Struct2.GPIO_Mode=GPIO_Mode_IN;
GPIO_Struct2.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Struct2.GPIO_PuPd=GPIO_PuPd_DOWN;
GPIO_Init(GPIOA,&GPIO_Struct2);
//keyup
}
int Key_Scan(void){
static int Key_Up=1;
u32 Key_Result=0;//mode for action;
u32 k1,k2,k3,k4;
k1=GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4);
k2=GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3);
k3=GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2);
k4=GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0);
if((Key_Up)&&((k1==0)||(k2==0)||(k3==0)||(k4==1))){ //there is a key down
Delay_ms(20);//wait for sure
if((Key_Up)&&((k1==0)||(k2==0)||(k3==0)||(k4==1))){ //make sure there's a key down
Key_Up=0;
if(k1==0){
Key_Result=1;
}
//key1 down
else if(k2==0){
Key_Result=2;
}
//key2 down
else if(k3==0){
Key_Result=3;
}
//key3 down
else if(k4==1){
Key_Result=4;
}
//key4 down
}
else Key_Up=1;
}
return Key_Result;
}
#include
#include
#include
#include
#include
int main(void){
u8 key;
Delay_ms(1000);
Key_Init();
while(1){
key=Key_Scan();
if (key!=0){
switch (key)
{
case 1:
Led_Start();
case 2:
Beep_Start();
break;
}
}
else Delay_ms(1000);
}
}
关键字:STM32F407ZG 按键输入『本文转载自网络,版权归原作者所有,如有侵权请联系删除』