【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系列教程汇总
07. 声明
该教程参考了正点原子的《STM32 F4 开发指南》
上一篇: Tomcat源码导入idea的方法
下一篇: 芦笋罐头是什么食物?