实验 5 STM32单片机实现按键功能
前面几章,我们介绍了 STM32 的 IO 口作为输出以及系统时钟的使用,这
一章,我们将向大家介绍如何使用 STM32 的 IO 口作为输入用。在本章中,我
们将利用板载的 4 个按键,来控制板子上的 4 个 LED。 通过本章的学习, 你
将了解到 STM32 的 IO 口作为输入口的使用方法。 本章分为以下学习目标:
1、了解按键输入的原理。
2、了解 STM32 的输入模式。
1.1 硬件电路设计
通过前面的学习,我们学会了如何使用 GPIO 输出模式,接下来,我们来学
习怎么使用 GPIO 的输入模式。 首先我们来看在我们开发板上面按键的原理图。
通过上面的原理图,我可能看到四个按键分别接到单片机的 PA0、 PE2、
PE3、PE4。
1.2 按键消抖
通常的按键所用开关为机械弹性开关,当机械触点断开 、闭合时,电压信号 如
下图:
由于机械点的弹性作用,一个按键开关在闭合时不会马上稳定的接通,在断
开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动。抖动
时间的长短由按键的机械特性决定的,一般为 5ms 到 10ms。按键稳定闭合时间
的长短则由操作人员的按键动作决定的,一般为零点几秒至数秒。按键抖动会引
起按键被误读多次。为了确保 CPU 对键的一次闭合仅作一次处理,必须去除按
键抖动。一般来说一个简单的按键消抖就是先读取一次按键的状态,如果得到按
键按下之后,延时 10ms,再次读取一次按键的状态,如果按键还是按下状态,
那么说明按键已经按下。
1.3 V3.5 库函数输入函数介绍
在第一章 LED 灯中我们已经介绍了,STM32 的 IO 口配置方式了,那么这
里 我们就不在作介绍了,我们直接介绍库函数中的输入读取函数。 输入读取函
数有多个函数,详细大家可以查看《STM32 固件库使用手册(中 文 翻 译
版 ).pdf 》, 在 这 里 我 们 简 单 介 绍 一 个 要 用 到 的 输 入 函 数
GPIO_ReadInputDataBit()函数:
这个函数是读取一个设置为输出模式时,一个 IO 口的状态值。当读取的 IO 口
为 1 的时候,输出 1,当 IO 口输出为 0 的时候,输出 0。
- /*******************************************************************************
- *
- --------------------------------------------------------------------------------
- * 实 验 名 : 按键实验
- * 实验说明 : 按键按下点亮D1-D4对应LED灯
- * 连接方式 :
- * 注 意 : 所用函数在systick.c和led.c,key.c文件内
- *******************************************************************************/
- #include "public.h"
- #include "led.h"
- #include "key.h"
- #include "systick.h"
- /*******************************************************************************
- * 函 数 名 : key_pros
- * 函数功能 : 按键处理函数,判断按键按下控制对应的LED灯
- * 输 入 : 无
- * 输 出 : 无
- *******************************************************************************/
- void key_pros() //按键处理函数
- {
- if(k_up==1) //判断按键k_up是否按下
- {
- delay_ms(10); //消抖处理
- if(k_up==1) //再次判断按键k_up是否按下
- {
- GPIO_Write(GPIOC,(u16)0xfe);
- }
- while(k_up); //等待按键松开
- }
- if(k_down==0)
- {
- delay_ms(10);
- if(k_down==0)
- {
- GPIO_Write(GPIOC,(u16)(0xfd));
- }
- while(!k_down);
- }
- if(k_left==0)
- {
- delay_ms(10);
- if(k_left==0)
- {
- GPIO_Write(GPIOC,(u16)(0xfb));
- }
- while(!k_left);
- }
- if(k_right==0)
- {
- delay_ms(10);
- if(k_right==0)
- {
- GPIO_Write(GPIOC,(u16)(0xf7));
- }
- while(!k_right);
- }
- }
- /****************************************************************************
- * Function Name : main
- * Description : Main program.
- * Input : None
- * Output : None
- * Return : None
- ****************************************************************************/
- int main()
- {
- LED_Init(); //LED初始化
- key_init(); //按键端口初始化函数
- GPIO_Write(GPIOC,(u16)(0xff));
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
下载:
32单片机实现按键功能.zip
(2.85 MB, 下载次数: 84)
|