按键检测GPIO输入

摘要:
为GPIO初始化结构分配一个值,并将引脚初始化为浮动输入模式,其中GPIO_引脚使用宏“KEYx_GPIO_pin”分配值,使功能的实现易于移植。使用相同的初始化结构,仅修改控制引脚和端口,并初始化用于其他密钥检测的GPIO引脚。

1. 项目

  通过按键控制开关LED灯,按下按键灯亮,再按一下灯灭。

2. 代码

  mian.c

  

#include "stm32f10x.h"			//相当于51单片机中的 	#include <reg51.h>
#include "bsp_key.h"
#include "bsp_led.h"

void Delay(uint32_t count)
{
	for(; count!=0; count--);
}

int main(void)
{
	//来到这里是,系统的时钟已经被配置到72MHz了
	LED_GPIO_Config();
	KEY_GPIO_Config();	//初始化KEY函数
	while(1)
	{		
			if(Key_Scan(KEY2_GPIO_PORT, KEY2_GPIO_PIN) == KEY_ON)
			{
				LED_R_TOGGLE;
			}
	}

}

  bsp_key.c

  

#include "bsp_key.h"
void KEY_GPIO_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStruct;

	RCC_APB2PeriphClockCmd(KEY2_GPIO_CLK, ENABLE);
	GPIO_InitStruct.GPIO_Pin = KEY2_GPIO_PIN;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;

	GPIO_Init(KEY2_GPIO_PORT, &GPIO_InitStruct);
	
}


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 KEY_ON				1
#define KEY_OFF				0

#define KEY2_GPIO_PIN						GPIO_Pin_13
#define KEY2_GPIO_PORT					GPIOC
#define KEY2_GPIO_CLK						RCC_APB2Periph_GPIOC

void KEY_GPIO_Config(void);
uint8_t Key_Scan(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
#endif/*__bsp_key_h*/

  bsp_led.c

  

#include "bsp_led.h"

void LED_GPIO_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStruct;
	
	
	RCC_APB2PeriphClockCmd(LED_R_GPIO_CLK, ENABLE);
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStruct.GPIO_Pin = LED_R_GPIO_PIN; 	
	GPIO_Init(LED_R_GPIO_PORT, &GPIO_InitStruct);
}

  bsp_led.h

  

//头文件
#ifndef __bsp_led_h
#define __bsp_led_h

#include "stm32f10x.h"
#define LED_R_GPIO_PIN						GPIO_Pin_5
#define LED_R_GPIO_PORT						GPIOB
#define LED_R_GPIO_CLK						RCC_APB2Periph_GPIOB


#define ON		1
#define OFF		0

//	C语言续行符,后面不能有任何东西
										
#define LED_R(a);		if (a)	
														GPIO_SetBits(LED_R_GPIO_PORT,LED_R_GPIO_PIN);
										else 		GPIO_ResetBits(LED_R_GPIO_PORT,LED_R_GPIO_PIN);
										
//C语言中的二进制运算符
//与1异或改变,与0异或不变
#define LED_R_TOGGLE				{LED_R_GPIO_PORT->ODR ^= LED_R_GPIO_PIN;}
void LED_GPIO_Config(void);
#endif /*__bsp_led._h*/

3. 参考资料

  •   原理图
  • 按键检测GPIO输入第1张
  • 编程要点

    a. 使能 GPIO 端口时钟;

    b. 初始化 GPIO 目标引脚为输入模式 (浮空输入)
    c. 编写简单测试程序,检测按键的状态,实现按键控制 LED 灯。

  • 函数执行流程
    • (1) 使用 GPIO_InitTypeDef 定义 GPIO 初始化结构体变量,以便下面用于存储 GPIO 配置。
    • (2) 调用库函数 RCC_APB2PeriphClockCmd 来使能按键的 GPIO 端口时钟,调用时我们使用“|操作同时配置两个按键的时钟。
    • (3) GPIO 初始化结构体赋值,把引脚初始化成浮空输入模式,其中的 GPIO_Pin 使用宏KEYx_GPIO_PIN”来赋值,使函数的实现方便移植。由于引脚的默认电平受按键电路影响,所以设置成浮空输入。
    • (4) 使用以上初始化结构体的配置,调用 GPIO_Init 函数向寄存器写入参数,完成 GPIO 的初始化,这里的 GPIO 端口使用“KEYx_GPIO_PORT”宏来赋值,也是为了程序移植方便。
    • (5) 使用同样的初始化结构体,只修改控制的引脚和端口,初始化其它按键检测时使用的 GPIO引脚。

免责声明:文章转载自《按键检测GPIO输入》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【推荐】《Netty in action》书籍Mac OSX 10.10下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

聚合初始化

摘自时习之 C++标准库中提供两个容器表示数组这个概念:array表示静态数组,vector表示动态数组 。这两个类型都可以使用列表初始化(list initilization)来初始化。 std::array<int, 5> = {1, 2, 3, 4, 5}; std::vector<int> = {1, 2, 3, 4,...

高通Android Camera Bring up

高通Android Camera的移植 注:此文档以在高通8916平台移植OV5648为例,给大家讲解Android SOC的底层Camera。 Reference: https://blog.csdn.net/weijory/article/details/53811140 https://www.jianshu.com/p/70bdb79e5026...

centos下修改mysql8.0数据库存储目录后出现问题:File './mysql-bin.index' not found (OS errno 13 -Permission denied)

在centos7.6下安装mysql8.0,安装完成后修改数据库存储目录,在配置文件/etc/my.cnf中修改datadir ,socket  修改后进行初始化,初始化完成后启动数据库报如下错误:  解决方案:将/etc/selinux/config中这里改为 disabled,然后重启机器就可以了...

C++ 构造和析构

1、继承关系可认为,子类在父类的基础上进行。从这个角度讲,可把它认为穿衣脱衣的过程。穿衣是:先穿内衣,再穿外套。脱衣是:先脱外套,在脱内衣。构造是:先调用父类构造方法,再调用子类构造方法。析构是:先调用子类析构方法,再调用父类析构方法。 2、构造可分为两个步骤:初始化列表和方法内赋值。前者的使用场景是:初始化,即copy构造。后者的使用场景是:赋值,即co...

在Vue中使用了Swiper ,从后台获取动态数据后,swiper滑动失效

原因是因为Swiper提前初始化了,然而数据还没有加载完成。解决方法如下: 1、在Swiper初始化时 swiper0 = new Swiper('.w0', { initialSlide :0, observer:true,//修改swiper自己或子元素时,自动初始化swiper observeParents:true,//修改...

Linux动态频率调节系统CPUFreq之二:核心(core)架构与API

上一节中,我们大致地讲解了一下CPUFreq在用户空间的sysfs接口和它的几个重要的数据结构,同时也提到,CPUFreq子系统把一些公共的代码逻辑组织在一起,构成了CPUFreq的核心部分,这些公共逻辑向CPUFreq和其它内核模块提供了必要的API,像cpufreq_governor、cpufreq_driver等模块通过这些API来完成一个完整的CP...