STM32 Cubemax(十二) ——利用状态机实现按键的长短按和双击

2023-05-16

STM32 Cubemax(十二) ——利用状态机实现按键的长短按和双击

文章目录

  • STM32 Cubemax(十二) ——利用状态机实现按键的长短按和双击
  • 前言
  • 一、状态图
  • 二、Cubemax配置
    • 1、IO口配置
    • 2、定时器配置
  • 三、代码
    • 1、编写有关按键的结构体和定义相关参数
    • 2、结构体初始化
    • 3、状态机编写
    • 4、10ms定时器中反复检测按键状态
  • 总结


前言

状态机是一种根据当前状态来执行相应动作,根据输入去改变状态的方法,出处应该在数字电路中。
我们利用状态机的思想来实现按键的消抖和一些其他功能的实现

一、状态图

在这里插入图片描述
我们的按键实验,就是以此状态图为基础,然后做延申,实现长短按和双击。

二、Cubemax配置

1、IO口配置

这个配置很简单,看自己的板子上按键的IO口是哪个,我这里以KEY0做演示
在这里插入图片描述
配置PH3为输出IO,而且由电路图可知,应该设置为上拉。
在这里插入图片描述

2、定时器配置

我们需要配置一个10ms的定时器,以10ms去检测按键的状态
在这里插入图片描述
在这里插入图片描述

三、代码

1、编写有关按键的结构体和定义相关参数

#define IOSTATE HAL_GPIO_ReadPin(GPIOH, GPIO_PIN_3)			//读取PH3的IO信息

typedef struct
{
		uint8_t flag;				//双击标志
		uint8_t mode;				//按键模式,0为短按,1为长按,2为双击
		uint8_t press_state;		//表示按键按下时,IO口为高电平还是低电平
}Key;

2、结构体初始化


void Key_Init()
{
		key.mode = 2;
		key.press_state = 0;
		key.flag = 0;
		HAL_TIM_Base_Start_IT(&htim2);
}	

3、状态机编写

我这里用一个变量a去观察结果

//此函数在定时器中每10ms调用一次
void Key_Check()
{
		static uint8_t state = 0, key_time = 0, twice_time = 0;
	
		if(key.flag == 1)
		{
				twice_time++;
				if(twice_time == 100)			//双击的间隔时间
				{
						twice_time = 0;
						key.flag = 0;
				}
		}
		
		switch(state)
		{
			case 0:
				if(IOSTATE == key.press_state) state = 1;
				break;
			
			case 1:
				if(IOSTATE == key.press_state)
				{
						if(key.mode == 0)	a++;			//单击模式
						else if(key.mode == 2)				//双击模式
						{
								key.flag++;
								if(key.flag == 2)
								{
										a++;
										key.flag = 0;
										twice_time = 0;
								}
						}
						state = 2;
			
				}
				else state = 0;
				break;
				
			case 2:
				if(IOSTATE != key.press_state)
				{
						state = 0;
						key_time = 0;
				}
				else	if(key.mode == 1)									//长按模式
				{
						key_time++;	
						if(key_time == 50)									//长按时间
						{
								a++;
						}
				}
				break;
		}
}

4、10ms定时器中反复检测按键状态

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
		if(htim->Instance == htim2.Instance)
		{
					Key_Check();
		}
}

总结

