STM32按键控制LED灯

因为是按键输入,所以创立两个文件 bsp_key.c和bsp_key.h文件。

一、bsp_key.c中需要对按键进行初始化,这个和LED的类似,GPIOA-G均是挂在APB2上的。
1、时钟:故时钟均为RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)。不同的是,KEY1是在GPIOA,KEY2是在GPIOC。故时钟分别为RCC_APB2PeriphClockCmd(KEY1_GPIO_CLK,ENABLE);和RCC_APB2PeriphClockCmd(KEY2_GPIO_CLK,ENABLE);
KEY1_GPIO_CLK和KEY2_GPIO_CLK需要在头文件里定义。

2、模式:GPIO_Mode_IN_FLOATING; //浮动输入

3、按键检测函数:uint8_t    key_scan(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);需要有两个参数,和LED一样,1个是确定GPIO,1个是哪个位(GPIO_Pin控制的是BSRR和BRR寄存器)

、bsp_key.h文件对按键1和2进行宏定义,以及按键初始化函数和按键检测函数的声明。这里面宏定义的KEY_ON和KEY_OFF是为了方便判断按键是否按下因为GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)的返回值是0和1,宏定义是为了更加直观的判断按键是否按下,故才宏定义1和0

三、在bsp_led.h中

#define LED1_TOGGLE        {LED1_GPIO_PORT->ODR ^=LED1_GPIO_PIN;} //绿灯状态翻转
#define LED3_TOGGLE        {LED3_GPIO_PORT->ODR ^=LED3_GPIO_PIN;} //红灯状态翻转

四、在main.c中
int main(void)
{
    LED_GPIO_Config();
    KEY_GPIO_Config();
    while(1)
    {
        if(key_scan(GPIOA,KEY1_GPIO_PIN)==KEY_ON)
            LED1_TOGGLE;
        
        if(key_scan(GPIOC,KEY2_GPIO_PIN)==KEY_ON)
            LED3_TOGGLE;    
        
    }
}

代码如下

main.c

#include	"stm32f10x.h"
#include 	"bsp_led.h"
#include 	"bsp_key.h"

//软件延时函数1ms
void delay_ms(uint32_t	time)
{
	uint32_t	i;
	while(time--)
	{
		i=12000;
		while(i--);
	}
}

//函数功能:按K1点亮绿灯。按K2点亮红灯
int main(void)
{
	LED_GPIO_Config();
	KEY_GPIO_Config();
	while(1)
	{
		if(key_scan(GPIOA,KEY1_GPIO_PIN)==KEY_ON)
			LED1_TOGGLE;
		
		if(key_scan(GPIOC,KEY2_GPIO_PIN)==KEY_ON)
			LED3_TOGGLE;	
		
	}
}

//bsp_key.c

#include "bsp_key.h"


void KEY_GPIO_Config(void)
{
	GPIO_InitTypeDef		GPIO_InitStructure;		//	定义初始化结构体
	
	
	RCC_APB2PeriphClockCmd(KEY1_GPIO_CLK,ENABLE);  //开时钟
	
	
	GPIO_InitStructure.GPIO_Pin=KEY1_GPIO_PIN;		//选择GPIOB要控制的引脚0
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
	GPIO_Init(KEY1_GPIO_PORT,&GPIO_InitStructure);
	
	RCC_APB2PeriphClockCmd(KEY2_GPIO_CLK,ENABLE);  //开时钟
	GPIO_InitStructure.GPIO_Pin=KEY2_GPIO_PIN;		//选择GPIOC要控制的引脚13
	GPIO_Init(KEY2_GPIO_PORT,&GPIO_InitStructure);
	
}

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;
}

//bsp_key.h

#ifndef _BSP_KEY_H
#define	_BSP_KEY_H

#include	"stm32f10x.h"

#define		KEY1_GPIO_PIN		GPIO_Pin_0  //按键1
#define		KEY1_GPIO_PORT	GPIOA
#define		KEY1_GPIO_CLK		RCC_APB2Periph_GPIOA

#define		KEY2_GPIO_PIN		GPIO_Pin_13  //按键1
#define		KEY2_GPIO_PORT	GPIOC
#define		KEY2_GPIO_CLK		RCC_APB2Periph_GPIOC

#define		KEY_ON			1
#define		KEY_OFF			0	

