32单片机按键扫描 实现长短按

key.c

/******************************************************************************************************* @file           key.c* @author         Kyro Qu* @brief          按键驱动代码* 实验平台:       STM32G431RB开发板*****************************************************************************************************/#include "key.h"
#include "lcd.h"
#include "stdio.h"typedef struct
{GPIO_TypeDef *Key_Port;uint16_t Key_Pin;}Key_GPIO_t;static Key_GPIO_t g_KeyList[] =
{{ KEY_B1_GPIO_Port, KEY_B1_Pin },{ KEY_B2_GPIO_Port, KEY_B2_Pin },{ KEY_B3_GPIO_Port, KEY_B3_Pin },{ KEY_B4_GPIO_Port, KEY_B4_Pin }/* add other KEY, ... */
};#define KEY_NUM_MAX  (sizeof(g_KeyList)/sizeof(g_KeyList[0]))typedef enum
{KEY_RELEASE =0,		 /* 释放松开 */KEY_CONFIRM,		 /* 消抖确认 */KEY_SHORT_PRESS,	 /* 短按 */KEY_LONG_PRESS,		 /* 长按 */}KEY_STATE;#define CONFIRM_TIME  10		     /* 消抖时间 ms */
#define LONG_PRESS_TIME  2000		 /* 长按时间窗 ms */typedef struct
{KEY_STATE keyState;			 /* 按键状态 */uint32_t  prvTime;			 /* 按键时间 */	}Key_Info_t;static Key_Info_t g_Key_Info[KEY_NUM_MAX];/*** @brief       扫描单个按键不同状态函数* @param       按键端口号* @retval      键值*/
static uint8_t keyScan(uint8_t keyIndex)
{uint8_t keyPress;keyPress=HAL_GPIO_ReadPin(g_KeyList[keyIndex].Key_Port,g_KeyList[keyIndex].Key_Pin);#if !ElECTRIC_LEVELkeyPress=!keyPress;#endifswitch (g_Key_Info[keyIndex].keyState)								    /* 按键状态机 */{ case KEY_RELEASE :if(keyPress )							            	  /* 如果按下 */													{g_Key_Info[keyIndex].keyState = KEY_CONFIRM;g_Key_Info[keyIndex].prvTime = HAL_GetTick();			/* 获取按下起始时间 */ }break;case KEY_CONFIRM :if(keyPress ){if(HAL_GetTick()-g_Key_Info[keyIndex].prvTime>CONFIRM_TIME ){g_Key_Info[keyIndex].keyState = KEY_SHORT_PRESS;}}else{g_Key_Info[keyIndex].keyState = KEY_RELEASE;}break;case KEY_SHORT_PRESS :if(keyPress ){if(HAL_GetTick()-g_Key_Info[keyIndex].prvTime>LONG_PRESS_TIME ){g_Key_Info[keyIndex].keyState = KEY_LONG_PRESS;}}else										            	/* 如果松开 */ {g_Key_Info[keyIndex].keyState = KEY_RELEASE;return (keyIndex+0x01);							/* 返回短按对应码值  0x01 0x02 0x03 .....    */				}break;case KEY_LONG_PRESS :if(!keyPress )										    	/* 如果松开 */ {g_Key_Info[keyIndex].keyState = KEY_RELEASE;return (keyIndex+0x81);							        /* 返回短按对应码值  0x81 0x82 0x83 .....    */				} break;default:g_Key_Info[keyIndex].keyState = KEY_RELEASE;}return 0;							
}/*** @brief        扫描单个按键 按键的码值* @param        无* @retval       键值*/
uint8_t GetKeyVal(void)
{uint8_t  res = 0; for(uint8_t i=0;i<KEY_NUM_MAX;i++){res = keyScan(i);					    /* 临时保存键值 */if(res!= 0)							/* 返回键值不为0,则跳出 */{break;}}return res;  /* 返回键值 */
}/*** @brief        按键处理函数* @param        无* @retval       无*/void KeyHandler(void)
{uint8_t KEY_STATE;KEY_STATE=GetKeyVal();switch(KEY_STATE){case B1_SHORT_PRESS:break;case B1_LONG_PRESS:break;case B2_SHORT_PRESS:break;case B2_LONG_PRESS:break;case B3_SHORT_PRESS:break;case B3_LONG_PRESS:break;case B4_SHORT_PRESS:break;case B4_LONG_PRESS:break;}
}

key.h

