使用STM32GPIO读取按键实现按键操作

发布者:数字之舞最新更新时间:2018-07-07 来源: eefocus关键字:STM32  GPIO  读取按键  按键操作 手机看文章 扫描二维码
随时随地手机看文章

一、开发板按键设置

    在"STM32-PZ6806L"开发板上除了复位按键外,还设计了4个按键,分别标为"UP"、"DOWN"、"LEFT"和"RIGHT",其电路如下:

根据电路连接得知K_UP按键一端与GPIOA_0连接,另一端通过一个1KΩ电阻接3.3V,所以在对GPIOA_0配置时应设置工作方式为“下拉输入”,当按键松开时为低电平,按键按下时为高电平;K_LEFT、K_DOWN和K_RIGHT三个按键的一端分别与GPIOE_2、GPIOE_3和GPIOE_4相连,另一端接地,所以对GPIOE_2、GPIOE_3和GPIOE_4要配置为“上拉输入”方式,按键松开时为高电平,按键按下时为低电平。

二、项目基本配置

该项目在音乐播放项目基础上设计。实现分别按这四个键时,蜂鸣器发出不同的声音。音乐播放项目实现参看:使用STM32控制无源蜂鸣器发声播放音乐(STM32_07)

1、复制pMusic项目文件夹,将文件夹改名为"pKey";

2、在"pKey/User"文件夹下新建"Key"文件夹;

3、使用"Keil uVision5"打开"pKey"文件夹下的项目"pMusic"(项目名称没有改变);

4、新建"key.h"和"key.c"文件,保存在"pKey/User/Key"文件夹中;

5、将"key.c"文件添加到项目的"User"组中;

6、配置项目,在"C/C++"选项卡中的"Include Paths"中添加对".\User\Key"路径的包含,便于其他程序包含"key.h"头文件时,系统能找到。

三、编程实现按键功能

1、"key.h"头文件程序

在头文件中定义按键GPIO端口宏、按键引脚宏和读取引脚值的宏,定义Key_Init和ReadKey两个函数的声明。内容如下:


#ifndef __KEY__H

#define __KEY__H

#include "system.h"

#include "stm32f10x_gpio.h"

#define KEY_UP_PORT                         GPIOA

#define KEY_OTHER_PORT        GPIOE

#define KEY_UP                                               GPIO_Pin_0

#define KEY_LEFT                                 GPIO_Pin_2

#define KEY_DOWN                              GPIO_Pin_3

#define KEY_RIGHT                              GPIO_Pin_4

//使用库函数方式读取按键

#define K_UP                                           GPIO_ReadInputDataBit(KEY_UP_PORT, KEY_UP)

#define K_LEFT                                       GPIO_ReadInputDataBit(KEY_OTHER_PORT, KEY_LEFT)

#define K_DOWN                                      GPIO_ReadInputDataBit(KEY_OTHER_PORT, KEY_DOWN)

#define K_RIGHT                                      GPIO_ReadInputDataBit(KEY_OTHER_PORT, KEY_RIGHT)

void Key_Init(void);

u8 ReadKey(u8 mode);

#endif

2、"key.c"程序文件程序

"Key_Init"函数实现对GPIOA和GPIOE的使能,配置GPIOA_0为下拉输入方式,配置GPIOE_2、GPIOE_3和GPIOE_4为上拉输入方式。"ReadKey"函数实现按键扫描,通过参数"mode"选择单次扫描(mode=0, 按键从按下到松开为一次按键)和连续扫描(mode=1,按键按下时到松开可以被视为多次按键)。

#include "key.h"

#include "stm32f10x_Rcc.h"

#include "SysTick.h"

void Key_Init()

{

         GPIO_InitTypeDef GPIO_mode;

         //使能GPIOA和GPIOE时钟

         RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOE, ENABLE );    

         GPIO_mode.GPIO_Mode = GPIO_Mode_IPD;

         GPIO_mode.GPIO_Pin = KEY_UP;

         GPIO_mode.GPIO_Speed = GPIO_Speed_50MHz;

         GPIO_Init(KEY_UP_PORT,&GPIO_mode);

        

         GPIO_mode.GPIO_Mode = GPIO_Mode_IPU;

         GPIO_mode.GPIO_Pin = KEY_DOWN|KEY_LEFT|KEY_RIGHT;

         GPIO_mode.GPIO_Speed = GPIO_Speed_50MHz;

         GPIO_Init(KEY_OTHER_PORT,&GPIO_mode);

}

