stm32学习日志211228(二)——按键控制LED灯

本文使用“野火霸天虎_V2”作为硬件开发环境。开发环境为“STM32CubeIde”。

首先仍是通过stm32cubemx进行引脚初始化配置,根据野火官方提供的原理图可知除复位按键的另外两个按键的连接引脚为PA0和PC13,红灯和绿灯效果为PF6,PF7。

1.开始配置,按键检测脚设置为输出,LED与上一节设置相同。

 

 

 

 2.创建源文件夹和相关的源文件

3.KEY.h与.c文件代码如下 

/*
 * KEY.h
 *
 *  Created on: 2021年12月29日
 *      Author: 13450
 */

#ifndef __KEY_H
#define __KEY_H
#include "main.h"
typedef enum{
	KEY_NONE=0,
	KEY1,
	KEY2
}KEYS;

#define KEY_WAIT_ALWAYS  0//作为函数ScanKeys的一个参数,表示一直等待按键的输入
//轮询的方式扫描按键,timeout=KEY_WAIT_ALWAYS时一直扫描,否则等待时间timeout,单位ms
KEYS ScanpressedKey(uint32_t timeout);
#ifdef   LED_R_Pin//红灯控制
#define  LED_R_Toggle() HAL_GPIO_TogglePin(LED_R_GPIO_Port,LED_R_Pin)
#define  LED_R_ON()     HAL_GPIO_WritePin(LED_R_GPIO_Port,LED_R_Pin,GPIO_PIN_RESET)
#define  LED_R_OFF()    HAL_GPIO_WritePin(LED_R_GPIO_Port,LED_R_Pin,GPIO_PIN_SET)
#endif

#ifdef   LED_G_Pin//绿灯控制
#define  LED_G_Toggle() HAL_GPIO_TogglePin(LED_G_GPIO_Port,LED_G_Pin)
#define  LED_G_ON()     HAL_GPIO_WritePin(LED_G_GPIO_Port,LED_G_Pin,GPIO_PIN_RESET)
#define  LED_G_OFF()    HAL_GPIO_WritePin(LED_G_GPIO_Port,LED_G_Pin,GPIO_PIN_SET)
#endif
#endif/*__KEY_H*/
/*
 * KEY.c
 *
 *  Created on: 2021年12月29日
 *      Author: 13450
 */

#include "KEY.h"
//轮询扫描2个按键,返回按键值
//timeout的单位为ms,若timeout=0表示一直扫描,直到有按键按下
KEYS ScanPresssedKey(uint32_t timeout)
{
	KEYS key=KEY_NONE;
	uint32_t tickstart = HAL_GetTick();//当前计数值
	const uint32_t btnDelay=20; //按键按下阶段的抖动,延时在采样时间(在霸天虎开发板中已做硬件消抖,所以软件即使不做消抖处理也可以)
	GPIO_PinState keyState;


while(1)
{
#ifdef KEY_1_Pin //如果定义了宏kEY_1,就可以检测KEY_1键输入,低输入有效
	   keyState=HAL_GPIO_ReadPin(KEY_1_GPIO_Port,KEY_1_Pin);
	   if (keyState==GPIO_PIN_RESET)
	   {
		   HAL_Delay(btnDelay);//延期跳过前期抖动
		   keyState=HAL_GPIO_ReadPin(KEY_1_GPIO_Port,KEY_1_Pin);//采样
		   if(keyState ==GPIO_PIN_SET)
			return    KEY1;
	   }
#endif

#ifdef KEY_2_Pin //如果定义了宏kEY_2,就可以检测KEY_2键输入,低输入有效
	   keyState=HAL_GPIO_ReadPin(KEY_2_GPIO_Port,KEY_2_Pin);
	   if (keyState==GPIO_PIN_RESET)
	   {
		   HAL_Delay(btnDelay);//延期跳过前期抖动
		   keyState=HAL_GPIO_ReadPin(KEY_2_GPIO_Port,KEY_2_Pin);//采样
		   if(keyState ==GPIO_PIN_SET)
			return    KEY2;
	   }
#endif
		   if(timeout !=KEY_WAIT_ALWAYS)//没有按键按下是会计算超时,timeout时退出
		   {
			  if((HAL_GetTick()-tickstart)>timeout)
				  break;
		   }
}
	   return key;
}

然后在住程序中调用函数,通过选择分支来确定亮灯颜色

 /* USER CODE BEGIN WHILE */
  while (1)
  {
	KEYS curKey= ScanPresssedKey(KEY_WAIT_ALWAYS);//�?测按键输�?
	switch(curKey)
	{
	case KEY1:
		LED_R_Toggle();
		break;
	case KEY2:
		LED_G_Toggle();
		break;
	}
     HAL_Delay(200);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

4.烧录验证即可(如果两个灯都开启的话会展现出亮黄色,所以在同一时间只能有一个LED引脚输出电平为低,另一个电平相反)

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值