/******************************************************************************************************* @file           key.h* @author         Kyro Qu* @brief          按键驱动代码* 实验平台:       STM32G431RB开发板*****************************************************************************************************/#ifndef __KEY_H
#define __KEY_H#include "main.h"//按键另一端口的电平  1为高电平   0为低电平
#define   ElECTRIC_LEVEL   0/* 键值 */
#define B1_SHORT_PRESS 0x01
#define B1_LONG_PRESS  0x81#define B2_SHORT_PRESS 0x02
#define B2_LONG_PRESS  0x82#define B3_SHORT_PRESS 0x03
#define B3_LONG_PRESS  0x83#define B4_SHORT_PRESS 0x04
#define B4_LONG_PRESS  0x84uint8_t keyScan(uint8_t mode);/* 按键扫描函数 */
uint8_t GetKeyVal(void);
void KeyHandler(void);#endif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/591605.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

序列化和反序列化详解

序列化和反序列化是计算机科学中非常重要的概念&#xff0c;尤其在处理分布式系统、网络通信、数据存储等场景时。下面将详细解释这两个过程&#xff0c;并使用Java语言作为示例。 序列化 (Serialization) 定义&#xff1a;序列化是将数据结构或对象状态转换为可以存储或传输…

Java基础综合练习(飞机票,打印素数,验证码,复制数组,评委打分,数字加密,数字解密,抽奖,双色球)

练习一&#xff1a;飞机票 需求: ​ 机票价格按照淡季旺季、头等舱和经济舱收费、输入机票原价、月份和头等舱或经济舱。 ​ 按照如下规则计算机票价格&#xff1a;旺季&#xff08;5-10月&#xff09;头等舱9折&#xff0c;经济舱8.5折&#xff0c;淡季&#xff08;11月到来…

cloudcompare 编译安装解决无法load pcd文件问题

参考 https://github.com/CloudCompare/CloudCompare/blob/master/BUILD.md sudo apt install libqt5svg5-dev libqt5opengl5-dev qt5-default qttools5-dev qttools5-dev-tools libqt5websockets5-dev git clone --recursive https://github.com/cloudcompare/CloudCompare.g…

Flink学习-处理函数

简介 处理函数是Flink底层的函数&#xff0c;工作中通常用来做一些更复杂的业务处理&#xff0c;处理函数分好几种&#xff0c;主要包括基本处理函数&#xff0c;keyed处理函数&#xff0c;window处理函数。 Flink提供了8种不同处理函数&#xff1a; ProcessFunction&#x…

【algorithm】自动驾驶常见常考的几个模型和推导,顺便总结自己遇到的考题经验不断更新之———控制版

写在前面 本来快达成目标了&#xff0c;没想到公司遭受了问题&#xff0c;公司和同事我感觉还是挺好的&#xff0c;有国企的正规也有小企业的灵活&#xff0c;大家都很有学习欲望。 作为本次再次复习回忆如下&#xff1a; 把之前面试准备的 机器学习&#xff08;基本搬运到CSD…

JVM篇:JVM的简介

JVM简介 JVM全称为Java Virtual Machine&#xff0c;翻译过来就是java虚拟机&#xff0c;Java程序&#xff08;Java二进制字节码&#xff09;的运行环境 JVM的优点&#xff1a; Java最大的一个优点是&#xff0c;一次编写&#xff0c;到处运行。之所以能够实现这个功能就是依…

电脑突然不能使用win+x后的快捷键的解决方法

在一次使用电脑后我习惯性的winxuh进行休眠&#xff0c;但是失败了&#xff0c;我发现winx后并没有出现曾经常用的快捷键方式。 左边图片显示的是正常情况。我遇到的情况是图片右边快捷键位没有了&#xff0c;并且也不能进行快捷操作。 国内的网站我都搜索过了&#xff0c;甚至…

outlook邮箱群发邮件方法?邮箱如何群发?

outlook邮箱群发邮件如何使用&#xff1f;QQ邮箱设置群发的步骤&#xff1f; Outlook邮箱群发邮件&#xff1a;必要性 Outlook邮箱作为全球广泛使用的邮件服务之一&#xff0c;不仅提供了便捷的邮件收发功能&#xff0c;还支持多种附件、日历提醒及强大的联系人管理。Outlook…

Python 实现给 pdf 文件自动识别标题并增添大纲

一、背景&#xff1a; 客户方提供过来一个开放平台的pdf文档&#xff0c;文档里有几十个接口&#xff0c;没有大纲和目录可以定位到具体内容&#xff0c;了解整体的API功能&#xff0c;观看体验极度差劲&#xff0c;所以想使用Python代码自动解析pdf文档&#xff0c;给文档增添…

