使用STM32CubeMX配置工程+MDKARM编写代码实现按键控制

  • 一、按键简介
  • 二、STM32CubeMX配置
  • 三、代码实现

一、按键简介

  轻触式按键开关:按键开关是一种电子开关,属于电子元器件,使用时以满足操作力的条件向开关操作方向施压开关功能闭合接通,当撤销压力时开关即断开,其内部结构是靠金属弹片受力变化来实现通断的。


  连接电路或者导线的时候要注意,斜对角相连可以保证功能正常使用。如果连在①和②两侧则按键常开,失效。
  配合按键帽使用手感更佳。

二、STM32CubeMX配置

  按键和LED不太一样。LED是IO引脚的输出。按键则是IO引脚状态的读取(输入),单片机通过对IO引脚电平状态的识别,来判断按键是否按下。一般也分为共阳或者共阴。也分为独立按键和矩阵按键等等。就不细细展开了。这里用的是独立按键。


  从原子官方提供的原理图可以看出来,KEY0、KEY1 和 KEY2 是低电平有效的,而 KEY_UP 是高电平有效。并且KEY0接PE4、KEY1接PE3、KEY2接PE2、KEY_UP接PA0。
打开STM32CubeMX进行配置引脚。
  设置引脚输入模式为输入模式,WK_AP连接PA0,由于是高电平有效,所以设置默认为下拉。并自定义引脚标签


  KEY0-2这三个引脚的设置是一样的,低电平有效,默认设置为上拉,再自定义标签就可以了。

三、代码实现

  打开由STM32CubeMX生成的工程
  新建key.c和key.h文件。将文件添加到工程
  先来看看.h文件

#ifndef __KEY_H
#define __KEY_H     #include "main.h" //下面的方式是通过直接操作HAL库函数方式读取IO
#define ReadKeyRight    HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_4)  //KEY0按键PE4
#define ReadKeyDown     HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_3)  //KEY1按键PE3
#define ReadKeyLeft     HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_2)  //KEY2按键PE2
#define ReadWK_UP       HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)  //WKUP按键PA0#define KeyRight_PRES    1
#define KeyDown_PRES    2
#define KeyLeft_PRES    3
#define WKUP_PRES       4uint8_t KEY_Scan(uint8_t mode);
void KeyEvent(void);#endif

  采用宏函数编写,IO转态读取。将函数的返回值与键联系起来,每个按键对应一个返回值,编写按键扫描函数KEY_Scan()。再将按键的功能封装起来,编写成一个按键函数KeyEvent()。
  按键扫描函数沿用正点原子的官方函数,这个轮子写的很好了,没必要画蛇添足。

#include "key.h"  //按键处理函数 正点原子的例程
//返回按键值
//mode:0,不支持连续按;1,支持连续按;
//0,没有任何按键按下
//1,WKUP按下 WK_UP
//注意此函数有响应优先级,KEY0>KEY1>KEY2>WK_UP!!
uint8_t KEY_Scan(uint8_t mode)
{static u8 key_up=1;     //按键松开标志if(mode==1)key_up=1;    //支持连按if(key_up&&(ReadKeyRight==0||ReadKeyDown ==0||ReadKeyLeft==0||ReadWK_UP==1)){HAL_Delay(10);key_up=0;if(ReadKeyRight==0)       return KeyRight_PRES;else if(ReadKeyDown ==0)  return KeyDown_PRES;else if(ReadKeyLeft==0)   return KeyLeft_PRES;else if(ReadWK_UP==1) return WKUP_PRES;          }else if(ReadKeyRight==1&&ReadKeyDown ==1&&ReadKeyLeft==1&&ReadWK_UP==0)key_up=1;return 0;   //无按键按下
}//把按键功能集中到这里
//按下左边的按键打开LED0,按下下面的按键关闭LED0
//按下右边的按键打开LED1,按键上面的按键关闭LED1
void KeyEvent(void)
{u8 keyValue=KEY_Scan(0);switch(keyValue){case KeyLeft_PRES:   Led0_On;break;case KeyDown_PRES:  Led0_Off;break;case KeyRight_PRES: Led1_On;break;case WKUP_PRES:     Led1_Off;break;}
}

  修改main.h文件,添加引用

/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __MAIN_H
#define __MAIN_H#ifdef __cplusplus
extern "C" {#endif/* Includes ------------------------------------------------------------------*/
#include "stm32f4xx_hal.h"/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
typedef unsigned char u8; //key.c里面的函数用到了类型u8,所以这里要typedef一下
typedef unsigned int u16;
#include "bit_oper.h"
#include "key.h" //添加有关按键的引用
/* USER CODE END Includes */

  编写main.c文件,修改主函数,添加按键功能,注意要把按键检测的函数放到while(1)循环的内部

int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();/* USER CODE BEGIN 2 */Led0_Light_N(5,500);//LED0以500毫秒间隔闪烁5次Led1_Light_N(5,500);//LED1以500毫秒间隔闪烁5次Beep_On;//蜂鸣器响十秒后关闭for(int i=0;i<10;i++){HAL_Delay(1000);}Beep_Off;/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */KeyEvent();//按键功能,具体看函数内部。}/* USER CODE END 3 */
}

  这样编译再下载运行就可以了,具体实现的功能是LED0以500毫秒间隔闪烁5次、LED1以500毫秒间隔闪烁5次、蜂鸣器响十秒后关闭。
  按键功能是:
    按下左边的按键打开LED0,
    按下下面的按键关闭LED0。
    按下右边的按键打开LED1,
    按键上面的按键关闭LED1。

  感谢各位的浏览。鄙人水平有限,很多地方写的感觉差强人意,如果有不对的地方欢迎指正。

