初出茅庐的小李博客之按键驱动库使用
驱动库介绍
源码地址:https://github.com/jiejieTop/ButtonDrive
使用只需3步,创建按键,按键事件与回调处理函数链接映射,周期检查按键,支持单双击、连按、长按;采用回调处理按键事件(自定义消抖时间)
按键代码想必做嵌入式开发的无人不知无人不晓吧,但是真的在项目中我们的按键不仅仅是一个按钮那么简单,可能会涉及到长按
双击、单机、连击等操作。举个日常生活中的理解,比如我们在机场经常会可以看到免费的饮水机,一般都是三个按钮,一个是热水开关、一个是常温水开关、还有一个是童锁开关,为什么会设置这个童锁开关呢,我想这里应该是处于安全考虑,一般冷水都是按一下开再按一下就关这个逻辑很清晰,热水也是一样,但是热水比较危险如果小孩子不慎触碰就会有烫伤危险所以童锁的按钮就显得比较重要了,童锁也是一个普通按钮只不过童锁一般都需要长按解锁,虽然叫童锁其实也是大人锁,这个按钮一般都是要长按解锁后再开启热水的开关这样做就会比较安全。假设我们需要这样的功能,那么这个驱动库就比较有用了。
移植适配
1.下载源码

准备好自己的工程
-
自己的工程中需要适配一下底层IO口的配置
-
再一个就是移植修改两个读取IO电平状态的接口

-
创建两个按钮并且编写其按下后回调函数
Button_t Button1;/*创建一个按钮Button1*/
Button_t Button2; /*创建一个按钮Button2*//*按钮1单击执行动作*/
void Btn1_Dowm_CallBack(void *btn)
{PRINT_INFO("Button1 单击!");
}
/*按钮1双击执行动作*/
void Btn1_Double_CallBack(void *btn)
{PRINT_INFO("Button1 双击!");
}
/*按钮1长按执行动作*/
void Btn1_Long_CallBack(void *btn)
{PRINT_INFO("Button1 长按!");
}
/*按钮1连按执行动作*/
void Btn1_Continuos_CallBack(void *btn)
{PRINT_INFO("Button1 连按!");
}
/*按钮1连按释放执行动作*/
void Btn1_ContinuosFree_CallBack(void *btn)
{PRINT_INFO("Button1 连按释放!");
}/*按钮2单击执行动作*/
void Btn2_Dowm_CallBack(void *btn)
{PRINT_INFO("Button2 单击!");
}
/*按钮2双击执行动作*/
void Btn2_Double_CallBack(void *btn)
{PRINT_INFO("Button2 双击!");
}
/*按钮2长按执行动作*/
void Btn2_Long_CallBack(void *btn)
{PRINT_INFO("Button2 长按!");
}
/*按钮2连按执行动作*/
void Btn2_Continuos_CallBack(void *btn)
{PRINT_INFO("Button2 连按!");
}
/*按钮2连按释放执行动作*/
void Btn2_ContinuosFree_CallBack(void *btn)
{PRINT_INFO("Button2 连按释放!");
}
编写测试程序
- 编写测试按钮前适配一下串口方便打印调试信息
- 把两个按钮的底层先初始化一下可以读取IO口状态
- Button_Process(); 需要周期调用按键处理函数直接放while循环
int main(void)
{LED_Config();KEY_Config();USART1_Config();//RS485_Config();/* 打印信息 */PRINT_INFO("welcome to learn jiejie stm32 library!\n");Button_Create("Button1",&Button1,Read_Button1_Level, HIGH);Button_Attach(&Button1,BUTTON_DOWM,Btn1_Dowm_CallBack); //单击Button_Attach(&Button1,BUTTON_DOUBLE,Btn1_Double_CallBack); //双击Button_Attach(&Button1,BUTTON_CONTINUOS,Btn1_Continuos_CallBack); //连按 Button_Attach(&Button1,BUTTON_CONTINUOS_FREE,Btn1_ContinuosFree_CallBack); //连按释放 Button_Attach(&Button1,BUTTON_LONG,Btn1_Long_CallBack); //长按Button_Create("Button2",&Button2, Read_Button2_Level, LOW);Button_Attach(&Button2,BUTTON_DOWM,Btn2_Dowm_CallBack); //单击Button_Attach(&Button2,BUTTON_DOUBLE,Btn2_Double_CallBack); //双击Button_Attach(&Button2,BUTTON_CONTINUOS,Btn2_Continuos_CallBack); //连按Button_Attach(&Button2,BUTTON_CONTINUOS_FREE,Btn2_ContinuosFree_CallBack); //连按释放Button_Attach(&Button2,BUTTON_LONG,Btn2_Long_CallBack); //长按Get_Button_Event(&Button1);Get_Button_Event(&Button2);while(1) {
// if((GPIOA->IDR & 1<<0) ==0)
// {
// LED1_ONOFF(1);
// }
// else
// {
// LED1_ONOFF(0);
// }Button_Process(); //需要周期调用按键处理函数Delay_Nms(20);}
}
思考:这个周期性调用的函数既然是周期性调用在定时器调用应该更合适。
验证测试效果
单击效果:

