独立按键消抖与松手检测

2023-11-02

记录下最近独立按键消抖和松手检测
我对独立按键的处理思路是

1.获得键值
2.消抖处理
3.松手检测
4.键值解析

1.获得键值
这里把独立按键做个编号,例如有两个按键记为KEY0、KEY1,用一个变量来记录当前按键标记值(比如Cur_Keyval),当KEY0按下,就把Cur_Keyval的bit0置为1,否则清0,当KEY1按下,就把Cur_Keyval的bit1置为1,否则清0.
2.消抖处理
想法是比较当前标记值(Cur_Keyval)和上次标记值(Pre_Keyval),如果相等并且当前标记值不等于无按键按下的标记值时,认为是真的按下,否则认为是抖动。
3.松手检测
4.键值解析
这里写到一起了,松手检测是参考原子stm32教程里面的例程,定义一个static变量来记录上一次按键状态(key_up),只有上一次按键状态是抬起的(key_up=1)才响应键值解析并把key_up清0 ,(这里有个mode,是当mode=1时,每次进去都是key_up=1,相当于上一次都是抬起的,就会一直响应,当mode=0,只有真正抬起后,key_up才=1,达到松手检测效果)
上代码
key.c
#include "key.h"

uint8_t Cur_Keyval=0; //当前按键标记值
uint8_t Pre_Keyval=0; //上次按键标记值
uint8_t key_on=0;     //抖动变量 1表示已经抖动 

void key_init(void)
{
//初始化GPIO,上拉输入
}

//获得按键标记值 
void Get_Keyval(void)
{
    if(KEY0==ON_LEVEL)
        Cur_Keyval|= KEY0ON_VAL;
    else
        Cur_Keyval&=~KEY0ON_VAL;

    if(KEY1==ON_LEVEL)
        Cur_Keyval|= KEY1ON_VAL;
    else
        Cur_Keyval&=~KEY1ON_VAL;
}

//按键抖动
void Key_filter(void)
{
    if(Cur_Keyval == Pre_Keyval && Cur_Keyval != KEYOFF_VAL)
        {key_on=1;}
    else
        {key_on=0;}

    Pre_Keyval=Cur_Keyval;
}

//mode=0 有松手检测效果 mode=1无
uint8_t Key_Scan(uint8_t mode)
{
    static uint8_t key_up=1; //按键松开标志
    if(mode)key_up=1; //1 支持连按

    Get_Keyval(); //获得按键标记值 
    Key_filter(); //按键抖动
    if(key_up && key_on)
    {
     key_up=0;
     if(Cur_Keyval==KEY0ON_VAL) return KEY0_PRES;//解析按键
     else if(Cur_Keyval==KEY1ON_VAL) return KEY1_PRES;      
    }
    else if(Cur_Keyval == KEYOFF_VAL)
    {
      key_up=1;
    }
    return NONE_PRESS;
}
key.h
#ifndef __KEY_H
#define __KEY_H
#include "csa37fx60.h"   //
#define KEY_0   GPIO_PA1 //
#define KEY_1   GPIO_PA4 //

#define KEY0    GPIO_ReadInputDataBit(KEY_0)
#define KEY1    GPIO_ReadInputDataBit(KEY_1)

//独立按键按下电平
#define ON_LEVEL    0 

//没有按键按下标记值
#define KEYOFF_VAL 0x00 

//各个独立按键按下标记值
#define KEY0ON_VAL 0x01
#define KEY1ON_VAL 0x02

#define NONE_PRESS 0 //没有按键按下返回值
#define KEY0_PRES  1 //KEY0按下返回值
#define KEY1_PRES  2 //KEY1按下返回值

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

