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