本次的代码全是在上次代码之上添加的.
1.user下新建文件夹key,新建bsp_key.h bsp_key.c文件.
2.keil项目添加bsp_key.c,魔术棒C/C++中include path添加key文件夹.
3.相应的源码为:
bsp_key.h中内容
//条件编译,防止重复定义头文件(stm32f10x.h在这里引入,但是在主函数中仍然引入,会被加载两次,若没有添加编译会报错.)
#ifndef BSP_KEY_H_ #define BSP_KEY_H_ #include "stm32f10x.h" #define KEY_ON 1 #define KEY_OFF 0 #define KEY_LED_GPIO_PIN GPIO_Pin_13 #define KEY_LED_GPIO_PORT GPIOC #define KEY_LED_GPIOC_CLOCK RCC_APB2Periph_GPIOC void KEY_LED_Config(void); uint8_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin); #endif
bsp_key.c中内容
//只需要包含自身的头文件即可
#include "bsp_key.h"
//配置按键的GPIOC,配置完成后通过检测GPIOC的pin13引脚(对应的寄存器为GPIOC-IDR-PIN13)的高低电平 判断键是否被按下,高--按下,低--未按下 void KEY_LED_Config(void){ GPIO_InitTypeDef GPIO_InitStruct; RCC_APB2PeriphClockCmd(KEY_LED_GPIOC_CLOCK, ENABLE); GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING; GPIO_InitStruct.GPIO_Pin=KEY_LED_GPIO_PIN; GPIO_Init(KEY_LED_GPIO_PORT, &GPIO_InitStruct); }
//检测案件是否按下函数 GPIO_ReadInputDataBit 库函数中函数,含义为 检测某个GPIOX的某个pin的电平
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; }
main函数中内容
#include "stm32f10x.h" // 相当于51单片机中的 #include <reg51.h> #include "bsp_led.h" #include "bsp_key.h" #define SOFT_DELAY Delay(0x0FFFFF); //void Delay(__IO u32 nCount); void Delay( uint32_t count){ for( ;count!=0;count--); } int main(void) { // 来到这里的时候,系统的时钟已经被配置成72M。 LED_GPIO_Config();
//默认情况,灯为灭的.(LED电路图为低电平点亮,配置完成后默认为低电平,即便是不赋值也会亮起来) LED_OFF; KEY_LED_Config(); while(1){ if(Key_Scan(KEY_LED_GPIO_PORT,KEY_LED_GPIO_PIN)==KEY_ON){ LED_TOGGLE; //有按键按下,灯的亮灭翻转一次 } } }