4.STM32F407ZG按键输入

1.硬件图

4.STM32F407ZG按键输入_第1张图片4.STM32F407ZG按键输入_第2张图片

对应的按键分别为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);
	}
}

 

你可能感兴趣的:(STM32F7之HAL库学习)