2021-10-23_a1240563221的博客-程序员秘密

技术标签: stm32  嵌入式硬件  单片机  

STM32单片机按键输入及长按短按实现-萌新记录笔记-按键

测试了H750开发板的按键实现,不采用外部中断的方式,通过轮询的方法实现了按键输入检测。
1.将按键配置为GPIO_input模式,使能上拉
按键检测时需要注意:检测时要注意按键抖动造成的影响,抖动一般为5-10ms,所以在大多数按键检测中都不是直接读取IO的电平状态,需要消除按键抖动造成的影响后,才能执行相应的按键功能。
常用的按键消抖方法:
1.检测到IO口点评变化后,延迟20ms,再次读取电平状态,若维持电平变化,则判定此次按键有效。
2.检测到IO口电平变化后,延时1ms,循环检测20次,20次后,若按键依然按下,则判定按下有效。
3.检测到IO口电平变化后,定时1ms后再次检测,循环20次,若20次后按键依然按下,则判定按下有效。
程序实现为:
定义结构体:
typedef struct
{
uint8_t Num; //按键号
uint8_t State; //按键状态
uint8_t Num_Last; //上一次检测按键号
uint8_t Shake_LastNum; //消抖
uint32_t Key_Delay_Cnt; //延时次数
}KEY;

//按键号读取
uint8_t keyread(void)
{
if(HAL_GPIO_ReadPin(KEY2_GPIO_Port,KEY2_Pin) == RESET)
{
return 2;
}

if(HAL_GPIO_ReadPin(KEY3_GPIO_Port,KEY3_Pin) == RESET)
{
	return 3;
}

if(HAL_GPIO_ReadPin(KEY4_GPIO_Port,KEY4_Pin) == RESET)
{
	return 4;
}
return 0;

}

//按键扫描
void keyscan(void)
{
uint8_t currentkey;
HAL_Delay(1);
currentkey = 0;
currentkey = keyread();
if((KeyInfo.Shake_LastNum == currentkey) && (currentkey != 0))
{
KeyInfo.Key_Delay_Cnt++;
if(KeyInfo.Key_Delay_Cnt > KEY_SHAKE_DELAY)
{
KeyInfo.Key_Delay_Cnt = KEY_SHAKE_DELAY+1;
KeyInfo.State = Key_KEEP;
}

	if(KeyInfo.Key_Delay_Cnt == KEY_SHAKE_DELAY)
	{
		KeyInfo.Num = KeyInfo.Shake_LastNum;
		KeyInfo.State = Key_DOWN;
	}
}
else
{
	KeyInfo.Key_Delay_Cnt=0;
	KeyInfo.Num = 0;
	KeyInfo.State = Key_UP;
	goto KEY_END;
}
KEY_END:
KeyInfo.Shake_LastNum = currentkey;

}

main或者在thread中执行相应按键功能。

长按短按实现的方法就在按键延时计数成员上,通过判断计数值的大小,判断本次按键是长按还是短按,继而执行相应功能。
ps:cubemx是真香啊,配置无敌,以前那种库函数配啊配的烦死了,就喜欢这种简单粗暴点点点的配置方法。
萌新记录笔记。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/a1240563221/article/details/120921348

智能推荐

SpringMVC_1_dflq17793的博客-程序员秘密

MVC:next:SpringMVC_2_实操Controller---1-2前端控制器---------------------------------------------------------Front controller:分发调度---1-3 MVC概念------------------------------------------------...

Geoserver图层SLD样式编辑问题_DXnima的博客-程序员秘密_sld 在线编辑

一、线上地图样式 SLD:风格化图层描述器(Styled Layer Descriptor)的简称,是2005年OGC提出的一个标准样式层描述符,这个标准在一定条件下允许WMS服务器对地图可视化的表现形式进行扩展。在没有SLD之前,只能使用一些已经在服务器上规定好的样式来对地图进行可视化。而当使用了实现了SLD标准之后,它允许我们从客户端来对地图进行定义自己的样式,分级显示等操作,极大的扩展了地图可视化的灵活性。SLD用于后端渲染图层给前端返回栅格数据。 Mapbox St...

10种JavaScript特效实例让你的网站更吸引人_hsapphire的博客-程序员秘密

