共享一个产品中使用的按键消抖/开关量监测函数(附源码,可移植)

原创 玩转单片机与嵌入式 2023-09-19 00:07

点击下方名片,关注公众号,获取更多精彩内容

欢迎关注【玩转单片机与嵌入式】公众号,回复关键字获取更多免费视频和资料

回复【加群】,单片机】、【STM32】、【硬件知识】、【硬件设计】、【经典电路】、【论文】、【毕业设计】、【3D封装库】、PCB】、电容】、TVS】、阻抗匹配】、【资料】、【终端电阻】、【Keil】、【485】、【CAN】、【振荡器】、[USBCAN]、【PCB】、【智能手环】、【智能家居】、【智能小车】、【555】、【I2C】、【华为】、【中兴】,等……


关于按键消抖或者开关量信号监测,可以参考本公众号的另外一篇原创文章:按键消抖常用的软硬件方法。在该文章中介绍了两种软件延时的方式。但也都各有缺点。

一:旧方案

方案一:纯软件延时

sbit KEY = P1^3;///按键读取函数uint8_t GetKey(void){    if(KEY == 1)    {        DelayMs(20);        //延时消抖        if(KEY == 1)        {            return 1;        }        else         {            return 0;        }    }    else     {        return 0;    }}
致命缺点:在延时的时候一直占用cpu的资源,如果在延时的时候,有其他外部中断或者抢占事件,系统完全没有响应的
方案二:中断消抖
此处不在贴出代码:感兴趣的同学可到文章中查看:按键消抖常用的软硬件方法
致命缺点:多占用中断资源。操作复杂。在资源就是成本的产品中(多占用一个中断可能会导致需要选择价格更高的MCU),这种方案的缺点更加明显。

推荐方案

本文推荐一种更高效、合适,已在产品中使用过的软件设计方案。直接上代码。
#include 
// 定义开关信号结构体typedef struct { bool lastState; // 上次开关信号状态 bool currentState; // 当前开关信号状态 bool validState; // 有效的开关信号状态 int debounceDelayCounter; // 开关信号消抖计数器} DebouncedSwitch;
// 初始化开关信号结构体void initializeSwitch(DebouncedSwitch* switchObj) { switchObj->lastState = false; switchObj->currentState = false; switchObj->validState = false; switchObj->debounceDelayCounter = 0;}
// 模拟读取开关信号状态的函数bool readSwitchState() { // 在这里替换为实际的开关信号读取代码 // 返回开关信号的当前状态(true表示开,false表示关) return false;}
// 处理开关信号消抖的函数void debounceSwitch(DebouncedSwitch* switchObj, int debounceTime) { // 读取当前开关信号状态 switchObj->currentState = readSwitchState();
// 如果当前状态与上次状态不同,重置计数器并更新上次状态 if (switchObj->currentState != switchObj->lastState) { switchObj->debounceDelayCounter = 0; } else { // 如果状态相同,增加计数器值 switchObj->debounceDelayCounter++; }
// 如果计数器达到指定的消抖时间,表示开关信号状态稳定 if (switchObj->debounceDelayCounter >= (debounceTime / 10)) { // 如果当前状态与 validState 不同,表示发生了有效的状态变化 if (switchObj->currentState != switchObj->validState) { switchObj->validState = switchObj->currentState; } } // 更新上次状态 switchObj->lastState = switchObj->currentState;}
int main() { // 创建一个开关信号的DebouncedSwitch结构体 DebouncedSwitch switchObj; initializeSwitch(&switchObj);
while (1) { debounceSwitch(&switchObj, 100); // 设置消抖时间为100毫秒 if (switchObj.validState) { if (switchObj.validState) { // 执行开关信号为开的操作 printf("开关信号为开\n"); } else { // 执行开关信号为关的操作 printf("开关信号为关\n"); } }
// 在这里可以添加其他需要执行的代码
// 模拟延时或等待开关信号状态变化 // 这里使用usleep函数来模拟10毫秒的延时 // 实际上,你需要根据你的硬件和操作系统来等待开关信号状态变化 usleep(10000); // 10毫秒 }
return 0;}
1、函数详解:
debounceSwitch函数该函数用于处理开关信号的消抖,以确保稳定的开关状态。
它接受一个指向 DebouncedSwitch 结构体的指针, 该结构体包含了上次状态、当前状态、有效状态等信息,以及消抖时间的设置。
该函数的被调用周期为10ms(可以与产品程序中其他任务并行执行)。
2、函数的工作流程如下: 
1)读取当前开关信号状态。
2)如果当前状态与上次状态不同,重置计数器并更新上次状态。 
3)如果当前状态与上次状态相同,增加计数器值。 
4)如果计数器达到指定的消抖时间,表示开关信号状态稳定。
5)如果当前状态与 validState 不同,表示发生了有效的状态变化,更新有效状态。 
6)更新上次状态以便下一次比较
3、优点介绍:
1)扩展性:debounceSwitch该函数使用结构体指针的形式,提供了开关量检测的框架,需要多个开关量/按键检测时,实例化对应的按键变量即可。例如:main函数的示例中实例化了switchObj,多有多个按键可以多定义不同的switchObj即可。如下:代码所展示:
DebouncedSwitch switchObj_key1;DebouncedSwitch switchObj_key2;
//其他代码
debounceSwitch(&switchObj_key1, 100);debounceSwitch(&switchObj_key2, 50);

