4.STM32F407ZG按键输入

1.硬件图

对应的按键分别为PA0,PE4,PE3,PE2。其中KEY_UP按下时,PA0为高电平,因此应设置下拉输入。K1~K3按下时,PE4~PE2为低电平,因此应设置上拉输入。

2.按键扫描:首先,按键输入这一从高电平变为低电平的动作才能任为按键按下,并不只是检测到有按键输入就是按键按下。其次,这里需要考虑按键一直处于按下状态时的情况。最后,需要对按键按下进行防抖确认。

3.针对按键扫描的不同结果(如是否有按键按下,如有按键按下,是哪个按键)输出不同动作。

#include <key.h>
#include <delay.h>
#include <stm32f4xx.h>
//#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 <stm32f4xx.h>
#include <delay.h> 
#include <key.h>
#include <led.h>
#include <beep.h>

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);
	}
}

 

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
按键检测一般可以通过轮询或者中断两种方式实现。 ## 轮询方式 在轮询方式中,我们需要不断地读取按键状态,然后判断是否有按键按下,并执行相应的操作。以下是一个简单的示例代码: ```c #include "stm32f4xx.h" int main(void) { // 初始化GPIO为输入模式 GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLDOWN; GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); while (1) { // 读取按键状态 if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_SET) { // 按键按下,执行相应操作 } } } ``` ## 中断方式 在中断方式中,我们可以通过配置GPIO的中断来实现按键检测。当按键按下时,触发GPIO的中断,然后在中断服务函数中执行相应的操作。以下是一个简单的示例代码: ```c #include "stm32f4xx.h" void EXTI0_IRQHandler(void) { if (__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_0) != RESET) { // 清除中断标志位 __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_0); // 按键按下,执行相应操作 } } int main(void) { // 初始化GPIO为输入模式 GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING; GPIO_InitStruct.Pull = GPIO_PULLDOWN; GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // 配置中断优先级 HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0); HAL_NVIC_EnableIRQ(EXTI0_IRQn); while (1) { // 循环执行其他任务 } } ``` 需要注意的是,中断方式需要在初始化GPIO之后配置中断优先级和使能中断。另外,中断服务函数中需要清除中断标志位,以便下一次中断的触发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值