void KEY_GPIO_Config(void);
uint8_t	key_scan(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

#endif

bsp_led.c

#include "bsp_led.h"

void LED_GPIO_Config(void)
{
	GPIO_InitTypeDef		GPIO_InitStructure;		//	定义初始化结构体
	
	
	RCC_APB2PeriphClockCmd(LED1_GPIO_CLK,ENABLE);  //开时钟
	
	GPIO_InitStructure.GPIO_Pin=LED1_GPIO_PIN;		//选择GPIO要控制的引脚0
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;	
	GPIO_Init(LED1_GPIO_PORT,&GPIO_InitStructure);	
	
	RCC_APB2PeriphClockCmd(LED2_GPIO_CLK,ENABLE); 
	GPIO_InitStructure.GPIO_Pin=LED2_GPIO_PIN;		//选择GPIO要控制的引脚1
	GPIO_Init(LED2_GPIO_PORT,&GPIO_InitStructure);
	
	RCC_APB2PeriphClockCmd(LED3_GPIO_CLK,ENABLE); 
	GPIO_InitStructure.GPIO_Pin=LED3_GPIO_PIN;		//选择GPIO要控制的引脚5
	GPIO_Init(LED3_GPIO_PORT,&GPIO_InitStructure);
	
	//熄灭所有灯
	GPIO_SetBits(LED1_GPIO_PORT,LED1_GPIO_PIN); 
	GPIO_SetBits(LED2_GPIO_PORT,LED2_GPIO_PIN); 
	GPIO_SetBits(LED3_GPIO_PORT,LED3_GPIO_PIN); 
}

bsp_led.h 

#ifndef _BSP_LED_H
#define	_BSP_LED_H

#include	"stm32f10x.h"

#define		LED1_GPIO_PIN		GPIO_Pin_0  //绿灯
#define		LED1_GPIO_PORT		GPIOB
#define		LED1_GPIO_CLK		RCC_APB2Periph_GPIOB

#define		LED2_GPIO_PIN		GPIO_Pin_1	//蓝灯
#define		LED2_GPIO_PORT		GPIOB
#define		LED2_GPIO_CLK		RCC_APB2Periph_GPIOB

#define		LED3_GPIO_PIN		GPIO_Pin_5	//红灯
#define		LED3_GPIO_PORT		GPIOB
#define		LED3_GPIO_CLK		RCC_APB2Periph_GPIOB

#define		ON		1
#define		OFF		0	

#define LED1_TOGGLE		{LED1_GPIO_PORT->ODR ^=LED1_GPIO_PIN;} //绿灯状态翻转
#define LED3_TOGGLE		{LED3_GPIO_PORT->ODR ^=LED3_GPIO_PIN;} //红灯状态翻转

#define		LED1_G(a)		if(a)	\
														GPIO_ResetBits(LED1_GPIO_PORT,LED1_GPIO_PIN);\
											else	GPIO_SetBits(LED1_GPIO_PORT,LED1_GPIO_PIN);

#define		LED2_B(a)		if(a)	\
														GPIO_ResetBits(LED2_GPIO_PORT,LED2_GPIO_PIN);\
											else	GPIO_SetBits(LED2_GPIO_PORT,LED2_GPIO_PIN);

#define		LED3_R(a)		if(a)	\
														GPIO_ResetBits(LED3_GPIO_PORT,LED3_GPIO_PIN);\
											else	GPIO_SetBits(LED3_GPIO_PORT,LED3_GPIO_PIN);

void LED_GPIO_Config(void);
#endif
要实现STM32按键控制LED闪烁的功能,可以按照以下步骤进行操作。首先,将4个LED连接到STM32单片机的PB0、PB1、PB2、PB3引脚上,并将4个220欧姆电阻连接到相应的引脚上,以防止电流过大损坏LED。然后,将4个按键连接到STM32单片机的PA0、PA1、PA2、PA3引脚上。接下来,编写程序并进行编译链接,生成可执行代码。通过ST-Link仿真器将可执行代码下载到开发板上。在程序中,可以设置按键B1来控制指示LD2的闪烁频率。初始状态下,LD2按照2Hz的频率闪烁。当按下B1按键后,LD2的闪烁频率会变为10Hz。再次按下B1按键后,LD2的闪烁频率会变为20Hz。再次按下B1按键后,LD2的闪烁频率会恢复为2Hz,并重复上述过程。按键的检测可以采用中断方式。这样,就可以实现STM32按键控制LED闪烁的功能。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* [stm32按键实现LED的闪烁](https://blog.csdn.net/Willy_2/article/details/131388443)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [【学习记录】STM32中断进阶任务:按键控制指示闪烁频率](https://blog.csdn.net/weixin_45015121/article/details/128608086)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值