stm32使用固件库实现按键输入检测
1. 使用固件库操作实现按键输入检测功能,同时使用LED灯指示按键状态。
2. 代码:
main.c主函数
#include "stm32f10x.h"
#include "bsp_led.h"
#include "bsp_key.h"
/*主函数*/
int main(void)
{
LED_GPIO_Config(); /*LED灯端口初始化*/
KEY_GPIO_Config(); /*按键端口初始化*/
GPIO_SetBits(LED_G_GPIO_PORT, LED_G_GPIO_PIN); /*设置LED灯初始化状态为灭*/
while(1) /*循环检测按键端口状态*/
{
if (KeyScan(KEY1_GPIO_PORT,KEY1_GPIO_PIN) == KEY_ON) /*如果扫描按键端口电平为高,则打开LED灯*/
{
GPIO_ResetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN); /*开灯*/
}
}
}
bsp_key.c
#include "bsp_key.h"
/*按键初始化函数,跟LED初始化函数类似*/
void KEY_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStruct; /*使用 GPIO_InitTypeDef 定义 GPIO 初始化结构体变量*/
RCC_APB2PeriphClockCmd(KEY1_GPIO_CLK,ENABLE); /*开时钟*/
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0; /*设置GPIO pin口*/
GPIO_InitStruct.GPIO_Mode= GPIO_Mode_IN_FLOATING; /*设置输入模式为浮空输入*/
GPIO_InitStruct.GPIO_Speed= GPIO_Speed_50MHz; /*设置速率*/
GPIO_Init(GPIOA, &GPIO_InitStruct); /*调用 GPIO_Init 函数向寄存器写入参数,完成 GPIO 的初始化*/
}
/*按键扫描函数*/
uint8_t KeyScan(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; /*返回按键状态1*/
}
else
return KEY_OFF;
}


bsp_key.h
#ifndef __bsp_key_h #define __bsp_key_h #include "stm32f10x.h" /*按键GPIO口宏定义*/ #define KEY1_GPIO_PIN GPIO_Pin_0 #define KEY1_GPIO_PORT GPIOA #define KEY1_GPIO_CLK RCC_APB2Periph_GPIOA #define KEY_ON 1 #define KEY_OFF 0 void KEY_GPIO_Config(viod); #endif /*__bsp_key_h*/
bsp_led.c
#include "bsp_led.h"
void LED_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(LED_G_GPIO_CLK,ENABLE);
GPIO_InitStruct.GPIO_Pin = LED_G_GPIO_PIN;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(LED_G_GPIO_PORT, &GPIO_InitStruct);
}
bsp_led.h
#ifndef __bsp_key_h #define __bsp_key_h #include "stm32f10x.h" /*按键GPIO口宏定义*/ #define KEY1_GPIO_PIN GPIO_Pin_0 #define KEY1_GPIO_PORT GPIOA #define KEY1_GPIO_CLK RCC_APB2Periph_GPIOA #define KEY_ON 1 #define KEY_OFF 0 void KEY_GPIO_Config(viod); #endif /*__bsp_key_h*/
3. 参考资料
野火原理图



4. 总结:
(1) 每个程序编写没有明确的前后顺序,都需要交叉编写。但bsp_led.c和bsp_led.h优先比bsp_key.c和bsp_key.h编写。
(2) 功能框图

(3) 目前只实现了按键按下灯亮操作,没有实现灯亮灭切换。后续补充ing

浙公网安备 33010602011771号