第7章《Stm32CubeMX+Proteus仿真入门》--独立按键扫描

本章节资料下载链接:

我用夸克网盘分享了「第7章 独立按键扫描」,点击链接即可保存。打开「夸克APP」,无需下载在线播放视频,畅享原画5倍速,支持电视投屏。

链接:https://pan.quark.cn/s/c2182510a54e

第 七 章

1、独立按键

1.1 按键介绍

按键是一种电子开关,使用时轻轻按开关按钮就可使开关接通,当松开手时, 开关断开。按键内部简易图如下图所示:

按键管脚两端距离长的表示默认是导通状态,距离短的默认是断开状态, 如果按键按下,初始导通状态变为断开,初始断开状态变为导通。通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,电压信号如下图所示。

由于机械点的弹性作用,按键开关在闭合时不会马上稳定的接通,在断开时也不会一下子断开,因而在闭合和断开的瞬间均伴随着一连串的抖动。一般在代码需要添加消抖操作保证按键识别正确。

单片机常用的软件去抖动方法:

1,先设置 IO 口为高电平,外部上拉10K或者设置上拉输出模式。

2,读取 IO 口电平确认是否有按键按下。

3,如有 IO 电平为低电平后,延时几个毫秒。

4,再读取该 IO 电平,如果仍然为低电平,说明按键按下。

5,执行按键控制程序。

独立按键电路构成是由各个按键的一个管脚连接在一起接地,按键其他引脚分别接到单片机 IO 口。

1.2 硬件设计

PA0和PA1接到LED灯,按键外接上拉电阻分别接到PA12-PA15,分别取别名为KEY4-KEY1。LED灯控制脚设置为推挽输出,按键控制脚设置为上拉输入。4 个独立按键的控制管脚连接到单片机的PA12-PA15脚上且接外部上拉电阻。其中 K1 连接在PA15上,K2 连接在PA14上,K3 连接在PA13上,K4 连接在PA14上。4 个按键另一端全部连接在 GND,当按键按下后,对应 IO 口即为低电平。

1.3 工程代码配置

复制第9章工程文件,修改为Jsmcu_P02_KEY,添加key.c和key.h到工程路径下Public下,新增方法如9.3所示,此处不在赘述。

按键配置为上拉输入,分别自定义KEY1-KEY4,LED灯配置为推挽输出,分别自定义名称为LED0和LED1。点击生成代码。

打开工程文件,key.c代码:

复制代码
#include "key.h"
#include "system.h"

/*******************************************************************************
* 函 数 名         : KEY_Scan
* 函数功能		   : 按键扫描检测
* 输    入         : mode=0:单次按下按键
					 mode=1:连续按下按键
* 输    出         : 0:未有按键按下
					 KEY1_PRESS:KEY1键按下
					 KEY2_PRESS:KEY2键按下
					 KEY3_PRESS:KEY3键按下
					 KEY4_PRESS:KEY4键按下
*******************************************************************************/
u8 KEY_Scan(u8 mode)
{
	static u8 key=1;
	
	if(mode==1) //连续按键按下
		key=1;
	if(key==1&&(KEY1==0||KEY2==0||KEY3==0||KEY4==0)) //任意一个按键按下
	{
		HAL_Delay(10);  //消抖
		key=0;
		if(KEY1==0)
			return KEY1_PRESS; 
		else if(KEY2==0)
			return KEY2_PRESS; 
		else if(KEY3==0)
			return KEY3_PRESS; 
		else if(KEY4==0)
			return KEY4_PRESS; 
	}
	else if(KEY1==1&&KEY2==1&&KEY3==1&&KEY4==1)    //无按键按下
		key=1;
	return 0;
}

key.h代码:

复制代码
#ifndef _key_H

#define _key_H

#include "system.h"

 

//使用位操作定义

#define KEY1  PAin(15)

#define KEY2  PAin(14)

#define KEY3  PAin(13)

#define KEY4  PAin(12)

 

#define LED1  PAout(0)  

#define LED2  PAout(1)

 

//定义各个按键值  

#define KEY1_PRESS   1

#define KEY2_PRESS  2

#define KEY3_PRESS  3

#define KEY4_PRESS  4

 

u8 KEY_Scan(u8 mode);

 

#endif

main.c添加代码段

USER CODE BEGIN Includes和USER CODE END Includes之间添加:

复制代码
/* USER CODE BEGIN Includes */
#include "System.h"
#include "key.h"
/* USER CODE END Includes */

while函数部分修改为:

复制代码
/* USER CODE BEGIN Includes */
#include "System.h"
#include "key.h"
/* USER CODE END Includes */
while函数部分修改为:
 /* USER CODE BEGIN WHILE */
		u8 key=0;
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		key=KEY_Scan(0);   //扫描按键
		switch(key)
		{
			case KEY1_PRESS: LED1=0;break;    //点亮D1指示灯
			case KEY2_PRESS: LED1=1;break;    //熄灭D1指示灯
			case KEY3_PRESS: LED2=0;break;    //点亮D2指示灯
			case KEY4_PRESS: LED2=1;break;    //熄灭D2指示灯
		}	

  }
  /* USER CODE END 3 */
}

实验现象:KEY4控制LED1熄灭,KEY3控制LED1点亮

KEY2控制LED0熄灭,KEY1控制LED0点亮

相关推荐
发发就是发1 天前
USB系统架构概述:从一次诡异的枚举失败说起
驱动开发·单片机·嵌入式硬件·算法·fpga开发
发发就是发1 天前
TTY子系统与线路规程:那个让我深夜抓狂的串口“丢包”问题
linux·服务器·驱动开发·单片机·嵌入式硬件
RFCEO1 天前
Rust编程基础课 第1课时:Rust简介与环境搭建 STM32 RUST嵌入式编程实战
stm32·嵌入式硬件·rust·probe-rs·rust工具链·rustup、cargo·stm32 rust适配
少年、潜行1 天前
【代码开源】基于STM32的智能路灯控制系统设计
stm32·嵌入式硬件·开源·智能路灯
wotaifuzao1 天前
深度解析:NFC、UWB与BLE技术的演进、核心技术与“无感交互“融合应用展望
嵌入式硬件·交互·ble·uwb·nfc·数字钥匙
修勾勾L1 天前
OneNet平台生成token注意事项
stm32·物联网
玩转单片机与嵌入式1 天前
一个成熟的嵌入式AI系统,是长什么样子的?
人工智能·单片机·嵌入式硬件·嵌入式ai
玩转单片机与嵌入式2 天前
不会 Python、不会深度学习,也能在STM32上跑AI模型吗?
人工智能·单片机·嵌入式硬件·嵌入式ai
jghhh012 天前
基于STM32的桌面Mini时钟设计
stm32·单片机·嵌入式硬件
电化学仪器白超2 天前
小乌龟Git全程图形化操作指南:嵌入式本地版本管理与Gitee私有云备份实战
git·python·单片机·嵌入式硬件·物联网·gitee·自动化