双击效果:

双击其实就是在设定的时间内快速按下两下并抬起两下,跟鼠标打开浏览器网页类似的操作。
长按测试:

长按就是按住一个按钮不松,周期性检测状态移植没有发生改变。操作跟我们按住电脑上的音量加一直不松开的操作类似。

连按测试:

连按跟长按的区别 连按是连续触发 不分单机还是双击 ,长按是按着不松开 计算时间 作用不一样 这个要根据项目需要去使用 是否支持连续按下。
最后
该库还支持在操作系统上使用,感兴趣的兄弟可以参考源码链接说明
版权和许可
ButtonDrive 遵循 Apache License v2.0 开源许可协议,可以免费在商业产品中使用,并且不需要公开私有代码。
Apache License v2.0 鼓励代码共享和尊重原作者的著作权,可以自由的使用,修改源代码,也可以将修改后的代码作为开源或者专有软件再发布(作为开源或闭源商业软件),但必须根据协议保留原作者版权声明。
相关文章:
初出茅庐的小李博客之按键驱动库使用
驱动库介绍 源码地址:https://github.com/jiejieTop/ButtonDrive 使用只需3步,创建按键,按键事件与回调处理函数链接映射,周期检查按键,支持单双击、连按、长按;采用回调处理按键事件(自定义消…...
如何调试Linux内核?
通过创建一个最小的根文件系统,并使用QEMU和GDB进行调试。 1.准备工作环境 确保系统上安装了所有必要的工具和依赖项。 sudo apt-get update //更新一下软件包 sudo apt-get install build-essential git libncurses-dev bison flex libssl-dev qemu-system-x…...
ECharts组件封装教程:Vue3中的实践与探索
在日常的前端开发中,ECharts 作为一款强大且易用的图表库,被广泛应用于数据可视化场景。为了更好地在 Vue3 项目中复用 ECharts 功能,我们可以将其封装成一个组件。本文将带大家一步步实现 ECharts 的 Vue3 组件封装,并演示如何在父组件中调用和使用。 一、封装 ECharts 组…...
NAT 代理服务 内网穿透
🌈 个人主页:Zfox_ 🔥 系列专栏:Linux 目录 一:🔥 NAT 技术背景二:🔥 NAT IP 转换过程三:🔥 NAPT四:🔥 代理服务器🦋 正向…...
CAN硬件协议详解
一、基本理论: 1、CAN的总线结构: CAN总线 网络结构 有 闭环和开环 两种形式;无论实际的网络多复杂,都离不开这两种基本结构。 闭环结构的CAN总线网络,总线的两端各并联一个120Ω的电阻,两…...
网络安全等级保护:网络安全等级保护基本技术
下面我们概括性探讨一下等级保护用到的一些技术,有关这些技术的每一个方面的每一个部分都可以是一部大块头,甚至一部大块头都无法介绍清楚,需要系列性的书籍去展开,所以这里也只能做到抛砖而已。期望起到抛砖引玉的作用࿰…...
信刻光盘安全隔离与信息交换系统让“数据摆渡”安全高效
随着数据传输、存储及信息技术的飞速发展,信息安全保护已成为重中之重。各安全领域对跨网数据交互的需求日益迫切,数据传输的安全可靠性成为不可忽视的关键。为满足业务需求并遵守保密规范,针对于涉及重要秘密信息,需做到安全的物…...
数据结构课程设计(java实现)---九宫格游戏,也称幻方
【问题描述】 九宫格,一款数字游戏,起源于河图洛书,与洛书是中国古代流传下来的两幅神秘图案,历来被认为是河洛文化的滥觞,中华文明的源头,被誉为"宇宙魔方"。九宫格游戏对人们的思维锻炼有着极大…...
[思考记录]AI时代下,悄然的改变
尝试用 xAI-Grok 去了解DS开源周的信息,有那么点被Grok的输出惊艳到。“请你以技术编辑的角色,重点参考官方文档,介绍DeepSeek开源周的内容,写一篇技术分享文章。”,得到的文字看起来很是舒服,内容靠谱、结…...
JAVA笔记【一】
现实 (抽象) 类 (创建) 对象 特点: 1.面向对象 2.跨平台 3.安全性 4.多线程 java程序基本结构 1. java源代码文件实际是普通的文本文件,源代码文件必须是.java扩展名,且必须小写 2. …...
[Java基础] 常用注解
文章目录 1. 元注解2. 非元注解2.1 常用JDK自带注解2.2 常用Spring相关注解2.2.1 在Spring框架中,注解用于简化配置和增强代码的可读性。以下是常用的Spring注解的一部分2.2.2 针对controller的相关注解2.2.3 AOP相关注解2.2.4 Enable系列注解 2.3 常用Lombok注解 1…...
uvm中的run_test作用
在SystemVerilog和UVM验证环境中,run_test() 是启动UVM仿真流程的核心函数。它负责初始化UVM框架、创建测试用例实例,并触发UVM的Phase机制来执行验证环境的构建和运行 1. run_test() 的作用 run_test() 是UVM提供的内置函数,定义在UVM库中…...
brew search报错,xcrun:error:invalid active developer path CommandLineTools
问题出现的原因 出现“xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun”错误,通常是因为Xcode命令行工具未正确安装或其路径已损坏。以下是几种常见的…...
C#内置委托(Action)(Func)
概述 在 C# 中,委托是一种类型,它表示对具有特定参数列表和返回类型的方法的引用。C# 提供了一些内置委托,使得开发者可以更方便地使用委托功能,无需手动定义委托类型。本文将详细介绍 Action 和 Func 这两个常用的内置委托。 A…...
kubernetes 部署项目
随着容器化技术的发展,使用Kubernetes(简称K8s)来部署和管理应用已经成为现代软件开发的标准实践之一。Kubernetes提供了一套强大的工具集,使得部署、扩展和管理应用程序变得更为简便高效。本文将带你走过从准备环境到部署一个实际…...
《几何原本》命题I.2
《几何原本》命题I.2 从一个给定的点可以引一条线段等于已知的线段。 设 A A A 为给定点, B C BC BC 为给定线段 连接 A B AB AB,作等边 △ A B D \triangle ABD △ABD 以 B B B 为圆心, B C BC BC 为半径作小圆 延长 D B DB DB 交小圆…...
【我的 PWN 学习手札】House of Kiwi
House of Kiwi 之前我们利用IO_FILE一般是通过劫持vtable来实现的, House of Kiwi虽然不是通过劫持vtable来实现,但实质上是劫持vtable指向的全局的_IO_file_jumps_表来实现的。注意:对于某些版本的glibc,_IO_file_jumps_并不可写…...
nvm的学习
学习 nvm(Node Version Manager) 是掌握 Node.js 开发的关键技能之一。以下是系统的学习路径和实战指南,涵盖从基础到进阶的内容: 一、基础入门 1. nvm 的核心作用 多版本共存:安装和管理多个 Node.js 版本ÿ…...
haclon固定相机位标定
什么是标定? 工业应用中相机拍到一个mark点的坐标为C1(Cx,Cy),C1点对应的龙门架/机械手等执行端对应的坐标是多少? 标定就是解决这个问题,如相机拍到一个点坐标C1(Cx,Cy),…...
stm32(hal库)学习笔记-时钟系统
在stm32中,时钟系统是非常重要的一环,他控制着整个系统的频率。因此,我们有理由好好学一下时钟系统。 什么是时钟? 时钟是具有周期性的脉冲信号,一般我们常用占空比为50%的方波。可以形象的说,时钟就是单…...
解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
从面试角度回答Android中ContentProvider启动原理
Android中ContentProvider原理的面试角度解析,分为已启动和未启动两种场景: 一、ContentProvider已启动的情况 1. 核心流程 触发条件:当其他组件(如Activity、Service)通过ContentR…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...
《Offer来了:Java面试核心知识点精讲》大纲
文章目录 一、《Offer来了:Java面试核心知识点精讲》的典型大纲框架Java基础并发编程JVM原理数据库与缓存分布式架构系统设计二、《Offer来了:Java面试核心知识点精讲(原理篇)》技术文章大纲核心主题:Java基础原理与面试高频考点Java虚拟机(JVM)原理Java并发编程原理Jav…...
文件上传漏洞防御全攻略
要全面防范文件上传漏洞,需构建多层防御体系,结合技术验证、存储隔离与权限控制: 🔒 一、基础防护层 前端校验(仅辅助) 通过JavaScript限制文件后缀名(白名单)和大小,提…...
qt 双缓冲案例对比
双缓冲 1.双缓冲原理 单缓冲:在paintEvent中直接绘制到屏幕,绘制过程被用户看到 双缓冲:先在redrawBuffer绘制到缓冲区,然后一次性显示完整结果 代码结构 单缓冲:所有绘制逻辑在paintEvent中 双缓冲:绘制…...