状态机的思想,适用于状态多变的场所,不仅是按键中。
具体的参考代码在下面的gitee中自取:代码仓库

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32 Cubemax(十二) ——利用状态机实现按键的长短按和双击 的相关文章

  • 在rviz中使用键盘控制burger

    启动语句 roslaunch turtlebot3 fake turtlebot3 fake launch 启动rviz 话题通信 roslaunch turtlebot3 teleop turtlebot3 teleop key laun
  • shell脚本中=左右的空格问题

    赋值语句等号两边不能有空格 xff1a i 61 1 或i 61 i 43 1 而字符串比较 xff0c 等号两边必须有空格 if a 61 b 比较时 xff0c if a xxx b 中括号前后一定要加空格否则会报错xxx 61 eq
  • freertos.axf: Error: L6218E: Undefined symbol xTaskGetSchedulerState (referred from delay.o).

    今天移植了一下FreeRTOS xff0c 出现了freertos axf Error L6218E Undefined symbol xTaskGetSchedulerState referred from delay o xff0c 这
  • vnc桌面配置及黑屏问题解决

    一 vnc桌面配置 登入需要远程帐号下修改 vnc xstartup 如配置root远程桌面 vi vnc xstartup 原内容如下 xff1a xff3b x etc vnc xstartup xff3d amp amp exec e
  • 华清嵌入式--入学篇

    当初在学习嵌入式的时候 xff0c 就知道嵌入式门槛高 xff0c 需要的知识比较多 工作了4年多时间 xff0c 确实感觉还是刚入门的感觉 xff0c 焊接 调试 原理图 PCB 模电 数电 c语言 数据结构 单片机 linux等知识比价
  • 20.华清嵌入式--数据结构入门

    从今天开始正式开始学习数据结构与算法 从今天开始正式开始学习数据结构与算法 从上面的框图也可以从整体上把握数据结构的关键知识点 xff0c 不管是简单的顺序表还是栈 xff0c 树等 xff0c 学习的方法都是一样的他们的操作也都是无非都是
  • 35.Linux应用层开发---线程

    一 线程的概念和使用 1 线程的概念 为了进一步减少处理器的空转时间 xff0c 支持多处理器以及减少上下文切换开销 xff0c 进程在演化中出现了另外一个概念线程 它是进程内独立的一条运行路线 xff0c 是内核调度的最小单元 xff0c
  • 36.Linux 应用层开发--进程间通讯

    最近因为项目原因耽误了一些时间 xff0c 导致进程间的通讯一直没有来的及学习及整理 在我们之前学过进程相关的概念和操作 xff0c 还学习了轻量级的进程的线程 xff0c 在我们之后的开发和面试中 xff0c 多线程 xff0c 多进程开
  • 树莓派4 ubuntu22.04LTS整合Intel Realsense深度相机

    树莓派4 ubuntu22 04LTS整合Intel Realsense深度相机 文章目录 树莓派4 ubuntu22 04LTS整合Intel Realsense深度相机前言一 为什么不使用Docker安装或使用官方教程安装 xff1f
  • 串口打印调试信息(干货)

    printf重定向到串口 上代码 xff0c 这里用到的是hal库 xff0c 标准库改以下函数就行 span class token macro property span class token directive keyword in
  • 相电流与线电流有什么区别

    相电流和线电流的区别 xff0c 主要看负载的连接方法 xff0c 如果是星型接法 xff0c 相电流和线电流相同 xff0c 线电压是相电压的开方3倍 如果负载是三角形接法 xff0c 那么 xff0c 线电流是相电流的开方3倍 xff0
  • STM32f103c8t6的定时器配置定时中断

    span class token comment 时间计算公式 span Tout span class token operator 61 span xff08 xff08 arr span class token operator 43
  • 集成学习方法

    概述 集成学习 xff0c 是将几个泛化能力差的模型相结合 xff0c 组成泛化能力强的模型 常见的做法就是分别训练几个模型 xff0c 然后再将多个模型的输出组合 xff0c 形成最终输出 xff0c 也称为模型平均的效果 类似的策略都称
  • (Java)常规技术面试题

    Java基础部分 1 Java 的 一次编写 处处运行 如何实现 xff1f JAVA之所以能实现 一次编译 xff0c 到处运行 xff0c 是因为JAVA在每个系统平台上都有 JAVA虚拟机 xff08 JVM xff09 xff0c
  • ESP8266烧写固件提示等待上电

    环境 供电电压 xff1a span class token number 5 span V 模块 xff1a 正点原子ATK span class token operator span ESP span class token oper
  • 嵌入式面试刷题

    1 表示一年有多少秒 define SECONDS PER YEAR 606024 365 UL 2 写一个标准宏 MIN define MIN A B A lt 61 B A B 3 指针数组 int a 10 优先级高所以是a 10 数
  • ubuntu18配置ftp

    安装ftp 修改文件 sudo gedit etc vsftpd conf span class token comment Example config file etc vsftpd conf span span class token
  • win11切换win10资源管理器

    HKEY LOCAL MACHINE SOFTWARE Microsoft Windows CurrentVersion Shell Extensions 右键 Blocked 选择 新建 字符串值 名称为 e2bf9676 5f8f 43
  • 联想小新pro13笔记本外接显示屏没信号

    step1 关机 step2 拔下电源 step3 安住 fn 43 s 43 v键 xff0c 开机 xff08 开不了机 xff0c 我重复了几次 xff09 step4 插电源开机 xff0c 扩展屏幕正常
  • C51内存类型

    bdata bdata内存类型只能用于声明变量 您不能声明bdata函数 该存储器使用8位地址直接访问 xff0c 是8051的片内位可寻址RAM 用bdata类型声明的变量是位可寻址的 xff0c 可以用位指令读写 code 代码存储器类