某人寿保险公司基础架构云化与小机数仓下移实践

随着数据中心 IT 基础架构的不断演进&#xff0c;云计算、大数据、移动互联的需求日益高涨&#xff0c;快速敏捷、易于维护以及扩展性&#xff0c;逐渐成为金融机构在升级数据中心时重点考虑的方面。 某人寿保险公司&#xff08;以下简称“客户”&#xff09;过往采用传统三层架…

PS插件一键生成超治愈向日葵花海

金黄色的向日葵总能给人带来治愈的感觉&#xff0c;仿佛在这里能够疗愈心灵所有的伤口。今天我们通过START AI来生成一片美丽的向日葵花海~ 这是小编使用的关键词&#xff0c;负面词需要填写你不想要拥有的&#xff0c;能够让生成的结果更贴合你的想法 最后的生成效果就如下图…

我的Spring Cloud学习之旅:原因、过程和收获

简介&#xff1a; 在这篇文章中&#xff0c;我将分享我学习Spring Cloud的经验和经历。我将谈到我开始学习Spring Cloud的原因&#xff0c;我是如何进行学习的&#xff0c;以及最终的学习成果。希望通过这篇文章&#xff0c;读者们可以从中获得一些有用的收获和启发。 正文&…

IC工程师级别与薪资是怎样的?资深工程师一文带你了解清楚

入行IC之后&#xff0c;想必大家更关心的就是工程师薪资和级别&#xff0c;因为入行的大多数也是工程师。 国际的一流企业基本上工程师分为以下几个级别&#xff1a;普通工程师&#xff0c;资深工程师&#xff0c;主管工程师&#xff0c;资深主管&#xff0c;总工, 资深总工&am…

电子电器架构(E/E)演化 —— 车载以太网

电子电器架构&#xff08;E/E&#xff09;演化 —— 车载以太网 我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 本文13000字。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 屏蔽力是信息过载时代一…

笔记1:基于锚框(先验框)的目标检测

一、边缘框&#xff08;bounding box&#xff09; 1.1 定义 边缘框&#xff1a;真实标注的物体位置 2.1 表示方式 1、&#xff08;x1,y1)和(x2,y2) 2、&#xff08;x1,y1)和w,h 二、锚框(anchor box)/先验框&#xff08;prior bounding box&#xff09; 2.1 定义 对边缘…

如何高效使用Excel的SUMIF函数:掌握条件求和的技巧

背景&#xff1a; 在日常工作中&#xff0c;我们经常遇到这样的情况&#xff1a;需要根据特定条件对一系列数据进行求和。幸运的是&#xff0c;Excel提供了一个强大的工具来简化这一任务——SUMIF函数。本博客将带你深入了解如何使用SUMIF函数&#xff0c;包括一些实用的示例和…

MySQL5.7服务器 SQL 模式

官网地址&#xff1a;MySQL :: MySQL 5.7 Reference Manual :: 5.1.10 Server SQL Modes 欢迎关注留言&#xff0c;我是收集整理小能手&#xff0c;工具翻译&#xff0c;仅供参考&#xff0c;笔芯笔芯. MySQL 5.7 参考手册 / ... / 服务器 SQL 模式 5.1.10 服务器 SQL 模式…

Django 学习教程- Django模板(Template)

系列 Django 学习教程-介绍与安装-CSDN博客 Django 学习教程- Hello world入门案例-CSDN博客 前言 在上一章节中我们使用django.http.HttpResponse() 来输出 "Hello World&#xff01;"。该方式将数据与视图混合在一起&#xff0c;不符合 Django 的 MTV 思想。 本…

Linux network — 网络层收发包流程及 Netfilter 框架浅析

Linux network — 网络层收发包流程及 Netfilter 框架浅析 1. 前言2. 基础网络知识2.1 网络分层模型2.2 数据包协议分层2.3 sk_buff 结构2.4 收发包整体框架 3. 网络层&#xff08;IPv4&#xff09;收发包流程4. Netfilter 框架4.1 IPv4 网络层的 Netfilter Hook 点4.2 iptable…

算法——队列+宽搜(BFS)

队列这种数据结构大都服务于一个算法——宽搜&#xff08;BFS&#xff09;。宽搜还可以运用到二叉树、图、迷宫最短路径问题、拓扑排序等等 N叉数的层序遍历 N叉树的层序遍历 题目解析 给定一个 N 叉树&#xff0c;返回其节点值的_层序遍历_。&#xff08;即从左到右&#…