蓝桥杯嵌入式(STM32G431RBT6)入门第三天——使用按键(KEY)|CSDN创作打卡

接前一天,创建一个KEY练习的文件夹,并在文件夹里面创建KEY和KEY_test两个文件夹。

蓝桥杯嵌入式(STM32G431RBT6)入门第三天——使用按键(KEY)|CSDN创作打卡_第1张图片

蓝桥杯嵌入式(STM32G431RBT6)入门第三天——使用按键(KEY)|CSDN创作打卡_第2张图片

 将前一天写完的LED的所有文件拷贝到KEY文件夹里面,并在KEY文件夹的Inc和Src文件夹中分别建立key.h和key.c两个文件。

蓝桥杯嵌入式(STM32G431RBT6)入门第三天——使用按键(KEY)|CSDN创作打卡_第3张图片蓝桥杯嵌入式(STM32G431RBT6)入门第三天——使用按键(KEY)|CSDN创作打卡_第4张图片

 蓝桥杯嵌入式(STM32G431RBT6)入门第三天——使用按键(KEY)|CSDN创作打卡_第5张图片蓝桥杯嵌入式(STM32G431RBT6)入门第三天——使用按键(KEY)|CSDN创作打卡_第6张图片

 下面打开官方提供的CT117E-M4产品手册找到7.7的按键,看原理图可知四个按键处于浮空状态,并且在按键未按下时IO口通过一个10k的电阻与VDD相连,所以按键未按下默认为高电平,当按键按下时接入到GND此时IO口电平为低电平。所以需要设置IO口为浮空输入模式,并且默认为上拉模式。

蓝桥杯嵌入式(STM32G431RBT6)入门第三天——使用按键(KEY)|CSDN创作打卡_第7张图片

 下面打开STM32CubeMX进行按键IO口的初始化(此处已跳过芯片选型步骤),由于是已经使用了前面的工程,所以不需要配置时钟只需要配置GPIO,依次选择PB0、PB1、PB2、PA0将其设置为GPIO Input,并在中间区域将其修改为Pull-up(即上拉输入)。

蓝桥杯嵌入式(STM32G431RBT6)入门第三天——使用按键(KEY)|CSDN创作打卡_第8张图片

 下面进行工程的设置,和之前的一样。

蓝桥杯嵌入式(STM32G431RBT6)入门第三天——使用按键(KEY)|CSDN创作打卡_第9张图片

蓝桥杯嵌入式(STM32G431RBT6)入门第三天——使用按键(KEY)|CSDN创作打卡_第10张图片

 打开KEY文件夹中的工程,同时打开KEY_test中的工程,将生成的KEY_test工程中下面这一段复制进KEY工程的key.c中。

蓝桥杯嵌入式(STM32G431RBT6)入门第三天——使用按键(KEY)|CSDN创作打卡_第11张图片

 并做相应的修改,修改完成后的key.c代码如下,共有两个函数,第一个为刚刚复制的按键初始化函数,第二个函数为按键扫描函数,其中的B1-B4在key.h中采用宏定义的方式与HAL_GPIO_ReadPin()函数相通,用来获取按键对应的GPIO口的电平状态。延时的10ms用来消抖,此按键逻辑仅支持短按并且是按下有效,想了解别的控制方式可以去查看其他的文章亦可等待后续的更新。

#include "key.h"

void KEY_Init(void)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOF_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();

  /*Configure GPIO pin : PA0 */
  GPIO_InitStruct.Pin = GPIO_PIN_0;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /*Configure GPIO pins : PB0 PB1 PB2 */
  GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

}

unsigned char key_scan(void)
{
	static unsigned char key_up = 1;
	if(key_up == 1 &&(B1 == GPIO_PIN_RESET || B2 == GPIO_PIN_RESET || B3 == GPIO_PIN_RESET || B4 == GPIO_PIN_RESET))
	{
		HAL_Delay(10);
		key_up = 0;
		if(B1==GPIO_PIN_RESET) return 1;
		else if(B2==GPIO_PIN_RESET) return 2;
		else if(B3==GPIO_PIN_RESET) return 3;
		else if(B4==GPIO_PIN_RESET) return 4;
	}
	else if(B1 == GPIO_PIN_SET && B2 == GPIO_PIN_SET && B3 == GPIO_PIN_SET && B4 == GPIO_PIN_SET) key_up = 1;
  return 0;
}




 key.h中代码如下

#include "main.h"


#define B1    HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0)//读取按键B1
#define B2    HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1)//读取按键B2
#define B3    HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2)//读取按键B3
#define B4    HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0)//读取按键B4


void KEY_Init(void);
unsigned char key_scan();



 最后将main中代码进行如下修改,下载程序进开发板即可进行按键的实验,此测试仅使用了B1和B2两个按键。

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  LED_Init();
	KEY_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
		
    /* USER CODE BEGIN 3 */
		unsigned char key_read;
		key_read = key_scan();
		if(key_read == 1)
		{
			led_display(0x88);
		}
		if(key_read == 2)
		{
			led_display(0x44);
		}
		//led_display(0x00);
  }
  /* USER CODE END 3 */
}

你可能感兴趣的:(蓝桥杯嵌入式,蓝桥杯,stm32,单片机,arm,嵌入式硬件)