前言
本篇文章将继续带大家学习模块化编程,今天主要给大家讲解按键的模块化。
一、按键的原理图
我们可以看到按键分别接到了板子的PE3和PE4引脚。
按键的具体原理这里我就不多讲了,大家可以看我之前的文章。
二、按键的GPIO配置
driver_key.c文件
#include "driver_key.h" #include "main.h" void key_init(void) { // 定义GPIO的结构体变量 GPIO_InitTypeDef GPIO_InitStruct = {0}; // 使能按键的GPIO对应的时钟 KEY1_GPIO_CLK_EN(); KEY2_GPIO_CLK_EN(); GPIO_InitStruct.Pin = KEY0_UP_GPIO_PIN; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; // 设置为输入模式 GPIO_InitStruct.Pull = GPIO_PULLUP; // 默认上拉 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; // 引脚反转速度设置为快 // 初始化引脚配置 HAL_GPIO_Init(Key1_GPIO_Port, &GPIO_InitStruct); GPIO_InitStruct.Pin = KEY1_UP_GPIO_PIN; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; // 设置为输入模式 GPIO_InitStruct.Pull = GPIO_PULLUP; // 默认上拉 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; // 引脚反转速度设置为快 // 初始化引脚配置 HAL_GPIO_Init(Key2_GPIO_Port, &GPIO_InitStruct); } uint8_t Key1_Value(void) { if(Key1 == 0) { HAL_Delay(10); if(Key1 == 0) { return 0; } else { return 1; } } return 1; } uint8_t Key2_Value(void) { if(Key2 == 0) { HAL_Delay(10); if(Key2 == 0) { return 0; } else { return 1; } } return 1; }
driver_key.h文件
#ifndef __DRIVER_KEY_H #define __DRIVER_KEY_H #include "stm32f1xx_hal.h" #define Key1_Pin GPIO_PIN_4 #define Key1_GPIO_Port GPIOE #define Key2_Pin GPIO_PIN_3 #define K2_GPIO_Port GPIOE #define KEY1_GPIO_CLK_EN() __HAL_RCC_GPIOE_CLK_ENABLE() #define KEY2_GPIO_CLK_EN() __HAL_RCC_GPIOE_CLK_ENABLE() #define Key1 HAL_GPIO_ReadPin(Key1_GPIO_Port, Key1_Pin) #define Key2 HAL_GPIO_ReadPin(Key2_GPIO_Port, Key2_Pin) uint8_t Key1_Value(void); uint8_t Key2_Value(void); void key_init(void); #endif
总结
按键的模块化其实和LED的模块化区别不大主要就是需要主要设置GPIO的模式为输入,然后将引脚设置为上拉。