随机推荐

  • MQTT问题

    是否存在c gt ping outstanding 61 1 的后一秒就触发TimerIsExpired amp c gt last received span class token keyword int span span class
  • Failed to start apt-news.service Failed to start esm-cache.service

    luozw 64 luozw vpc etc apt apt conf d span class token function sudo span span class token function apt get span update
  • stm中断优先级理解+抢占优先级和相应优先级

    一 抢占优先级比子优先级的优先权更高 xff0c 这意味抢占优先级更高的中断会先执行 xff0c 而不管子优先级的优先权 xff0c 数值越低优先级越高 二 同理 xff0c 如果抢占优先级相同 xff0c 那么就会比较子优先级 xff0c
  • Realsense D435基于ROS跑通ORBSLAM2

    Realsense D435基于ROS跑通ORBSLAM2 系统ubuntu16 04 ROS Kinetic 相机RealsenseD435 SLAM系统 xff1a ORBSLAM2 一 安装Realsense的SDK 官方链接 htt
  • Qt学习:综合案例应用-上(翻金币小游戏)

    本案例是对Qt的基本控件 xff0c 事件处理 xff0c 资源文件的使用等知识的综合应用 以及一些开发思想和逻辑控制 首先了解下案例的文件构成 头文件 xff1a mainwindow h chooselevelscene h plays
  • 在TX2上运行realsenseD435摄像头

    在TX2上运行realsenseD435 先给出相关的链接在TX2上安装realsense SDK库在TX2上安装realsense SDK库 先给出相关的链接 github 上的一些链接 realsense SDK库 xff1a http
  • docker build 后面为什么要跟个 .

    我们在构建镜像文件时无非是使用 xff1a docker build t test ubuntu v1 或者 docker build f docker test Dockerfile 来进行构建镜像 xff0c 用第一个命令时任务 指代的
  • 微机原理中地址总线、数据总线与内存容量之间的关系

    今天在复习微机原理的时候 xff0c 看到一个概念 xff1a 存储总量 61 存储单元个数 存储字长 xff0c 然后存储单元个数 61 2 地址总线位数 xff0c 存储字长和数据总线位数有关 xff0c 如果是这样 xff0c 那么
  • HDLC——高级数据链路控制(HDLC,High-level Data Link Control)

    一 HDLC概述 1 1 HDLC的发展历史 高级数据链路控制 xff08 High Level Data Link Control或简称HDLC xff09 xff0c 是一个在同步网上传输数据 面向比特的数据链路层协议 xff0c 它是
  • 差分技术:LVDS(低压差分信号)、MLVDS(多点低压差分信号)的区别与应用场景

    差分传输是一种信号传输的技术 xff0c 区别于传统的一根信号线一根地线的做法 xff0c 差分传输在这两根线上都传输信号 xff0c 这两个信号的振幅相同 xff0c 相位相反 在这两根线上的传输的信号就是差分信号 信号接收端比较这两个电
  • 小白能理解的奈奎斯特采样及延伸出的理论

    一 取样定理 其实奈奎斯特采样有两种方式 xff0c 一种是矩形脉冲采样 xff0c 一种是冲激采样 xff0c 采样方式如下图 我们在不计算数学公式的情况下来讲解 xff0c 只是让大家明白是这么回事 xff0c 具体为什么是这样 xff
  • 单边谱和双边谱

    实际中 xff0c 只会有单边谱 xff0c 并不会有负频率的信号 在引入欧拉公式后 xff0c 出现了双边谱 单边谱转换为双边谱 xff0c 幅度会降低一半 xff0c 其他不变
  • 小白也能搞通UDP通信(88E1111 RGMII 接口)

    一 网络协议 下表描述了整个从上到下的网络协议层 xff1a 这些网络协议在FPGA实际开发的过程中用到的就是传输层 网络层 数据链路层和物理层 xff0c 在我们的举例中用到UDP IP ARP协议 xff0c 物理层就用88E1111
  • 485通讯和modbus通讯协议

    485通信 xff1a 采用差分信号 xff1a A比B电压高是1 xff0c A比B电压低是0 xff0c 电压高低值在0 2V 6V之间 硬件连接上 xff1a 所有A接到一起 xff0c 所有B接到一起AB之间要加匹配电阻100欧到1
  • MODBUS RTU

    Modbus xff1a 是一种单主 从通信协议 MODBUS网络上只有一个主站 xff0c 主站在MODBUS网络没有地址 xff0c 从站的地址范围为0 247 xff0c 其中0为广播地址 xff0c 从站的实际地址为1 247 MO
  • TM4C123-HWREG()及外设寄存器地址说明

    参考文件 xff1a ti TivaWare C Series 2 1 4 178 inc hw types hti TivaWare C Series 2 1 4 178 inc hw memmap htm4c123gh6pz datas
  • I2C协议

    物理层 xff1a 1 一个I2C总线中可连接多个I2C通信设备 xff0c 支持多个主机及多个从机 2 两线制 xff1a 一条双向串行通信的数据线 xff08 SDA xff09 xff0c 一条串行时钟线 xff08 SCL xff0
  • SPI协议

    物理层 xff1a 1 四线制或三线制 xff1a 四线制时3条总线分别为SCK MOSI MISO xff0c 片选线为NSS xff08 CS xff09 三线制与其不同的是MOSI和MISO合并为一条线 xff0c 端口为双向端口 x
  • 数据处理:修改rosbag topic的frame_id

    1 安装srv tools工具 git clone https github com srv srv tools git 将其作为功能包放到ros工作空间下编译即可 2 使用示例 rosrun bag tools change frame
  • STM32 Cubemax(十二) ——利用状态机实现按键的长短按和双击

    STM32 Cubemax 十二 利用状态机实现按键的长短按和双击 文章目录 STM32 Cubemax 十二 利用状态机实现按键的长短按和双击前言一 状态图二 Cubemax配置1 IO口配置2 定时器配置 三 代码1 编写有关按键的结构