使用STM32GPIO读取按键实现按键操作(STM32_08)

发布者:cw57324588最新更新时间:2019-05-29 来源: 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"中添加对".UserKey"路径的包含,便于其他程序包含"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_08)

上一篇:STM32外部中断方式按键操作(STM32_09)
下一篇:在STM32项目中使用SysTick实现延时(STM32_06)

推荐阅读最新更新时间:2024-11-09 10:17

基于stm32的FSK调制解调器的设计
大致要求:设计一个FSK调制解调器,基带信号码速率为2000B/s,载波速率为4khz和8khz,解调信号要能完整还原基带信号。实现方法多种多样,通信领域内调制解调器的设计大多数用的都是硬件电路,鉴于笔者对编程情有独钟(其实笔者还是懂一点电路设计知识的~),所以最终决定用stm32来设计,纯编程实现。看起来高大上,但实际做起来不难,不过有挺多东西要考虑的。 总的设计思路如下: 首先是基带信号的产生,它也是我们要调制和解调的目标。基带信号由一连串随机的码元序列构成,为了模拟随机的码元序列,笔者用定时器设计8位的PN码序列,码元速率为2000B/s。定时器3定时0.5ms,每进入一次中断,变量num加一,设置一次IO引脚电平,
[单片机]
基于<font color='red'>stm32</font>的FSK调制解调器的设计
stm32 PWM产生
/* TIM Configuration */ TIM_Config(); TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); TIM_OCStructInit(&TIM_OCInitStructure); /* --------------------------------------------------------------------------- TIM8 is configured to generate an Asymetric signal with a programmable Phase-Shifted si
[单片机]
STM32调试步骤
调试前,首先跳线J9的2-3脚短接,跳线J4的右边两个脚短接,跳线J5短接,J8短接,J2的1-2短接,3-4短接。 将Jlink与学习板,USB延长线与学习板,串口延长线与学习板(或者USB转串口线与学习板)连接起来, 这时LED灯LED5,LED6都应该点亮,如果不亮,说明板子有问题。 打开串口助手,按照如下设置: 1、从桌面打开J-Flash ARM V4.02如图所示。 也可以按照如下顺序打开J-Flash ARM 。 “开始à程序àSEGGERàJ-Link ARM V4.02àJ-Flash ARM”,如下图所示。 2、打开J-Flash ARM后,先进行芯片选项设置,打开OptionsàProje
[单片机]
<font color='red'>STM32</font>调试步骤
基于STM32设计的数显热水器
一、项目介绍 当前介绍的项目是基于 STM32F103ZET6 系列 MCU 设计的数显热水器,通过显示屏来显示热水器的温度及其工作状态,通过 PT100 传感器来检测热水器的温度变化,并通过电加热片实现加热过程,以达到控制热水器温度的目的。 二、设计流程 2.1 硬件选型 STM32F103ZET6 系列 MCU OLED 显示屏 PT100 温度传感器 电加热片 继电器 2.2 软件设计 (1)显示屏 使用 OLED 显示屏来显示热水器的温度及其工作状态,通过 SPI 接口与 STM32 芯片进行通讯。设计温度值及其单位、热水器工作状态等。 (2)温度传感器 使用 PT100 温度传感器来检测热水器内部温度
[单片机]
stm32单片机pwm设置与实际输出频率不一致
背景:一个驱动板,硬件那边的人帮我焊接,给我焊出一堆问题来。后面我特地连教带把关弄焊接,板子是能工作了,但是输出频率不对。特此记录问题以及结果: 1.单片机驱动板的外部晶振在外发的板厂贴错了90度,导致外部晶振起不来 2.但stm32单片机内部也有一个8mhz晶振,因此单片机还是能工作的 3.并且串口还能正常按配置的速率进行通信,这个要去研究串口配置库函数void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct)怎么写的,如图1,我大概看了一眼,库函数里面,对串口速率的配置是按apbclock的实际值来倒算分频因子进行配置的,因此不受前面s
[单片机]
<font color='red'>stm32</font>单片机pwm设置与实际输出频率不一致
STM32 HAL库I2C读写操作笔记
I2C写数据: I2C写数据时用 HAL_I2C_Master_Transmit 函数,函数参数信息如下: HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout) **DevAddress: **7bit从机地址左移 + 1bit 0 pData: 要发送的数据,数据存储规则是大端方式,即数据发送先发pData ,再发pData ,再发pData ,以此类推。如下代码,addr=0x01, data=0
[单片机]
<font color='red'>STM32</font> HAL库I2C读写<font color='red'>操作</font>笔记
STM32串口中断及DMA接收常见的几个问题
今天再给大家分享一些关于STM32串口中断及DMA接收常见的几个问题。 UART串口中断接收 使能UART串口中断之后,有接收到UART数据,进入中断,此时要清除RXNE接收标志位: 1)通过软件向该RXNE标志位写入零来清零; 2)通过对 USART_DR 寄存器执行读入操作将该位清零。 这里可以查看对应《参考手册》,一般我们选择第2种,通过读取UART串口数据来清零。 1、中断接收数据丢失 在UART串口中断函数中,或者更高优先级中断函数中长时间执行,导致接收丢失,所以,请勿在中断函数中长时间执行。 特别有些人,还在中断函数添加延时函数。实际应用中,只要不是特殊情况,比如测试某个功能可以添加延时函数,都不建议在中断函数添加延时
[单片机]
<font color='red'>STM32</font>串口中断及DMA接收常见的几个问题
UCGUI在STM32平台移植经验(无操作系统)
ucgui 移植的前提是已经具备了LCD驱动函数,已经能够实现点亮LCD屏幕,并实现画点以及获取指定点颜色值的功能。一般的显示屏供应商会提供对应的驱动函数。主要有初始化函数void LCD_Init(),屏幕画点函数 Void LCD_DrawPoint(u16 x,u16 y,u16 color),以及获取指定点颜色值的U16 LCD_ReadPoint(u16 x,u16 y)函数。移植的关键在于把这三个函数与ucgui提供的接口函数匹配。 打开GUILCDDriver中的LCDDummy.c文件,找到int LCD_L0_Init(void)初始化函数,LCD_L0_SetPixelIndex(int x, int y,
[单片机]
UCGUI在<font color='red'>STM32</font>平台移植经验(无<font color='red'>操作</font>系统)
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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