STM32入门—GPIO输入

本文介绍了如何在STM32中使用GPIO进行按键输入,包括查找引脚、配置GPIO为输入模式、编写按键扫描函数以及设置按键事件,如灯灭键按下、灯亮键松开。
摘要由CSDN通过智能技术生成

STM32入门—GPIO输入源代码压缩文件按资源:https://download.csdn.net/download/m0_74910976/88766128?spm=1001.2014.3001.5503 

GPIO的输入一般通过按键来表示,当按下按键给系统输入一个高电平,相当于二进制的"1",当松开按键就回到了低电平"0"。 

1.查找引脚

通过原理图查找按键的引脚

通过按键模块的原理图可以知道按键2、3对应的引脚分别是PA0和PC13。

2.配置引脚

输入使用的是数据输入寄存器IDR,下面以按键2为例

在工程文件中添加key.c文件,用于配置按键。 

在key.c中带定义一个配置函数void KEY_GPIO_Config(void),首先定义一个GPIO_InitTypeDef类型的变量GPIO_InitStructure,然后打开GPIOA外设的系统时钟RCC,因为PA0是GPIOA下面的I/O口,接下来就是使用刚刚定义的变量GPIO_InitStructure来设置PA0的输入模式,最后通过GPIO_Init()函数来初始化PA0。

void KEY_GPIO_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
}

再在key.c中定义一个函数uint8_t Key_Scan(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)用于判断按键按下和松开。原理就是,如果按下按键,输入高电平,松开就回到低电平,如果长按,就用一个while循环来定于按下的操作

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;
}

在这个函数里面,GPIO_ReadInputDataBit()这个函数用于读取I/O输入数据比特位,按下就是"1",松开就是"0"。在这个if...else中,如果按下就进入if,当你长按使就一直执行while循环,没有其他操作,循环结束返回KEY_ON, KEY_ON是宏定义的"1"。如果松开就执行else,返回"0"。

将这两个函数在key.h头文件中声明,这样在main.c中包含头文件就可以使用这两个函数。

3.设置按键事件

这里按键事件是按下灯灭,松开灯亮。

首先打开LED的RCC时钟,再调用LED的配置函数配置LED,同样调用按键配置函数配置按键,然后通过一个while循环取检测按键状态

int main(void)
{
	LED_GPIO_RCC();                 //打开两个LED的时钟RCC
	LED_GPIO_Config(GPIO_Pin_0);    //LED1
	LED_GPIO_Config(GPIO_Pin_1);    //LED2
	KEY_GPIO_Config();              //KEY1
	KEY_GPIO_Config1();             //KEY2
	
	while(1)         
	{	
	    if(Key_Scan(GPIOA, GPIO_Pin_0) == KEY_ON)
				LED_G_TOGGLE;
			
		if(Key_Scan(GPIOC, GPIO_Pin_13) == KEY_ON)
				LED_G_TOGGLE1;
	}
}

这里的LED_G_TOGGLE是定义再led.h中的宏定义

#define LED_G_TOGGLE          {GPIOB->ODR ^= GPIO_Pin_0;}
#define LED_G_TOGGLE1         {GPIOB->ODR ^= GPIO_Pin_1;}

 ^是C语言二进制的运算符异或,作用就是与1异或改变,与0异或不变,这样就可以使LED亮灭交替。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

m0_20230122

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值