独立按键消抖与松手检测 的相关文章

  • 虚幻4学习笔记(4)光照、游戏角色、上下车、冲刺瞬移多段跳、打包

    光照 光照 光照分类 光的移动性 自动曝光 指数级高度雾 生成光束 使用体积雾创建光束 使用天空球制造夜晚 设置玩家角色 设置玩家切换 镜头过度 上下车 上车 下车 下车减速 人物冲刺和瞬移 冲刺 瞬移 多段跳设置 打包 B站UP谌嘉诚课程
  • LinkedList工作原理及实现

    以双向链表实现 链表无容量限制 但双向链表本身使用了更多空间 也需要额外的链表指针操作 按下标访问元素 get i set i e 要悲剧的遍历链表将指针移动到位 如果i gt 数组大小的一半 会从末尾移起 插入 删除元素时修改前后节点的指
  • Qt编写自定义控件大全

    最新版可执行文件 https pan baidu com s 1Y z4GT4kslgsb4f46yLILA 不定期增加控件及修正BUG和改进算法 目前已超过90个控件 总图 总图 1 动画按钮 1 可设置显示的图像和底部的文字 2 可设置
  • jenkins部署jeecg-boot3.1(前后端)自动化

    tip 我是使用我的腾讯云轻量应用服务器做的本次实战 操作系统 CentOS 7 6 64bit 主机规格 CPU 4核 内存 4GB 这个配置起前端有点带不动 建议8G内存 这个问题我反复测试很多次 一跑npm 就开始疯狂占资源 然后操作
  • 联想服务器开机引导,联想服务器怎么进入bios

    联想电脑设置起来比较麻烦 除了快捷启动菜单比较方便 如果要用传统的方式进行设置 会有很多项要设置 那么你知道联想服务器怎么进入bios吗 接下来 学习啦小编跟你分享联想服务器进入bios的设置步骤图解 联想服务器进入bios的设置步骤图解
  • word文档 文字变网址 解决办法

    word文档中文字变网址解决办法 问题描述 打开word文档发现其中有些文字变成了网址 解决办法 Alt F9 联想键盘 Alt Fn F9 这是因为直接按F9是功能键
  • n对括号的匹配方式(卡特兰数)

    4对 括号有多少种可能的合法 匹配方式 n对 括号呢 此题是卡特兰数的一个通常应用 相似的还有出栈顺序等 关于卡特兰数的具体内容 请参阅百度百科或Wiki http baike baidu com view 2499752 htm 网络上可
  • 泛型与正则表达式在Java编程中扮演着重要的角色

    泛型与正则表达式在Java编程中扮演着重要的角色 泛型提供了一种在编译时期检查类型安全性的机制 而正则表达式则允许我们以模式匹配的方式进行字符串的处理 本文将详细介绍Java中泛型和正则表达式的基础知识 并提供相应的源代码示例 泛型 什么是
  • 笔记:springboot-admin 整合spring security应用注册失败问题

    问题描述 原本正常的springboot admin 在整合了spring security之后就无法正常注册应用了 查看打印 Failed to register application as Application name admin
  • Android 中Activity和Fragment生命周期的具体变化详解

    博主前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住也分享一下给大家 点击跳转到网站 前言 一个MainActivity中装载了两个Fragment 在MainActivity中的onCreate 方法中进行了Fragme
  • ​ 输入一个字符串,将其中所有的大写和小写字母改成该字母的下一个字母,z 的下一个字母为 a。JAVA

    import java util Scanner public class Main public static void main String args Scanner scanner new Scanner System in Str
  • 【Unity】四叉树/八叉树管理和动态加载场景物件

    一 引言 场景的组织与管理是3d游戏开发中重要的一环 unity3d引擎中 只提供了最基本的场景组织 当我们加载场景时 会将场景中的物件及其依赖的资源全部加载出来 这对于较为庞大的场景显然是不合理的 可以考虑在进入场景时预先将可见范围内的物
  • GO中树的实现与学习

    go 的书写很像C 然后以前没有弄明白的事情终于弄明白了 这一次是树的重新学习和深入学习 树的学习 基本二叉树 树的基本创建 方法一 方法二 树的遍历 先序遍历非递归 中序遍历非递归 后序遍历非递归 层序遍历 树的深度 DFS BFS 搜索
  • 如何优雅地下载huggingface上模型,以llama2模型下载为例

    背景 由于llama2模型的下载需要经过官方的授权 这就需要登陆hugging face的 对模型页面进行申请 等待审核通过后 才能够下载 如果在单纯用 git lfs 的方式进行下载 需要输入账号和密码 为了更快速地进行下载 既能够设置密
  • TCP/IP协议及常见状态码(SYN,FIN,ACK,PSH,RST)

    TCP IP协议及常见状态码 SYN FIN ACK PSH RST 1 TCP IP协议 2 TCP协议原理 3 TCP报文格式 4 三次握手的状态码 对于软件测试工程师 前后端工程师 网络工程师 运维工程师等都需要对计算机网络基础知识有
  • SpringCloud构建微服务之基础环境搭建

    前言 本次我们将使用SpringCloud构建一个用户微服务案例 Consumer消费者 Client 通过REST调用Provider提供者 Server 提供的服务 构建环境 SpringCloud Dalston SR1 Spring
  • ChatGPT实现代码解释

    代码解释 新手程序员在入门之初 最好的学习路径就是直接阅读其他人的代码 从中学会别人是怎么写的 为什么这么写 过去 这个学习过程可能需要广泛阅读官方文档 在 GitHub issue 上提问 上 Stack Overflow 网站查询 见缝
  • WebView加载网页不显示图片解决办法

    对于大家来讲WebView肯定很熟悉 因为我们在日常开发中经常用到它 所以对于它的一些基本用法我就不在这啰嗦了 直接进入正题 我遇到的问题就是在使用WebView加载网页的时候图片不显示 我手机系统是5 1 1 当时出现这个问题我就想当然的
  • Google Protobuf自动反射功能

    Google Protobuf自动反射功能 看了下Google Protobuf的源码 对于反射机制 无论c 实现还是java实现都是采用map查找 这个应很高效率 实际我们在项目中无形中也用 到了这种思路 仅仅没系统化 通过一个类的原型对

