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)