4.STM32F407之HAL库——按键相关推荐

  1. STM32F407霸天虎HAL库学习笔记——串口发送

    STM32F407霸天虎HAL库学习笔记--串口收发 一.软件准备 二.硬件准备 三.CubeMX配置 四.Keil printf重写 main函数 五.实验效果 一.软件准备 软件准备 二.硬件准备 ...

  2. STM32F407霸天虎HAL库CubeMX学习笔记——DS18B20

    STM32F407霸天虎HAL库CubeMX学习笔记--DS18B20 一.软件准备 二.硬件准备 三.CubeMX配置 四.Keil printf重写 tim.c DS18B20.h DS18B20 ...

  3. STM32F407霸天虎HAL库学习笔记——使用ADC采集MQ135的数据并通过OLED显示

    STM32F407霸天虎HAL库学习笔记--使用ADC采集MQ135的数据并通过OLED显示 一.软件准备 二.硬件准备 三.CubeMX配置 四.Keil MQ135.c MQ135.h main函 ...

  4. 2.STM32F407之HAL库——星星点灯

    使用STM32CubeMX配置工程+MDKARM编写代码实现LED灯的控制 一.LED 二.配置STM32CubeMX 三.引脚配置属性详解 四.MDK设置+代码编写 五.下载验证   如何使用STM ...

  5. stm32f407探索者+HAL库+FreeRTOS +FreeRTOS_TCP/IP 移植

    在stm32f4空工程文件夹下创建FreeRTOS文件夹用来存放FreeRTOS源码,将FreeRTOS文件源码中FreeRTOS\Source路径下的全部文件拷贝到新建的FreeRTOS文件夹中. ...

  6. stm32f407关于独立看门狗各种函数(一)(HAL库)

    以下内容全部来自正点原子,本人只是对主要知识点进行整理,方便以后查看. 一.独立看门狗 独立看门狗本质上是一个定时器,这个定时器有一个输出端,可以输出复位信号.该定时 器是一个 12 位的递减计数器, ...

  7. hal库开启中断关中断_[STM32]HAL库下GPIO按键中断与去抖问题分析(分析源码解决问题)...

    自上篇文章STM32 非阻塞HAL_UART_ReceiveIT解析与实际应用,具体总结了HAL库下套娃函数中如何看清库函数的脉络,更细致的认识调用的过程,以解决潜在的问题.又又又遇到了新的问题(GP ...

  8. STM32F407控制AD7606 采用HAL库的TIM和SPI

    前言 本文介绍基于STM32F407的AD7606 8通道同步采集控制方式,总体思路:PWM驱动AD7606完成模数转换,AD7606转换完成后其BUSY引脚给出下降沿,STM32捕获外部中断并在中断 ...

  9. STM32-GPIO学习-跑马灯实验和按键实验-寄存器版本和HAL库版本

    一.stm32跑马灯实验 a.GPIO general purpose input output 通用输入输出端口,可以做输入也可做输出,GPIO端口可通过程序配置成输入或输出. STM32FXXXI ...

最新文章

  1. How to list/dump dm thin pool metadata device?
  2. 深度解析JAVA动态代理设计模式
  3. Python之numpy库
  4. Java:ThreadPoolExecutor解析
  5. qt combox选中消息_Qt+imx6编写的楼宇对讲管理平台
  6. 2017-2018-1 20155339 《信息安全系统设计基础》第三周学习总结
  7. 九阳股份:公司部分产品已开始对接使用华为鸿蒙系统
  8. 使用FragmentPagerAdapter和FragmentStatePagerAdapter时Fragment生命周期区别
  9. codeforces 431 B Shower Line【暴力】
  10. Python3 实现来宾抽签
  11. 【LeetCode】【字符串】题号:*13. 罗马数字转整数
  12. cadence SPB16.6原理图库(.olb)集合的库内容列表2
  13. Solidworks 2015 安装教程
  14. 计算机图形学【GAMES-101】10、材质(BRDF)(折射、菲涅尔项、微表面模型、各向异性材质)
  15. navicat删除注册表文件_如何彻底删除mysql服务(清理注册表)详解
  16. 少儿计算机兴趣小组活动记录,小学美术兴趣小组活动记录
  17. websocket 服务器外网访问
  18. Oracle数据库备份与恢复命令
  19. 程序员,在什么情况下加班是可接受的
  20. 接口测试用例怎么写? 模板示例 2021

热门文章

  1. BT下载会损害硬盘吗?--硬盘的工作原理,硬盘寿命
  2. win10添加自定义右键菜单
  3. Win10桌面图标显示不正常变成了白色
  4. CSDN 学习勋章获得攻略
  5. android+面试题
  6. Excel开发帮助文档查看方法
  7. cocos2d-x 4.0 学习之路(七)场景切换
  8. 免费的文字转语音的软件有哪些
  9. java opencv 实现换脸
  10. Linux下vsftpd服务的部署