【STM32】GPIO之按键

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 上。

在这里插入图片描述

这里需要注意的是: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 开发指南》

猜你喜欢

转载自blog.csdn.net/dengjin20104042056/article/details/108140561