随机推荐

  • webpack5 学习(九)—— 环境变量

    webpack 命令行环境配置的 env 参数 允许传入任意数量的环境变量 在 webpack config js 中可以访问到这些环境变量 例如 env production 或 env goal local npx webpack en
  • 算法设计艺术——编程珠玑第八章

    算法设计艺术 编程珠玑第八章 下面是书本中讲解的四个算法 问题 求一维数组中连续子向量的最大和 例如 a 6 3 4 2 9 10 8 则最大连续子向量的和 为 10 8 18 1 解法一 简单算法 html view plain copy
  • Shell函数的7种用法介绍

    1 在shell文件内部定义函数并引用 复制代码代码如下 shell function cat factorial sh bin bash function factorial factorial 1 for i 1 i lt 1 i do
  • mysql mariadb中查询查询用户和权限总结 及备份

    一 在mysql数据中 自带以下张表 存储用户的表在myql数据库的user表中 Database information schema mysql performance schema SELECT User Host Password
  • 数据湖是什么?

    数据湖或hub的概念最初是由大数据厂商提出的 不同的厂商有不同的定义 维基百科定义 数据湖是一类存储数据自然 原始格式的系统或存储 通常是对象块或者文件 数据湖通常是企业中全量数据的单一存储 全量数据包括原始系统所产生的原始数据拷贝以及为了
  • InnoSetup制作Qt项目安装包

    1 安装Inno Setup InnoSetup官方网站 Inno Setup 说明 InnoSetup是免费软件 建议官网下载安装 下载位置示例如下 2 打包Qt项目 使用Qt windeployqt exe自动抽取项目Qt依赖库 备注
  • Sonar代码扫描常见规则总结

    Sonar代码扫描常见规则 最近公司项目交付 交付前集成 功能 性能 安全种种测试工作就来了 由于测试离职 被抓壮丁 兼职起测试修改工作 小公司 平时敲 ctrl c 代码 ctrl v 时 同事也不在意一些代码规范 以及一些常见的规约要求
  • 为啥海康摄像头网页无法预览

    最近在做IPC相关的业务 用谷歌 火狐都无法预览摄像头画面 即使装了插件也不行 后面发现了 要用IE打开 才能预览 转载于 https www cnblogs com 132818Creator p 10980880 html
  • python 面向对象编程(2)

    文章目录 前言 封装 多态 类属性和实例属性 定义以及访问类属性 修改类属性 实例属性 类方法 静态方法 前言 前面我们介绍了 python 类和对象以及继承 私有权限 那么今天我们将来介绍 python面向对象 剩下的两大特性封装 多态
  • 蓝桥杯Python->面向对象:类 and 方法 练习->成绩分析练习

    作者 芝士小熊饼干 系列专栏 数据结构 蓝桥杯 算法 坚持天数 3天 烤地瓜案例练习实现对面向对象的理解 抽象一个地瓜类 class SweetPotato object 实现初始化方法 初始地瓜的状态和总烧烤时间 def init sel
  • scala运行异常Could not locate executable null\bin\winutils.exe in the Hadoop binaries

    java io IOException Could not locate executable null bin winutils exe in the Hadoop binaries 出现这个问题的原因是我们在windows上模拟开发环境
  • 使用vuex实时更新右上角通知信息的红点数量

    需求如图 因为这两个不存在组件关系 所以我们使用Vuex来解决这个实时刷新 1 首先在vuex的state定义数据如下 state noticeCount 0 2 更改 Vuex 的 store 中的状态的唯一方法是提交 mutation
  • ensp usg6000v ping不通_华为USG6000V防火墙和VMWARE的联动

    快到周末了 来一篇技术类公众号文章 最近看一本很有意思的书 叫 华为防火墙技术漫谈 俗话说得好 理论结合实践才是王道 下面来简要描述一下本周做过的一个比较有意思的实验 在这个实验中使用到了ENSP模拟器 USG6000V防火墙 VMWARE
  • 【数模研赛】“华为杯”第十九届中国研究生数学建模竞赛C题分享——(四)问题二模型建立

    写在前面 第十九届数模研赛在22年10月6 10日开展 我和我的两名队友肝了5天 整出来一篇论文 因为不确定自己做的好不好 所以一直没写博客 前两天结果出来了 我们队拿了国二 在C题里排名88 1134 感觉结果还不错 以后应该也不会再有机
  • UE4 实现控制场景中所有物体透明度功能

    本文会讲解如何利用材质参数集简单的实现修改场景中所有物体透明度的功能 讲解地图为第三人称地图 1 创建材质变量集 这里面新建的变量可以在蓝图中控制 这样就能很方便的修改透明度 因为透明度是只有一个值的参数所以创建scalar参数 默认值为1
  • c语言的product,张永强:C语言中product是什么意思

    吴俊光的回答 product在C语言中不是关键字 C库中也没有这样的函数名 所以pruduct有两种可能 1是编程者自己定义的变量 2是编程者自定义的函数的名字 这里product是自定义函数的名字 功能就是返回a乘b的结果 实现一个乘法功
  • 【转载】Linux下用ls和du命令查看文件以及文件夹大小

    1 ls的用法 ls ll 列出当前目录下所有文件的大小以及所有文件大小的统计总和 显示成字节大小 ls lh 列出当前目录下所有文件的大小以及所有文件大小的统计总和 以KB MB等为单位进行显示 ls l grep wc l 或 find
  • 基于BCM53262交换芯片平台的Linux操作系统移植(四)之代码调试与驱动书写

    2018 05 09 10 49 zhoulinhua 2018 05 10 一 系统分区 name address size bootstrap 0x0 64k u boot 0x10000 640k env 0xb0000 192k d
  • 【C语言】练习题 - 菲姐游泳 - 附视频讲解

    游泳奥运冠军菲姐刻苦训练 从早上a时b分开始下水训练 直到当天的c时d分结束 请编程计算 菲姐当天一共训练多少小时多少分钟 本文引用自作者编写的下述图书 本文允许以个人学习 教学等目的引用 讲授或转载 但需要注明原作者 海洋饼干叔 叔 本文
  • 独立按键消抖与松手检测

    记录下最近独立按键消抖和松手检测 我对独立按键的处理思路是 1 获得键值 2 消抖处理 3 松手检测 4 键值解析 1 获得键值 这里把独立按键做个编号 例如有两个按键记为KEY0 KEY1 用一个变量来记录当前按键标记值 比如Cur Ke