stm32----用状态机判断单双击

2023-11-18

一、什么是状态机

状态机(State Machine)是一种用于描述系统状态和状态之间转换关系的数学模型,说白了就是做出某个动作之后变成什么样的状态,比如stm32中的按键控制开关灯,假设灯一开始是关的,当我们按下按键之后,灯亮了,这相当于一个开灯操作,然后在这个操作之后灯亮了,这就是一个简单的状态机。

二、用状态机实现stm32f103rct6单片机的单双击判断

首先我们需要知道,按键有两个操作步骤,第一个是按下按键,此时检测到高电位(也就是1),第二个是松开按键,此时检测到低电位(也就是0),所以我们可以根据这个来判断按键是否按下。当然,还有一种情况就是误触,当按下的时间很小的时候我们可以认为是误触。

上代码:

/*我们可以封装两个函数,一个用来返回按没按下,一个用来返回按下次数*/

u8 key_Judge(void)
{
    static u8 state = 0;//注意这里要加上static,让state只初始化一次
    u8 key_value = PAin(0);//PAin(0)是位带操作中,指按键PA0
    u8 retval = 0;//用来获取返回值
    switch(state)
    {
        case 0:
        {
            if(key_value)//当检测到按键按下
            {
                key_time = 0;//用来计时的变量,这个变量放在中断函数中让其自增
                state = 1;  //下次执行case1
            }
        }
        break;
        
        case 1:
        {
                if(ke_time > 20)//消除抖动,判断是否误触
                {
                    if(key_value)//如果还是检测到按下
                    {
                        key_time = 0;
                        state = 2;//下次执行case2
                     }
                     else//如果是误触则下次从头执行case0
                    {
                        state = 0;
                    }      
                }
                
        }
        break;


        case 2:
        {
            if(!key_value)//判断是否松开按键
            {
                state = 0;
                retval = 1;
                
            }
        }
        break;

    }
    return retval;
}

然后是判断按下次数的函数:

u8 key_Read(void)
{
    static u8 state_read = 0;
    u8 retval = 0;
	u8 key_judge = Key_Judge();
    
    switch(state_read)
    {
        case 0:
        {
            if(key_judge)
			{
				flag_400ms = 0;//这个和下面这两个变量都放在中断服务函数中
				flag_1000ms = 0;
				flag_60s = 0;
				state_read = STATE_1;
			}
			else
			{
				retval = key_judge;
			}            
        }
        break;

        case 1:
        {
            if(key_judge)//再次按下则判断为双击
			{
				flag_1000ms = 0;
				flag_60s = 0;
				retval = TWO_PRESS;
				state_read = STATE_0;
			}
			else
			{
				if(flag_400ms > TIM_400)
				{
					retval = ONE_PRESS;
					state_read = STATE_0;
				}
			}
            
        }
        break;

        

    }
    return retval;
}

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

stm32----用状态机判断单双击 的相关文章

  • COW奶牛!Copy On Write机制了解一下

    前言 只有光头才能变强 在读 Redis设计与实现 关于哈希表扩容的时候 发现这么一段话 执行BGSAVE命令或者BGREWRITEAOF命令的过程中 Redis需要创建当前服务器进程的子进程 而大多数操作系统都采用写时复制 copy on
  • 分布式记账的意义

    今天正式开始 区块链方法论 的第二部分 寻根溯源 的第一章节 说到区块链 大多数的人说的最多的就是分布式记账 没错 分布式记账是区块链技术中最广为人知的特征之一 但几乎没有多少人知道为什么要采用分布式记账 所以 今天我们就来说一说分布式记账
  • 记录一下Popmenu的使用以及一些坑:自定义Popupmenu、Menu、Popupmenu添加icon

    今天就记录一下昨天写bug的时候使用Popupmenu的时候遇到的一些问题吧 尝试使用Popupmenu 避免不必要的坑 我贴的代码都是我最后的代码 记录自己看一下 后来参考的人就看看步骤就行 先看看我最后的效果图 壹 Popupmenu的
  • nginx系统学习5--常用配置6--网络限速配置

    6 6 网络限速配置 6 6 1 操作 01 修改配置文件 worker processes 1 events worker connections 1024 http include mime types default type app
  • SpringBoot自动配置原理,一文搞懂

    阅读收获 1 type 1 2 理解SpringBoot自动配置原理 SpringBoot是什么 SpringBoot 的诞生就是为了简化 Spring 中繁琐的 XML 配置 其本质依然还是Spring框架 使用SpringBoot之后可