/*

mode=0--单次扫描

mode=1--连续扫描

*/

u8 ReadKey(u8 mode)

{

         static u8 key = 1;

         if(key==1&&(K_UP==1||K_DOWN==0||K_LEFT==0||K_RIGHT==0))

         {

                   delay_ms(10);

                   key = 0;

                   if(K_UP==1)

                   {

                            return 1;

                   }

                   else if(K_DOWN==0)

                   {

                            return 2;

                   }

                   else if(K_LEFT==0)

                   {

                            return 3;

                   }

                   else if(K_RIGHT==0)

                   {

                            return 4;

                   }

         }

         else if(K_UP==0&&K_DOWN==1&&K_LEFT==1&&K_RIGHT==1)//按键松开

         {

                   key = 1;

         }

         if(mode==1)

         {

                   key = 1;

         }

         return 0;

}

3、"main.c"程序

在主函数中,首先初始化SysTick、蜂鸣器IO口、Key按键IO口,然后反复读取按键,根据按键值调用"beep.c"中的Sound函数实现发声。程序如下:

#include "beep.h"

#include "SysTick.h"

#include "key.h"

int main()

{

         u8 key, i;

         u16 tone[] = {0,262,294,330,349};

         SysTick_Init(72);

         BEEP_Init();

         Key_Init();

         while(1)

         {

                   key = ReadKey(0);

                   if(key!=0){

                            for(i=0; i<100;i++)

                                     Sound(tone[key]);

                   }

         }

}

4、下载hex文件到开发板,按"UP"、"DOWN"、"LEFT"和"RIGHT"能听到蜂鸣器发出Do,Re,Mi,Fa的声音。


关键字:STM32  GPIO  读取按键  按键操作 引用地址:使用STM32GPIO读取按键实现按键操作

上一篇:对于STM32 GPIO模式不理解造成的问题解释
下一篇:关于STM32中GPIO的8种工作模式

推荐阅读最新更新时间:2024-03-16 16:08

STM32汇编指令(一)WFI 和 WFE
ARM汇编的调用 嵌入式开发,尤其是编写BSP的时候,非常接近底层,这个时候有可能用一些汇编指令来保证程序的简洁和高效,但是平常编写代码用到的都是C/C++,那么如何使用汇编指令呢? 其实这个问题也很简单,在C/C++中提供了关键字asm或者ASM来内嵌汇编,使用如下: asm( WFI ); 但是这种方法问题比较大,在Cortex-M平台上,这个语句有很大几率编译不通过,因为各家编译器又实现了自己的宏,具体可以在core_cmx.h中看到,如果我们的项目要在不同的编译器上通过,可以考虑使用条件编译来达标,不过这样付出的成本就很大。 另外一种简单的方法是使用intrinsic.h这个头文件,这个头文件把所有的汇编
[单片机]
ucosii在stm32上的移植详解4
详解3中有一个问题还没解释,就是stm32f10x_it.c中已经有SysTick中断函数的定义SysTick_Handler(),为什么官方版非要弄个OS_CPU_SysTickHandler()。答案就在启动文件上,一般我们自己开发基于stm32芯片的软件,都会使用标准外设库CMSIS中提供的启动文件,而官方移植的启动文件却是自己写的,在两个文件init.s,vectors.s中(Micrium\Software\EvalBoards\ST\STM3210B-EVAL\RVMDK)。init.s负责进入main(),vectors.s设置中断向量。OS_CPU_SysTickHandler和OS_CPU_PendSVHand
[单片机]
意法完成STM32微控制器底层软件部署
   意法半导体 (ST)完成了将其免费底层应用程序编程接口(Low-LayerApplicationProgrammingInterface,LLAPI)软件,导入支持所有的 STM32 微控制器(MCU)的 STM32 Cube软件包中。LLAPI软件让专业的开发人员,能够在方便好用的STMCube环境内开发应用,使用ST验证的软件,对最低到寄存器级的代码进行优化,从而缩短产品上市时间。下面就随嵌入式小编一起来了解一下相关内容吧。   在所有的 STM32 Cube组合内,整合LLAPI和硬件抽象层(HardwareAbstractionLayer,HAL)软件,让开发人员能够完全自由地选择外部周边的控制方式。他们可以选择利
