因为是按键输入,所以创立两个文件 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