欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【STM32】GPIO之按键

程序员文章站 2022-07-02 11:10:48
...

00. 目录

01. 功能描述

STM32F4 的 IO口做输入使用的时候,是通过调用函数 GPIO_ReadInputDataBit()来读取 IO 口的状态的。

探索者 STM32F4 开发板上载有的 4 个按钮(KEY_UP、KEY0、KEY1 和 KEY2),来控制板上的 2 个 LED(DS0 和 DS1)和蜂鸣器,其中 KEY_UP 控制蜂鸣器,按一次叫,再按一次停;KEY0 控制 DS0,按一次亮,再按一次灭;KEY1 控制 DS1,
效果同 KEY2;KEY2 则同时控制 DS0 和 DS1,按一次,它们的状态就翻转一次。

02. 控制原理

探索者 STM32F4开发板上的按键 KEY0 连接在 PE4 上、KEY1 连接在 PE3 上、KEY2 连接在 PE2 上、KEY_UP连接在 PA0 上。

【STM32】GPIO之按键

这里需要注意的是:KEY0、KEY1 和 KEY2 是低电平有效的,而 KEY_UP 是高电平有效的,并且外部都没有上下拉电阻,所以,需要在STM32F4 内部设置上下拉。

03. 程序示例一

Key0控制LED1 Key1控制LED2

key.h文件内容

#ifndef __KEY_H__
#define __KEY_H__

#include "sys.h"


#define KEY0 GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_4)
#define KEY1 GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_3)
#define KEY2 GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_2)
#define WK_UP GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)

#define KEY0_PRESS 1
#define KEY1_PRESS 2
#define KEY2_PRESS 3
#define WK_UP_PRESS 4

//GPIO初始化
void KEY_Init(void);

//按键扫描
u8 Key_Scan(void);


#endif/*__KEY_H__*/

key.c文件内容

#include "key.h"
#include "delay.h"

//GPIO初始化
void KEY_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStruct;
	
	//时钟使能
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOE, ENABLE);
	
	//GPIO初始化
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
	GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
	
	GPIO_Init(GPIOE, &GPIO_InitStruct);
	
	//GPIO初始化
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
	GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_DOWN;
	GPIO_Init(GPIOA, &GPIO_InitStruct);
	
}

//按键扫描
u8 Key_Scan(void)
{
	//表示按键处于松开状态
	static u8 key_up = 1;
	
	if (key_up && (0 == KEY0 || 0 == KEY1 || 0 == KEY2 || 1 == WK_UP))
	{
		//防抖
		delay_ms(10);
		
		//表示按键已经按下
		key_up = 0;
		
		if (0 == KEY0)
		{
			return KEY0_PRESS;
		}
		else if (0 == KEY1)
		{
			return KEY1_PRESS;
		}
		else if (0 == KEY2)
		{
			return KEY2_PRESS;
		}
		else if (1 == WK_UP)
		{
			return WK_UP_PRESS;
		}
	}
	else if ((1 == KEY0) && (1 == KEY1) && (1 == KEY2) && (0 == WK_UP))
	{
		//表示按键已经松开
		key_up = 1;
	}

	
	return 0;
}

main.c文件

#include "stm32f4xx.h"

#include "delay.h"
#include "led.h"
#include "beep.h"
#include "key.h"

//Key0 控制LED1 Key1控制LED2
int main(void)
{
	u8 key = 0;
	
	//初始化
	delay_init(168);
	LED_Init();
	BEEP_Init();
	KEY_Init();
	
	LED1 = 0;
	LED2 = 0;
	BEEP = 0;
	
	while(1)
	{
		key = Key_Scan();
		
		if (0 != key)
		{
			switch(key)
			{
				case KEY0_PRESS:
					LED1 = !LED1;
					break;
				case KEY1_PRESS:
					LED2 = !LED2;
					break;
			}
		
		}
		else
		{
			delay_ms(10);
		}
	}
	
}

04. 程序示例二

WK_UP控制蜂鸣器

main.c

#include "stm32f4xx.h"

#include "delay.h"
#include "led.h"
#include "beep.h"
#include "key.h"

//Key0 控制LED1 Key1控制LED2
int main(void)
{
	u8 key = 0;
	
	//初始化
	delay_init(168);
	LED_Init();
	BEEP_Init();
	KEY_Init();
	
	LED1 = 0;
	LED2 = 0;
	BEEP = 0;
	
	while(1)
	{
		key = Key_Scan();
		
		if (0 != key)
		{
			switch(key)
			{
				case KEY0_PRESS:
					LED1 = !LED1;
					break;
				case KEY1_PRESS:
					LED2 = !LED2;
				case WK_UP_PRESS:
					BEEP = !BEEP;
					break;
			}
		
		}
		else
		{
			delay_ms(10);
		}
	}
	
}

05. 程序实例三

综合实例

KEY_UP 控制蜂鸣器,按一次叫,再按一次停;KEY0 控制 DS0,按一次亮,再按一次灭;KEY1 控制 DS1,效果同 KEY2;KEY2 则同时控制 DS0 和 DS1,按一次,它们的状态就翻转一次。

main.c文件

#include "stm32f4xx.h"

#include "delay.h"
#include "led.h"
#include "beep.h"
#include "key.h"

//Key0 控制LED1 Key1控制LED2
int main(void)
{
	u8 key = 0;
	
	//初始化
	delay_init(168);
	LED_Init();
	BEEP_Init();
	KEY_Init();
	
	LED1 = 0;
	LED2 = 0;
	BEEP = 0;
	
	while(1)
	{
		key = Key_Scan();
		
		if (0 != key)
		{
			switch(key)
			{
				case KEY0_PRESS:
					LED1 = !LED1;
					break;
				case KEY1_PRESS:
					LED2 = !LED2;
					break;
				case KEY2_PRESS:
					LED1 = !LED1;
					LED2 = !LED2;
					break;	
				case WK_UP_PRESS:
					BEEP = !BEEP;
					break;
			}
		
		}
		else
		{
			delay_ms(10);
		}
	}
	
}

06. 附录

6.1 【STM32】STM32系列教程汇总

网址:【STM32】STM32系列教程汇总

07. 声明

该教程参考了正点原子的《STM32 F4 开发指南》