[嵌入式]
STM32的ADC输入通道配置
STM32中最多有3个ADC模块,每个模块对应的通道不完全重叠。 下图是STM32F103CDE数据手册中的总框图的左下角,图中可以看出有8个外部ADC管脚分别接到了3个ADC模块,有8个外部ADC管脚只分别接到了2个ADC模块,还有5个外部ADC管脚只接到了ADC3模块,这样总共是21个通道。 下表是这些ADC管脚与每个ADC模块的对应关系,表中可以看出ADC1还有2个内部通道,分别接到内部的温度传感器和内部的参照电压:
[单片机]
<font color='red'>STM32</font>的ADC输入通道配置
STM32-点亮LED灯(GPIO配置)
点亮LED灯应该是每一人学习硬件的第一个实验了吧!从51到32在到ARM,废话少说,下面开始使用STM32点亮LED灯。 GPIO:又叫通用输入输出口,是微控制器必不可少的外设单元,用来和外界进行信号传递,数据交互的接口。 STM32的GPIO根据型号的不同分为A-H组,每一组都称为GPIOx组,每组都有独立的寄存器,因为相对于寄存器,函数版的使用还是比较容易入门的,尤其是有些编程基础的人来讲,但是寄存器是不可以忽视的,学会了基础的函数操作还是要回头去看看具体寄存器是如何运行的,这点很重要,高手和菜鸟的区别吧! STM32的GPIO还具有十分强大复用功能,这点以后会介绍和使用到。现在就把它的GPIO当成一个可输出高低电平的引
[单片机]
STM32-点亮LED灯(<font color='red'>GPIO</font>配置)
LPC1766 GPIO输入和输出
前些时间玩了下STM32,感觉不错,资源和功能丰富,用起来挺顺手的。和51根本不是一个档次的,用过后决定专用RAM-M3核心的嵌入式MCU。唯一不足就是STM32的固件库用的不爽,入手直接操作寄存器(51带来的影响)。但是又发现STM32的外部模块操作起来非常困难尤其是I2C,根本就是不能用。 今天入手了LPC1766,完全的寄存器操作和比较了STM32,LPC比较合适直接寄存器操作。今天学习成果如下(基于周立功LPC1766板): /****************************************Copyright (c)**********************************************
[单片机]
STM32窗口看门狗WWDG复位
STM32除了有一个独立看门狗外,还有一个窗口看门狗。窗口看门狗当然也能复位MCU,但是与独立看门狗复位不同。首先,窗口看门狗所需要的时钟源来自PCLK2,它时钟是经过PCLK2的4096分频后得到的,能够提供准确的计数。其次,复位的条件有要求:(1)当减计数器的值小于0x40,则产生复位;(2)当减计数值在窗口外被重新装载,则复位。接着,窗口看门狗的计数值与窗口值都只有7位,所以变化范围在0~127之间。还有,装载值一定要大于0x3F,否则就失去了看门狗的功能。 窗口看门狗,它的 窗口 可以有下图体现出来: 图中W 表示窗口值,当看门狗的减计数器不断递减,只有计数值到达窗口值与0x3F之间的时候 喂狗 ,才不会发生复位,
[单片机]
<font color='red'>STM32</font>窗口看门狗WWDG复位
在单片机上实现动态加载功能
本项目是一个在单片机(如:STM32)上实现动态加载功能的函数库,与Windows中的dll,Linux中的so类似,可以将代码动态地从其他的存储介质,动态加载到RAM中。 软件架构 本项目文件夹有三个,其中common存储了用于生成可重定位的.axf文件的工程与动态加载器工程交互用的函数,src提供动态加载器的源码,rel_axf_project_template提供了一个简单的可重定位的.axf文件的工程示例,example.c是一个简单的使用示例,所有文件的主要功能如下: /common/dl_extern_lib.h 描述了app程序用于调用host程序的函数向量表的基地址,以及相关的一些宏定义 /common/dl_
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved