00. 目录

文章目录

  • 00. 目录
  • 01. 功能描述
  • 02. 控制原理
  • 03. 程序示例一
  • 04. 程序示例二
  • 05. 程序实例三
  • 06. 附录
  • 07. 声明

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 开发指南》

【STM32】GPIO之按键相关推荐

  1. STM32——GPIO输入——按键检测

    硬件介绍 当按键置空时,IO接地 按键按下之后,IO口接通3.3V高电压,电流比较大,为了避免损坏IO,这里需要加装一个限流电阻.可以看到IO口是默认低电平,按键按下后产生一个上升沿,和平常的电路设计 ...

  2. STM32学习:按键控制LED

    STM32学习:按键控制LED 文章目录 前言 一.所用知识点复习 1.stm32工作模式(*注意上下拉输入的区别*) 2.按键抖动与常见按键接法 按键抖动: 按键消抖: 常见按键接法: 3.GPIO ...

  3. 判断STM32 GPIO输入口的输入状态(高电平或低电平)

    判断STM32 GPIO输入口的输入状态(高电平或低电平) 以PE2和PE4为例: ① 判断单个端口是否为高电平: if(GPIOE->IDR& GPIO_IDR_IDR2) { 函数体 ...

  4. STM32 GPIO的原理、特性、选型和配置

    目录 1.基本结构 2.4种输入模式 3.4种输出模式 4.GPIO选型和配置 1.基本结构 STM32 GPIO是通用输入/输出端口的英文简称,其可实现输入.输出.驱动.通信等功能,STM32的I/ ...

  5. 【驱动】GPIO 作为按键时的 设备树 配置

    #[驱动]GPIO作为按键时的 设备树 配置 0.设备树 0.0 别名 imx6ul.dtsi 什么作用??? /*************开始/ / { aliases {- gpio0 = &am ...

  6. STM32——GPIO(2)

    STM32--GPIO 宗旨:技术的学习是有限的,分享的精神是无限的. /* GPIO_InitTypeDef结构体 */ typedef enum {GPIO_Speed_10MHz = 1, // ...

  7. STM32——GPIO(1)

    STM32--GPIO 宗旨:技术的学习是有限的,分享的精神是无限的. [对单片机的操作就是控制IO口] 一.GPIO(通用输入输出口) 1.选定需要的引脚(对应哪一个IO口): 2.配置需要的功能( ...

  8. MSP430 MSP430单片机输入/输出模块 通用I/O端口GPIO LED按键

     DO OR DIE MSP430 MSP430单片机输入/输出模块 通用I/O端口GPIO LED&按键 一.原理图 二.I/O端口常用操作C语言描述及常用C语言解析 1.MSP430头文件 ...

  9. STM32 GPIO BRR和BSRR寄存器

    STM32 GPIO BRR和BSRR寄存器 使用BRR和BSRR寄存器可以方便地快速地实现对端口某些特定位的操作,而不影响其它位的状态. 引脚的高.低电平控制,有3种方法(3个寄存器) 分别是通过G ...

  10. 关于STM32 GPIO配置基础概括

    一.词汇表 1.介绍常用词的定义: 缩略词 包含定义 AMR 绝对最大额定值(ABSOLUTE MAXIMUM RATINGS 更多地人称为: ABS) GPIO 通用输入/输出 GP 通用 P 推挽 ...

最新文章

  1. c语言 char转int_C语言关键字及进制的转换你都知道吗?
  2. 关于jsp页面中的pageEncoding和contentType以及html中的meta标签中字符集的设置(转)...
  3. (翻译)Quartz官方教程——第七课:TriggerListeners 和 JobListeners
  4. spring11:为应用指定多个spring配置文件
  5. python项目飞机大战
  6. 文件加密保卫中小企业信息安全
  7. 文件和目录操作命令(19 个)--14.dirname
  8. PostgreSQL在Linux上的RPM和源码安装
  9. 六个重要的.NET概念:栈、堆、值类型、引用类型、装箱和拆箱
  10. 手机影音第十三天,xutils3、Glide的使用获取网络图片;下拉、上滑刷新;缓存网络资源...
  11. Pyspark访问Hbase
  12. Docker安装MySQL教程
  13. python 保证所有数据能够显示,而不是用省略号表示,不以科学计数显示
  14. java基础----java调用oracle存储过程(转)
  15. string数组转换成int数组,数组转字符串,字符串转list,list集合转字符串,删除数组中为空的元素,list转数组 数组转list
  16. gm220s路由器怎么设置_中国移动GM220-S光猫修改为桥接模式并启用IPV6
  17. 怎么样才能防御dos攻击
  18. 数据分析: 线性回归分析之研究二手房价的影响因素,建立房价预测模型
  19. 【java】web在线打开PDF文件
  20. 帧中继网配置实例学习记录

热门文章

  1. Java写入大字符串到oracle数据库_java程序如何提高oracle百万级数据的insert效率
  2. mysql配置管理器在哪_SQL Server 2008配置管理器在哪下载
  3. mysql经常问到的面试题_20道BAT面试官最喜欢问的JVM+MySQL面试题(含答案解析)...
  4. python3串口通信16进制_STM32串口通信——16进制数形式
  5. java boxplot_Matlab Boxplots
  6. OpenGL实现3D魔方游戏源代码
  7. 【AtCoder】AGC034
  8. django orm 操作符
  9. Android学习之图片压缩,压缩程度高且失真度小
  10. Intellij Idea上传本地项目到Git