2、高度可定制:
debounceSwitch函数中的消抖时间是作为参数传递的,这使得消抖时间可以根据不同的开关信号或应用场景进行定制。这种可定制性允许您在不同情况下使用不同的消抖时间,以满足特定需求。
3、适用于实时系统
相对于纯软件延时消抖,debounceSwitch函数是更可靠的,因为它不依赖于软件的延时,而是基于实际的状态变化来判断开关信号的稳定性。这使得它适用于实时系统和对时间精度要求较高的应用。

总结

当然,作为一个产品中使用的函数还有很多可优化的空间,比如:函数内判断指针不为空。进行参数的有效性检查等等。
如果发现有更好的可优化空间,欢迎扫描下方的二维码共同交流。

END

扫描上方二维码加群,回复【加群】或扫码加我好友,限时免费进入技术交流群。



推荐阅读




【专辑】器件选型


【专辑】单片机


【专辑】经验分享


【专辑】STM32


【专辑】硬件设计


【专辑】软件设计


【专辑】开源项目


【专辑】职业发展

感谢大家阅读,如果喜欢

请点赞和“在看”吧,或者分享到朋友圈。

点击跳转到原文,限时优惠加入我们的知识星球(加好友获取免费券)

玩转单片机与嵌入式 专注单片机、嵌入式、学习资料、最新设计、案例等。以单片机为起点,带你玩转单片机、嵌入式。
评论 (0)
  • 基于51单片机的智能台灯覆铜板设计技术手册
    基于51单片机的智能台灯覆铜板设计技术手册
  • 11、谷景告诉你环形磁环电感量偏高影响正常使用吗
    11、谷景告诉你环形磁环电感量偏高影响正常使用吗
  • 基于51单片机的智能台灯洞洞板设计技术手册
    基于51单片机的智能台灯洞洞板设计技术手册
  • Blender建模高级教程|Blender视频教程2023
    Blender建模高级教程2023分享下载,Blender视频教程,Blender是一款免费开源三维图形图像软件,提供从建模、动画、材质、渲染、到音频处理、视频剪辑等一系列动画短片制作解决方案。

    Blender拥有方便在不同工作下使用的多种用户界面,内置绿屏抠像、摄像机反向跟踪、遮罩处理、后期结点合成等高级影视解决方案。Blender内置有Cycles渲染器与实时渲染引擎EEVEE。同时还支持多种第三方渲染器。

    Blender建模高级教程其包含了多边形建模、曲线、曲面建模功能,修改器、雕刻、贴图展 UV 设定材质、烘培场景、骨骼绑定、动画创作、粒子效果、物理仿真模拟、光线追踪引擎Cycles、相机追踪、图像后期合成等丰富、强大的功能。

    Blender建模高级教程,Blender是一款开源的跨平台全能三维动画制作软件,提供从建模、动画、材质、渲染、到音频处理、视频剪辑等一系列动画短片制作解决方案。Blender为全世界的媒体工作者和艺术家而设计,可以被用来进行3D 可视化,同时也可以创作广播和电影级品质的视频,另外内置的实时3D 游戏引擎,让制作独立回放的3D 互动内容成为可能。

    建模前的装备
    为了让接下来的建模工作更加方便,首先需要进行各方面的准备。这里是以我个人为基准,如果你觉得不适合里的话可以忽略这一部分。

    画面的分割
    虽然在一个View里完成也不是不可以的,但是可以同时在各个方向中进行查看当然是更好的。因此,我们进行画面的分割。我个人比较推荐将画面分成3个。分割的方法非常的简单。
    3DView的右上(或是左下)有一个类似三角的形状,将鼠标指针移动到这里时,指针会变成+的形状。

    Blender建模软件从零建模
    (1)了解目标,制定大概计划
    目标:制作类似上图的3D模型
    工具:Blender,B站网课
    预计时间:1天
    内容安排:(重要)
    1:首先,我们要做中间的小黄人 -----选定目标
    2:小黄人包括头角、身体、眼睛、嘴巴、眼球、眼睛、眼皮、腿 -----成分分析
    3:身体–>脚–>角–>眼睛–>嘴巴 -----制定顺序

    (2)基于计划,初步设计模型人物结构
    4:身体我们可以用(shift +A)立方体来代表,头角可以用锥体表示,眼球可以用经纬球or棱角球表示,眼睛也可以用球来表示,嘴巴可以用环体表示,脚可以用圆柱表示。

  • 电子行业云MES系统解决方案

    电子行业MES解决方案主要是针对目前电子生产制造企业面临的产品迭代升级中多品种小批量混线生产、存呆滞问题多;质量检查标准多、售后问题难追溯;生产进度难追踪、车间物料难管控、实际成本难计算等问题,提出的一种切实可行且能降低成本、提高效率的有效问题解决方案。

  • 人人都能学的数据分析(16周完整版+源码+PDF课件)下载
    人人都能学的数据分析(16周完整版+源码+PDF课件),作为数据分析师, 清晰了解数据分析的步骤是非常重要的,有助于清楚把控整个数据分析的流程
    那么在日常工作中,这些上下游对接的部门同事自然是分析师的面向对象,除了这些工作的合作伙伴,还有大部分精力要拿来面对自己的领导和业务方的领导,他们可能会给你提一些有挑战性的工作,即使他们属于放手型的,那你也需要主动找机会与他们沟通,毕竟向上管理是每一个职场人必备的技能。
    作为想要学习数据分析的人员,了解整个数据分析的流程, 这样在面对一个数据分析问题的时候,知道如何去开展
    那么数据分析流程包含哪些环节呢?
    我将一次完整的数据分析流程主要分为六个环节,包括明确分析目的、数据获取、数据处理、数据分析、数据可视化、总结与建议。

    1、PEST分析法
    PEST,也就是政治(Politics)、经济(Economy)、社会(Society)、技术(Technology),能从各个方面把握宏观环境的现状及变化趋势,主要用户行业分析。

    2、5W2H分析法
    5W2H,即为什么(Why)、什么事(What)、谁(Who)、什么时候(When)、什么地方(Where)、如何做(How)、什么价格(How much),主要用于用户行为分析、业务问题专题分析、营销活动等。

    3、SWOT分析法
    SWOT分析法也叫态势分析法,S (strengths)是优势、W (weaknesses)是劣势,O (opportunities)是机会、T (threats)是威胁或风险。

    分析师需要面对的人
    分析师的岗位类似于文章中的过渡句,上面承接开发、埋点、数据仓库的同事,下面对接运营、产品,商业等业务人员,如果你想最快的了解整个公司的运营模式和现状,分析师的职位是不二之选。

    那么在日常工作中,这些上下游对接的部门同事自然是分析师的面向对象,除了这些工作的合作伙伴,还有大部分精力要拿来面对自己的领导和业务方的领导,他们可能会给你提一些有挑战性的工作,即使他们属于放手型的,那你也需要主动找机会与他们沟通,毕竟向上管理是每一个职场人必备的技能。
  • 6、谷景磁环电感线圈在电源产品上的升级应用案例分享
    6、谷景磁环电感线圈在电源产品上的升级应用案例分享
  • 无线神经接口的超低功耗集成电路设计
    无线神经接口的超低功耗集成电路设计
  • 1、共模电感厂商教你如何减小共模电感的发热
    1、共模电感厂商教你如何减小共模电感的发热
  • 基于51单片机的超声波测距仪设计 数码管显示技术手册
    基于51单片机的超声波测距仪设计 数码管显示技术手册
  • 8、共模电感烧断对电路会有什么影响 gujing
    8、共模电感烧断对电路会有什么影响 gujing
  • [11章]SpringBoot3.0 + RocketMq 构建企业级数据中台教程
    SpringBoot3.0 + RocketMq 构建企业级数据中台,所谓数据中台,即实现数据的分层与水平解耦,沉淀公共的数据能力,笔者认为可分为三层,数据模型、数据服务与数据开发,通过数据建模实现跨域数据整合和知识沉淀,通过数据服务实现对于数据的封装和开放,快速、灵活满足上层应用的要求,通过数据开发工具满足个性化数据和应用的需要。

    过去三十年,企业数据管理都以传统的IT架构为基础。每当技术部门为业务部门解决问题时,需要从业务需求的探查、技术壁垒的打通等从上到下各个方面来建设新系统。每个系统的建成都自成一体,各自满足业务部门的需求。这种情况不仅耗费各部门大量的精力也使得各个系统难以打通管理,无法形成更强大的数据能力。

    SpringBoot3.0 + RocketMq 构建企业级数据中台,数据中台是能力共享平台。如今,很多产品应用研发初始都在强调功能性,各个功能存在或多或少的重复性。然而企业对这些产品功能的定义并不相同。当客户产生某些需求时,由于定义的不同,产品功能和功能间的数据很难打通,也无法实现能力共享。
    在数据中台基础上的应用开发并不强调功能性,更注重能力的共享。这种能力就像水电煤一样可以直接向外输出使用,从而满足业务部门和用户的不同需求。

    数据中台如何建设?
    SpringBoot3.0 + RocketMq 构建企业级数据中台,数据中台的建设包括三个阶段,分别是基础架构、技术体系和应用系统。
    基础架构主要由数据标准、数据质量、元数据等组成。在建设过程中,需要根据企业的实际情况进行合理布局。技术体系是数据中台的技术支撑,主要包括业务应用系统、 ETL工具等。通过建立技术体系,可以提升企业在大数据处理上的效率和质量,同时也可以降低企业在大数据平台搭建过程中的成本。应用系统主要包含数据资产管理系统、数据运营管理系统、智能分析系统等。通过建立应用系统,可以有效地提高数据分析的效率。通过建立应用系统,企业可以对各种数据进行统计和分析,进而对业务起到指导作用。
    以上三个阶段是基础架构阶段,是建设数据中台的重要组成部分。通过基础架构阶段,企业可以更好地了解自身的业务情况以及现有的数据情况,在此基础上进行技术体系建设和应用系统建设。
  • 4、你知道线圈电感的电感量大好还是小好
    4、你知道线圈电感的电感量大好还是小好
  •  在2021年戴森发布全新的V12 Detect Slim轻量无绳吸尘器之前,地球人还不曾想到原来可见光激光可以这样用!     V12中,用绿色激光替代传统LED照明灯,其吸头的「激光探测器」主打的就是看见后者看不到的微尘,实现数据见证的可视化深度清洁。   绿色激光不仅具备激光光源本身相干性好、方向性好等优势,它还具备可视性高的特点,“就灵敏度和可视性来说,绿色激光差不多是红色激光的3.5倍”,艾迈斯欧司朗市场工程师郑运强补充道,这也
    艾迈斯欧司朗 2023-09-21 17:55 166浏览
  • 随着人口老龄化的不断加剧,慢性病的发病率不断上升,对个人和社会健康带来了严重威胁。为了更好地管理和控制慢性病,智康护推出了一款全新的慢病监护系统。本文将对该系统的特点和优势进行详细介绍。 一、系统概述: 智康护慢病监护系统是一种基于互联网和物联网技术的智能化健康管理系统。它通过搭载智能设备、传感器和云平台,实现了对患者健康状况的实时监测和个性化管理,辅助医生提供精准的医疗服务。 二、系统特点: 1.实时监测与远程管理:患者通过佩戴智能传感器和设备,系统可以实时监测患者的生理指标,如血
    新导智能 2023-09-21 15:55 156浏览
  • 我司新导物联提供的特殊资产报警系统为特殊资产报警管理系统,采用智能感应原理对物品进行自动识别,并自动定位、智能报警。适用于工厂、仓库、货场的离位报警系统,可实现24小时不间断工作。当有人(包括人员、物品)非法闯入危险区域时,机器会发出警示声音,并可在5秒内自动触发离位检测装置。 离位监测装置是由报警主机和探测主机两部分组成。 当有人非法闯入危险区域时,可触发离位报警主机的信号(声光)报警并发出声光告警信息,同时也可以在离位监测装置和声光告警装置之间进行联动。 一、工作原理 报警主机具有声
    新导智能 2023-09-21 15:52 147浏览
  • 通用USB驱动提供广泛兼容性的方法主要有以下几个方面:遵循USB标准:通用USB驱动遵循USB标准,采用了USB协议和规范,以确保与各种USB设备进行通用的数据传输和通信。支持多种设备类型:通用USB驱动可以支持多种类型的USB设备,如USB闪存盘、USB摄像头、USB打印机等,涵盖了多种设备类别和品牌,使得更多的设备可以与通用USB驱动兼容。支持多个操作系统:通用USB驱动可以在多个操作系统上运行,如Windows、Linux、macOS等,进一步扩大了其兼容性范围。动态适配:通用USB驱动具
    丙丁先生 2023-09-22 08:40 27浏览
  • 在进入正题前,我们先来看看以下的使用情境,相信在座的你一定不陌生。有一位消费者为了有更好的存储体验,再加上自己本身的notebook也支持Thunderbolt 3/4,便在市面上买了一个Thunderbolt 3 的NMVe SSD。孰不知使用后才发现其SSD的读写速率并未达到Thunderbolt 3的规格水平,仅达到约USB3.2 Gen2左右的读写速率。不但不符合使用者期待,甚至连「堪用」都称不上。SSD的读写速率并未达到Thunderbolt 3的规格水平,传输效能的低落让使用者体验大
    百佳泰测试实验室 2023-09-21 16:14 173浏览
  • 需要使用RFID工刀具系统的应用主要是因为传统的纸质记录或是电脑登记都十分依赖人工,出现大量使用情况时无法落实到位,以及工具经手人的信息容易混淆或者冒用,给管理带来非常大的影响。这些情况主要体现在以下几个方面:提高工作效率:传统的刀具管理方式可能需要手动记录、盘点和搜索工刀具,耗费大量时间和人力资源。而RFID工刀具管理系统可以实现自动识别、追踪和定位,简化了刀具管理流程,提高了工作效率。减少误用和丢失:在繁忙的生产环境中,工刀具可能会因为被放错位置或被未授权使用而导致误用或丢失。通过RFI
    新导智能 2023-09-21 16:03 176浏览
  • CDC驱动类型的特点主要有以下几个方面:通用性:CDC驱动是针对USB设备的通用驱动,适用于各种支持USB接口的设备,无论设备是哪种类型或用途。兼容性:CDC驱动可以与几乎所有的主流操作系统兼容,如Windows、Linux、Android等。这使得设备可以方便地在各种平台上使用。灵活性:CDC驱动提供了丰富的接口和功能,可以根据设备的具体需求进行定制和扩展。例如,可以添加额外的数据处理逻辑,或者实现特定设备的特定功能。高效性:CDC驱动通常具有较高的数据传输速率,可以满足许多高带宽应用的需求。
    丙丁先生 2023-09-22 08:42 20浏览
  • 工厂人员定位系统是指能够对工厂中的人员、车辆、设备等进行定位,实现对人员和车辆的实时监控与调度的系统,是智慧工厂建设中必不可少的一环。由于工厂的工作环境比较复杂,如果管理不当,容易发生安全隐患。在管理上,人员定位系统能够有效地帮助工厂实现对员工的管理,提高了企业的效率。同时,在发生安全事故时,定位系统可以提供及时、准确的救援措施。 苏州新导自主研发的工厂人员定位系统主要是利用定位标签作为主要监测对象,实现对生产现场人员、设备、仓库等的实时监测,可以有效地加强对工厂内安全管理与应急处理。
    新导智能 2023-09-21 16:10 142浏览
  • 9月20日,“增芯项目封顶仪式”在增城举行,这意味着国内首条MEMS 12英寸晶圆量产线的建设将进入下一个阶段。该项目进度如何?什么时候投产?增芯项目将成为广东省建设“集成电路第三极”的突破口?详情请看下文。中国首条MEMS 12英寸量产线封顶,总投资370亿,明年6月1日投产!广东再添第三座智能传感器产业园!据增芯科技官方公众号消息,昨日(9月20日)上午,广州增城智能传感器产业园发布暨增芯项目封顶活动在增城开发区增芯产业项目园举行。增芯项目,全称为增芯12英寸先进智能传感器及特色工艺晶圆制造
    传感器专家网 2023-09-21 20:03 28浏览
  • CDC(串行通信接口)的驱动类型通常分为以下几种:源同步驱动:源同步驱动器使用时钟信号来同步数据传输。这种类型的驱动器在发送数据的同时,提供一个时钟信号,以确保接收器和发送器之间的同步。非源同步驱动:非源同步驱动器不使用时钟信号来同步数据传输。这种类型的驱动器通常需要接收器提供一个时钟信号,以确定何时采样数据。差分驱动:差分驱动器通过发送两个极性相反的信号来传输数据。这种类型的驱动器具有较好的抗干扰能力,因为它们对噪声的影响不敏感。单端驱动:单端驱动器通过发送一个单一信号来传输数据。这种类型的驱
    丙丁先生 2023-09-22 08:44 22浏览
  • 据传感器专家网获悉,9月21日上午,蔚来在上海举办NIOIN2023蔚来创新科技日,其中值得注意的是,蔚来推出了其首款自研芯片——激光雷达主控芯片“杨戬”,该芯片预计于10月量产。根据李斌介绍,“杨戬”芯片是蔚来智能硬件团队发布的第一颗自研芯片,型号为NX6031,号称业界首颗自研激光雷达主控芯片,中文名“杨戬”,寓意汽车的第三只眼睛,采用8核64位处理器,提供了强大的计算支撑,并且加配8通道9bit的ADC,采样率高达1GHz,可高效捕获激光雷达传感器的原始数据。据介绍,NX6031作为面向激
    传感器专家网 2023-09-21 19:50 24浏览
  • 我们的智慧校园解决方案旨在运用WiFi定位技术,提供全面且准确的学校人员定位服务。这种系统功能可以使学校管理者更好地了解整个校园内各个区域的人流状况,并为学生、教职工及访客们提供更加便捷的服务和增强校园安全管理。 系统功能 1. 实时位置追踪和监控 通过收集校园内的WiFi信号强度和连接信息,系统能够准确追踪和监控学校人员的实时位置。这种功能可以帮助校方了解每个区域的人流密度,更好地进行资源调配和管理。以下是Wi-Fi定位在校园中实施和应用的一些方面: 基站部署:校园内需要安装足够数量的
    新导智能 2023-09-21 16:02 150浏览
  • 实现高效的应急物资管理是确保应急响应和灾害救援工作顺利进行的关键环节。下面是一些实现高效应急物资管理的关键步骤和建议: 1. 建立细致的物资清单:制定详细的物资清单,包括各类物资的名称、规格、数量、储存位置等信息。同时,标注每一种物资的有效期限,确保物资及时更新和替换。 2. 建立物资采购渠道:与信誉良好的供应商建立合作关系,确保及时供应高质量的物资。同时,建立备选供应商的清单,以应对紧急情况下的物资短缺或供应中断。 3. 实施库存管理系统:使用物资管理软件或手动管理系统,准确
    新导智能 2023-09-21 15:57 174浏览
我要评论
0
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