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
  • 6
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: STM32F103VET6是一款32位单片机芯片,具有高性能和丰富的外设功能。按键模块可以方便地与STM32F103VET6进行连接,实现按键的检测和控制。 按键模块通常由按键开关和电阻等元件组成。它可以通过两个引脚与STM32F103VET6相连,一个引脚连接到按键开关,另一个引脚连接到电源地。当按键被按下时,引脚之间的电阻值将会改变,从而导致STM32F103VET6感知到按键按下的事件。 为了使用按键模块,我们可以通过配置STM32F103VET6的GPIO外设,将相应的引脚设置为输入模式。然后可以使用GPIO的中断功能,当检测到按键按下时,触发中断并执行相应的处理程序。 除了可以检测按键按下的事件外,我们还可以对按键进行消抖处理。由于按键通常存在抖动现象,即按键在短时间内多次开关状态,我们可以通过软件算法来消除这些无效的按键事件。 另外,我们还可以使用STM32F103VET6的定时器外设,来定时检测按键状态。通过定时器的中断触发,我们可以周期性地检测按键是否按下。 通过按键模块,我们可以实现多种功能,例如控制LED的亮灭、切换显示屏内容等。在嵌入式系统开发中,按键模块是一种非常常见且实用的外设,可以为用户提供便捷的交互方式。 ### 回答2: STM32F103VET6是一款基于ARM Cortex-M3内核的32位微控制器,具有丰富的外设资源和强大的计算能力,适用于各种应用场景。按键模块是一种常见的外设,可以方便地与STM32F103VET6进行通信,实现对按键的检测和响应。 按键模块一般由多个按键开关和输入电路组成,通过连接到STM32F103VET6的GPIO引脚,可以实现按键的检测。在STM32F103VET6中,可以通过GPIO的输入模式来配置对应的引脚作为按键输入。通过读取GPIO寄存器的值,可以得知按键的状态,例如按下或释放。 为了提高按键检测的稳定性和精准度,可以应用一些消抖技术,例如加入软件延时、硬件滤波电路等。在按键被按下或释放时,可以通过中断或轮询的方式进行检测,并采取相应的处理措施。 使用STM32F103VET6按键模块,可以实现对用户输入的响应,例如控制LED或其他外设的开关、通过按键进行菜单选择等功能。在实际应用中,可以根据具体需求设计相应的按键布局和逻辑。 总之,STM32F103VET6按键模块是一种方便实用的外设,可以与微控制器进行连接,实现按键的检测和响应。通过合理的设计和编程,可以实现各种功能,为产品的交互提供良好的用户体验。 ### 回答3: STM32F103VET6是一款高性能、低功耗的32位微控制器芯片,按键模块是其中的一种外设模块。 按键模块通常用于检测按键的状态,可以实现用户与系统的交互功能。在STM32F103VET6中,按键模块通常由GPIO(通用输入输出)模块和外部电路组成。 具体来说,GPIO模块可以通过配置其为输入模式,连接外部的按键电路。按下按键时,电路会产生一个低电平信号或者一个高电平信号,通过GPIO模块的输入引脚可以检测到这一信号。 为了有效检测到按键状态的变化,通常还需要对按键进行消抖处理。消抖处理是为了排除按键进行物理接触时产生的瞬间脉冲信号。可以通过软件延时、硬件滤波、外部RC电路等方法实现按键消抖。 在STM32F103VET6中,可以使用专门的库函数或者底层寄存器操作来配置GPIO模块,读取按键的状态。通过判断按键状态的变化,可以进行相应的操作,例如触发中断、改变LED的状态等。 另外,为了不影响其他功能模块的正常运行,通常还需要对按键模块进行电源管理和优化。可以根据具体的应用场景,合理选择按键模块的引脚、电源电压等参数。 总之,STM32F103VET6的按键模块是一种用于检测按键状态的外设模块,通过与GPIO模块和外部电路的配合,可以实现用户与系统的交互功能。在具体应用中,需要根据需求进行引脚配置、消抖处理、电源管理等相关设置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值