GPIO输入—按键检测(开关控制小灯)

本次的代码全是在上次代码之上添加的.

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; //有按键按下,灯的亮灭翻转一次 } } }
posted @ 2018-04-16 08:44  wenshinlee  阅读(4218)  评论(0编辑  收藏  举报