随机推荐

  • Win11的Linux子系统WSL2安装Ubuntu的关键步骤

    安装Ubuntu 主要参考 官网教程 注意WSL2的重启时机与WSL有所不同 在Ubuntu 22中 配置用户名和子系统分区的界面已经与官网教程有所不同 用户名不能有大写 分区可以采用默认设置 若卡在Ubuntu安装页面 在Windows设
  • 面试宝典:从MobileNetV1到V3,一文全面梳理移动端深度学习模型

    面试宝典 MobileNetV1 V3 MobileNet的设计及实现 MobileNet是一种适用于移动设备的通用计算机视觉神经网络 可用于分类 目标检测和语义分割等多种任务 为了在移动设备上实现高效的计算和减小模型大小 我们可以采用以下
  • DEBUG:Generate Bitstream失败

    问题 约束失败 解决 确保IO初始化引脚正确 和选择合适的电平
  • node socket 简易聊天室

    服务端 const net require net const server net createServer 用户列表 let clients 监听连接 server on connection client gt client on d
  • 解决vscode git push不成功,总是弹出“...reset”或“...Timeout”错误问题?

    问题 解决vscode git push不成功 总是弹出 reset 或 Timeout 错误问题 解决方法 cmd刷新一下ip缓存 ipconfig flushdns 第二种 git push报错 OpenSSL SSL read Con
  • Unity中将3D模型显示在UI上或者显示在UI前面

    标题 Unity中将3D模型显示在UI上或者显示在UI前面 一 将3D模型显示在UI上 使用RawImage和Render Texture组合实现效果 1 创建一个RawImage控件 2 创建一个Render Texture 然后可以调节
  • 记录SpringBoot+Mybatis+PageHelper分页踩坑:Pages总页数查出来始终为1,Total数有误

    记录Mybatis使用PageHelper遇到的坑 使用PageHelper时 PageHelper startPage page limit List
  • 枚举常量

    2011 04 28 12 20 31 分类 C C 语言 标签 c枚举变量 字号大中小订阅 1 枚举常量的定义 enum 枚举类型名 常量1 常量2 常量3 例如定义一个星期的枚举常量 enum Week Mon Tue Wed 这就定义
  • 0-OpenWrt前菜

    前言 接触 op 已达四年 今年开始梳理整体所学 具体还参考了佐大的视频 对 op 缺乏系统知识的可以尝试 总体而言官方文档和源码是最好的教程 文章目录 OpenWrt Study uboot下升级固件 进入uboot 安装串口工具 安装t
  • 猿如意

    目录 一 什么是猿如意 二 借助猿如意安装Visual Studio Code 1 安装猿如意 2 安装Visual Studio Code 三 总结 一 什么是猿如意 猿如意是CSDN推出来的一款面向开发者的工具 他能够帮助开发者 找到自
  • GEE学习笔记 六十七:【GEE之Python版教程一】GEE学习背景介绍

    相信很多人都对GEE已经比较熟悉了 只是不熟悉GEE的Python的API而已 这里只是做一个简单的总结概括一下GEE相关内容 1 GEE学习基本要求 目前市面上无论出现什么新的技术 总会出现一种课程或者资料 xxx天零基础精通xxx 其实
  • 系统分析与设计——lesson16

    使用 ECB 实现 make reservation 用例的详细设计 包含用例简介 顺序图 类图 用例简介 make reservation这个用例包括 根据location和入住时间查询旅馆 可按照某种属性排序显示旅馆 选择房间 填写入住
  • struts验证框架

    关于validation xml 在validator xml中使用了validation rules xml的验证规则注意一定要加其已经定义好的出错消息考到你的资源包里去 否则出错的时候 显示错误对话框里面却什么错误消息都没有 不允许发生
  • MySQL自动重新连接

    最近部署一个系统 后台用线程池来处理请求 而每个线程有一个mysql连接 当系统运行一阶段后 有些请求会出现操作 Internal error 而操作一次可能又会成功 经过多方调试 发现是MySQL连接超时 如果使用了长连接而长期没有对数据
  • Qt程序Release版出现 类似 QEventLoop: Cannot be used without QApplication 问题的终极解决方案

    Qt程序Release版出现 类似 QEventLoop Cannot be used without QApplication 问题的终极解决方案 参考文章 1 Qt程序Release版出现 类似 QEventLoop Cannot be
  • 初学者学习安装Vmware正版软件

    目录 一 获取下载安装 二 安装图文步骤 三 可能出现问题 2分钟无脑 快速安装Vmware 一 获取下载安装 首先说明 官网下载需要登入账号 最新版可以下载试用版 不需要账号 下述为官网的下载路径图示 仅供参考 注意 目前下载都需要账号了
  • Linux系统Could not connect to '192.168.128.XXX' (port 22): Connection failed.

    网上查找了方法 都是 查看防火墙 service iptables status 关闭防火墙 service iptables stop 打开防火墙 service iptables start 打开sshd service sshd st
  • zigbee串口打印无法显示或乱码解决方法

    zigbee串口打印问题 在终端节点向协调器发数据时 在数据流中伴有该节点的网络地址 而有时通过PC端无法打印出来 1 可能是串口软件的问题 用过好几个串口软件 有时会出现停止 或乱码行为 在经过多次换用软件 发现 SecureCRT 这个
  • uni-app watch事件监听三种用法

    1 普通监听 无法监听到第一次绑定的变化
  • stm32----用状态机判断单双击

    一 什么是状态机 状态机 State Machine 是一种用于描述系统状态和状态之间转换关系的数学模型 说白了就是做出某个动作之后变成什么样的状态 比如stm32中的按键控制开关灯 假设灯一开始是关的 当我们按下按键之后 灯亮了 这相当于