一、原理图
没有按下为低电平
二、初始化
初始化两个端口,端口对应的引脚,时钟AHB1,编写配置(config)函数
/*配置按钮的引脚
*按键是PA0和PC13引脚
*GPIOA GPIOC
*端口A打开时0号引脚;端口C打开时13号引脚
*/
#ifndef _BSP_KEY_H
#define _BSP_KEY_H
#include "stm32f4xx.h"
#define KEY_1_PIN GPIO_Pin_0
#define KEY_1_PORT GPIOA//配置端口
#define KEY_1_CLK RCC_AHB1Periph_GPIOA
#define KEY_2_PIN GPIO_Pin_13
#define KEY_2_PORT GPIOC
#define KEY_2_CLK RCC_AHB1Periph_GPIOC
//初始状态为低电平,关
#define KEY_ON 1
#define KEY_OFF 0
void KEY_GPIO_Config(void);
#endif
#include "bsp_key.h"
//config:配置
void KEY_GPIO_Config(void)
{
//构建功能结构体
GPIO_InitTypeDef GPIO_InitStructure;
//打开时钟
RCC_AHB1PeriphClockCmd(KEY_1_CLK, ENABLE);
RCC_AHB1PeriphClockCmd(KEY_2_CLK, ENABLE);
//RCC_AHB1PeriphClockCmd(KEY_1_CLK|KEY_2_CLK, ENABLE);
//配置引脚功能
GPIO_InitStructure.GPIO_Pin = KEY_1_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
//注释的两行是配置输出情况的
//GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
//GPIO_InitStructure.GPIO_Speed = GPIO_Low_Speed;
//调用GPIO初始化函数
GPIO_Init(KEY_1_PORT,&GPIO_InitStructure);
/*因为两个按键输入情况是一样的,所以结构体功能不需要再配置
*只需要改变引脚标识即可
*/
GPIO_InitStructure.GPIO_Pin = KEY_2_PIN;
GPIO_Init(KEY_2_PORT,&GPIO_InitStructure);
}
三、编写按键控制灯的函数
1、uint8_t Key_Scan:指的是接受一个char类型的参数,并返回一个char类型的值
2、调用uint8_t GPIO_ReadInputDataBit函数,检测某个端口引脚的电平,高点品返回值为1.低电平返回值为 0
——头文件编写
#ifndef _BSP_LED_H
#define _BSP_LED_H
//寄存器映射
#include "stm32f4xx.h"
//定义灯的引脚,GPIO端口类型(port),GPIO对应的时钟引脚
#define LED1_PIN GPIO_Pin_6
#define LED1_GPIO_PORT GPIOF
#define LED1_GPIO_CLK RCC_AHB1Periph_GPIOF
#define LED2_PIN GPIO_Pin_7
#define LED2_GPIO_PORT GPIOF
#define LED2_GPIO_CLK RCC_AHB1Periph_GPIOF
#define LED3_PIN GPIO_Pin_8
#define LED3_GPIO_PORT GPIOF
#define LED3_GPIO_CLK RCC_AHB1Periph_GPIOF
/**根据原理图LED亮为低电平,设置on为0
* off为1
*/
#define ON 0
#define OFF 1
/**定义开灯关灯函数
*on=0 复位GPIO_ResetBits,低电平开灯
*off=1 置位GPIO_SetBits,高电平关灯
*/
#define LED1(a) if(a) GPIO_SetBits(LED1_GPIO_PORT, LED1_PIN);\
else GPIO_ResetBits(LED1_GPIO_PORT, LED1_PIN);
#define LED2(a) if(a) GPIO_SetBits(LED2_GPIO_PORT, LED2_PIN);\
else GPIO_ResetBits(LED2_GPIO_PORT, LED2_PIN);
#define LED3(a) if(a) GPIO_SetBits(LED3_GPIO_PORT, LED3_PIN);\
else GPIO_ResetBits(LED3_GPIO_PORT, LED3_PIN);
/*定义函数操控寄存器*/
/*^=按位异或,二进制位上相同为0,不同为1*/
#define digitalHi(p,i) {p->BSRRL = i;} //设置高电平
#define digitalLo(p,i) {p->BSRRH = i;} //输出低电平
#define digitalToggle(p,i) {p->ODR ^= i;} //输出反转状态
/*定义IO的宏
*BSRRH = pin;BSRRL = pin;通过引脚地址控制电平状态
*BSRR(HL)控制ODR,可以直接操控ODR
*/
#define LED1_TOGGLE digitalToggle(LED1_GPIO_PORT,LED1_PIN)
#define LED1_ON digitalLo(LED1_GPIO_PORT,LED1_PIN)
#define LED1_OFF digitalHi(LED1_GPIO_PORT,LED1_PIN)
#define LED2_TOGGLE digitalToggle(LED2_GPIO_PORT,LED2_PIN)
#define LED2_ON digitalLo(LED2_GPIO_PORT,LED2_PIN)
#define LED2_OFF digitalHi(LED2_GPIO_PORT,LED2_PIN)
#define LED3_TOGGLE digitalToggle(LED3_GPIO_PORT,LED3_PIN)
#define LED3_ON digitalLo(LED3_GPIO_PORT,LED3_PIN)
#define LED3_OFF digitalHi(LED3_GPIO_PORT,LED3_PIN)
#define LED_12 LED1_ON;\
LED2_ON;\
LED3_OFF;
#define LED_13 LED1_ON;\
LED2_OFF;\
LED3_ON;
#define LED_23 LED1_OFF;\
LED2_ON;\
LED3_ON;
#define LED_123 LED1_ON;\
LED2_ON;\
LED3_ON;
#define LED_RGBOFF LED1_OFF;\
LED2_OFF;\
LED3_OFF;
void LED_GPIO_Config(void);
void delay(__IO uint32_t count);
#endif //头文件被多个内容包含时,头文件内容不会被重复包含(每次都定义)
——c文件编写
#include "bsp_key.h"
//config:配置
void KEY_GPIO_Config(void)
{
//构建功能结构体
GPIO_InitTypeDef GPIO_InitStructure;
//打开时钟
//RCC_AHB1PeriphClockCmd(KEY_1_CLK, ENABLE);
//RCC_AHB1PeriphClockCmd(KEY_2_CLK, ENABLE);
RCC_AHB1PeriphClockCmd(KEY_1_CLK|KEY_2_CLK, ENABLE);
//配置引脚功能
GPIO_InitStructure.GPIO_Pin = KEY_1_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
//注释的两行是配置输出情况的
//GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
//GPIO_InitStructure.GPIO_Speed = GPIO_Low_Speed;
//调用GPIO初始化函数
GPIO_Init(KEY_1_PORT,&GPIO_InitStructure);
/*因为两个按键输入情况是一样的,所以结构体功能不需要再配置
*只需要改变引脚标识即可
*/
GPIO_InitStructure.GPIO_Pin = KEY_2_PIN;
GPIO_Init(KEY_2_PORT,&GPIO_InitStructure);
}
//调用uint8_t GPIO_ReadInputDataBit函数,检测某个端口引脚的电平
uint8_t KEY_Scan(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON)
{
//利用一个循环来判断按键是否释放
while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON);
return KEY_ON;
}
else
return KEY_OFF;
}