STM32_按键检测(GPIO输入)

一、原理图

没有按下为低电平

二、初始化

初始化两个端口,端口对应的引脚,时钟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;
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值