10种JavaScript特效实例让你的网站更吸引人今天的话题是如何改进自己网站的界面或提高网站的视觉体验,从而让用户记忆犹新。我们有三种主要的方法(从难到易):自己动手写脚本;使用类似于jQuery和mooTools的JavaScript框架(可以让编写代码变得更容易些);使用能工作于现有的JavaScript框架下的提前预置好的脚本或那种从头开始开发的创建者。这篇文章适合那些打算提高工...

CVE-2013-2028 经典栈溢出漏洞复现资料整理_破落之实的博客-程序员秘密_cve-2013-2028

一个经典的由整数溢出导致栈溢出的漏洞。下面感觉写的有点乱。文章目录复现漏洞相关基础知识CVE-2013-2028原理安装漏洞环境ubuntu 安装docker安装metasploit框架触发漏洞网站上现有的exp复现漏洞CVE-2013-2028:nginx 栈溢出漏洞相关基础知识栈的基础知识:https://ctf-wiki.github.io/ctf-wiki/pwn/linux/stackoverflow/stack-intro-zh/栈溢出原理:https://ctf-wik

tensorflow.models.rnn.rnn_cell.linear在tensorflow1.0版本之后找不到(附tensorflow1.0 API新变化)_sparkexpert的博客-程序员秘密

由于版本更新关系,从原来的tensorflow低版本到升级到tensorflow1.0以上时,发现有很多API函数变化是很正常的事情,大多碰到的如:如其中tf.nn.rnn_cell命名空间中的很多函数都发生了命名空间的变化,如转移到了tf.contrib.rnn.core_rnn_cell。但是在修改某个程序的时候,发现原来tensorflow.models.rnn.rn

随便推点

Quartus II出现 error deleting ‘‘msim_transcript‘‘:permission denied._HX_Fu的博客-程序员秘密_error 1: deleting d:\liangjigui\xiao\wang\orthoima

Quartus II出现 error deleting ‘‘msim_transcript’’:permission denied.Quartus II点击RTL Simulation时出现如下图所示的错误:问题原因:重新仿真时,原先的Modelsim界面没有关闭。解决方法:将Modelsim界面关闭,再重新仿真就可以了。...

Java 注释-Javadoc的标记_jiehaoxiang的博客-程序员秘密

在Java中有三种注释,如下:单行注释:符号是 //块注释:符号 /* code segment */,实现跨行注释Javadoc注释:符号 /** class info */,该注释会生成Java文档。

MT4 manager java API_78361923的博客-程序员秘密_mt4 manager api dll

开发MT4功能一般有这种方式:一、MT4 managerAPI开发这种方式比较常见,可以开发的功能就是我们在管理端和经理端看到的那些功能一般CRM插件都是用这种方式开发,这种方式开发原理就是通过调用接口DLL连接MT4然后调用MT4提供的接口DLL完成相应的功能,由于MT4 manager API 接口是c++,对于c++不熟悉的开发者难度较大,所以我们特意封装为java可以直接调用的接口,以供开发者能够快速开发。二、本接口可以实现MT4 manager API的常规操作,接口实现了以下功能:1、开户2、查

Linux驱动设计——字符设备驱动(一)_weixin_30371875的博客-程序员秘密

Linux字符设别驱动结构cdev结构体struct cdev { struct kobject kobj; struct module *owner; const struct file_operations *ops; struct list_head list; dev_t dev; unsigned int count;};dev_...

esp32 windows傻瓜式环境安装_rolitaer的博客-程序员秘密

1.首先安装傻瓜工具包,ESP32环境的大满贯ESP-IDF 工具安装器安装 ESP-IDF 必备工具最简易的方式是下载 ESP-IDF 工具安装器,地址如下:https://dl.espressif.com/dl/esp-idf-tools-setup-1.2.exe安装器会自动安装 ESP32 Xtensa gcc 工具链,Ninja 编译工具,以及名为 mconf-idf 的配置工...

使用Spark,从HIVE中获取数据写入HBase过程中遇到的坑_Gonna翼舞的博客-程序员秘密

在学习大数据的过程中,通过提交spark-submit提交jar包,将hive中的数据写入HBase的过程中遇到诸多问题,与大家分享。首先,在跑任务的过程中发现错误。ERROR metastore.RetryingHMSHandler: AlreadyExistsException(message:Database default already exists)该问题是在...

推荐文章

热门文章

相关标签