当前位置:   article > 正文

STM32之按键输入实验_stm32按键输入

stm32按键输入

**

STM32之如何通过按键控制LED灯和蜂鸣器

**
用到的板子:STM32F103开发板,一共有三个按键:WK_UP、KEY0和 KEY1。
目标:编写通过这三个按键来控制LED灯和蜂鸣器,WK_UP控制蜂鸣器,按下响,在按一次停。KEY1 控制 LED1, 按一次亮, 再按一次灭;KEY0 则同时控制 LED0 和LED1,按下一次,他们的状态就翻转一次。
分析:

既然要通过按键控制,那么先打开原理图,查看三个按键WK_UP、KEY0和 KEY1对应的引脚。如下图:
在这里插入图片描述
在这里插入图片描述

于是可以得知WK_UP接GPIOA引脚,KEY0和 KEY1接GPIOE引脚。查参考手册,如下
在这里插入图片描述

GPIOA、GPIOE挂在RCC寄存器下的APB2上。
那么步骤的第一步就有了,需要调用RCC_APB2PeriphClockCmd()这个函数,来初始化I/O口时钟,将GPIOA和GPIOE对应的时钟使能。第二步则是调用GPIO_Init()这个函数,来配置I/O口,包括配置pin脚,输入方式(上拉还是下拉)。到此关于按键的初始化函数就完成了。
然后题目中,对蜂鸣器、LED灯都是按一次响,在按一次灭,不用连续按,那么就需要写一个函数,即按键扫描函数,来实现这一功能。
按键输入有两种模式,一种为按下按键不松开,LED灯长亮,松开之后,在按一次按键,LED灯熄灭。另一种为按下按键不松开,LED灯一直闪烁(闪烁有可能观察不到,因为程序扫描太快,眼睛跟不上灯变化的速度),松开之后,LED灯可能熄灭,也可能被点亮。这在程序中通过设置mode ,若mode=0,则符合第一种,若mode=1,则符合第二种。
另外根据如下电路原理图,可以发现,KEY0 和 KEY1 是低电平有效的,而 WK_UP 是高电平有效。同时还发现这些按键都没有上\下拉电阻,这样容易导致电平不稳定,故还需要设置上\下拉电阻。根据此电路图WK_UP左端接低电平,故需要接下拉电阻。KEY0 和 KEY1左端接高电平,故需要接上拉电阻。那什么叫上\下拉电阻呢?(见文末)
在这里插入图片描述

下面便是编写程序。
1、新建一个工程文件,将所需要的各个头文件包含进去。
2、在工程文件夹中新建一个文件夹—HARDWARE(名字可任取),然后在其中新建key文件夹,当然由于这个实验用到了LED灯和BEEP蜂鸣器,故需要将以前编写的LED灯和BEEP蜂鸣器的文件夹复制过来,最终需要在主程序中用到它们的源文件。
3、打开 xxx.uvprojx 工程文件,新建 key.c 和 key.h,保存至 key 文件夹中。key.c文件目的是建立一个初始化函数(即上文提到的第一、二步)和建立一个按键扫描函数。而 key.h 文件则是 key.c 文件的头文件,声明源文件中的两个函数,并且进行一些宏定义(见程序)。
4、将key.c文件添加到HARDWARE- key 文件夹中,将key.h 文件的路径添加到 HARDWARE-BEEP 文件夹中。
5、编写key.h代码

#ifndef __KEY_H
#define __KEY_H
#include "sys.h"

#define KEY0  GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)
//(宏定义:读取按键0的端口和引脚的电平,并用KEY0表示)
#define KEY1  GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)
//(读取按键1的端口和引脚的电平,并用KEY1表示) 
#define WK_UP   GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)
//(读取按键up的端口和引脚的电平,并用WK_UP表示) 
 
#define KEY0_PRES  1  
//宏定义:用KEY0_PRES表示1,目的是增加程序可读性,在key.c程序中代表KEY0 按下 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/527062
推荐阅读
相关标签
  

闽ICP备14008679号