单片机_按键——单击,双击,长按

#define KEY_DOWN_return           1  //单击
#define KEY_Double_return         2  //双击
#define KEY_Long_return           3  //长按
#define KEY_LONG_FREE_return      6  //长按结束#define double_time_MIN       80  //双击按键,在这个时间范围内,按下两次则认为有效
#define Long_press_time_MAX   120  //长按,超过这个时间则认为是长按;
#define Dithering_MIN         5  //消抖值
#define UP_KEY_Count        5  //抬起值#define KEY_UP      1//按键抬起
#define KEY_Down    0//按键按下#define KEY_Number_MAX  1 //按键个数,开辟多少字节数组#define KEY1_adder    0 //按键计数数组地址
//#define KEY2_adder   1 //按键计数数组地址
//#define KEY3_adder   2 //按键计数数组地址#define  Read_Key1_Value    GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_10)//读取按键1的值unsigned int  KEY_Count_time[KEY_Number_MAX];//按键计时,调用的时候,要填按键地址,避免重复
unsigned char KEY_up_clsse_time[KEY_Number_MAX];//按键抬起取消计时,
unsigned char KEY_Count_down[KEY_Number_MAX];//按键按下次数
unsigned char KEY_Dithering[KEY_Number_MAX];//按键消抖unsigned char KEY_event[KEY_Number_MAX];//按键的事件
unsigned char KEY_Read[KEY_Number_MAX];//按键读取状态/** @name   Button_all_state* @brief  MUC按键检测* @param* @retval None* othen: 历遍所有的按键
*/
void  Button_all_state()
{KEY_Read[KEY1_adder]=Read_Key1_Value;//  KEY_event[KEYX_adder]=Read_KeyX_Value;
}
/** @name   KEY_Detect* @brief* @param* @retval None* othen:按键检查函数,传递不同的值,实现不同的按键按下
*/
void  KEY_Detect()
{unsigned char i=0;Button_all_state();//更新按键状态for(i=0;i<KEY_Number_MAX;i++) //历遍{if(KEY_Read[i]==KEY_Down)//按键按下{if(KEY_Dithering[i] > Dithering_MIN)//消抖值{if(KEY_Count_time[i] >= Long_press_time_MAX){KEY_event[i] = KEY_Long_return;}else{KEY_Count_time[i]++;}if(KEY_up_clsse_time[i] != 0){KEY_up_clsse_time[i] =0;KEY_Count_down[i]++;}}else{KEY_Dithering[i]++;KEY_Read[i]=0;//按键刷新}}else//按键松开{if( ++KEY_up_clsse_time[i] > UP_KEY_Count) {//按键抬起if ((KEY_Count_time[i] < double_time_MIN)&& ( KEY_Count_down[i] >= 2) ) { //双击KEY_event[i] =  KEY_Double_return;KEY_up_clsse_time[i] = UP_KEY_Count;}else if((KEY_Count_time[i] > 1)&&(KEY_Count_time[i] < Long_press_time_MAX)){ //单击KEY_event[i] = KEY_DOWN_return ;KEY_up_clsse_time[i] = UP_KEY_Count;}else if(KEY_Count_time[i] > Long_press_time_MAX){ //长按抬起KEY_event[i] = KEY_LONG_FREE_return;KEY_up_clsse_time[i] = UP_KEY_Count;}KEY_up_clsse_time[i] =0;KEY_Count_time[i]= 0;//按键计时更新KEY_Dithering[i] = 0;//消抖更新KEY_Read[i]=0;//按键刷新KEY_Count_down[i]=0;}}}
}

调用

          KEY_Detect();if(KEY_event[KEY1_adder] ==  KEY_DOWN_return ){printf("单击\r\n");KEY_event[KEY1_adder]=0;}else if(KEY_event[KEY1_adder] ==  KEY_Double_return  ){printf("双击\r\n");KEY_event[KEY1_adder]=0;}else if(KEY_event[KEY1_adder] ==  KEY_Long_return ){printf("长按\r\n");KEY_event[KEY1_adder]=0;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/6436.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java当中的深拷贝和浅拷贝

文章目录 一、前提二、浅拷贝1. BeanUtils实现浅拷贝 三、深拷贝1. 实现Cloneable接口并重写clone()方法&#xff1a;2. 使用序列化与反序列化&#xff1a; 一、前提 在计算机的内存中&#xff0c;每个对象都被赋予一个地址&#xff0c;该地址指向对象在内存中存储的位置。当我…

数据结构和算法解析:排序问题简易总结

直接插入排序 直接插入排序&#xff08;Straight Insertion Sorting&#xff09;的基本思想&#xff1a;在要排序的一组数中&#xff0c;假设前面(n-1) [n>2] 个数已经是排好顺序的&#xff0c;现在要把第n个数插到前面的有序数中&#xff0c;使得这n个数也是排好顺序的。如…

centos7部署websocket

django项目&#xff0c;中间使用websocket进行通讯&#xff0c;想部署到服务器上&#xff0c;按照之前部署项目的思路进行部署&#xff0c;但是失败了。解决了一下&#xff0c;在此记录。 主项目下有一子app&#xff0c;一模版文件&#xff0c;一静态文件。项目中主要用到dweb…

Factorization Machines(论文笔记)

样例一&#xff1a; 一个简单的例子,train是一个字典&#xff0c;先将train进行“one-hot” coding&#xff0c;然后输入相关特征向量&#xff0c;可以预测相关性。 from pyfm import pylibfm from sklearn.feature_extraction import DictVectorizer import numpy as np tra…

【MATLAB第59期】基于MATLAB的混沌退火粒子群CSAPSO-BP、SAPSO-BP、PSO-BP优化BP神经网络非线性函数拟合预测/回归预测对比

【MATLAB第59期】基于MATLAB的混沌退火粒子群CSAPSO-BP、SAPSO-BP、PSO-BP优化BP神经网络非线性函数拟合预测/回归预测对比 注意事项 不同版本matlab 不同电脑 加上数据集随机&#xff0c;BP权值阈值随机&#xff0c;进化算法种群随机&#xff0c;所以运行结果不一定和我运行…

集成了32位Cortex®M0内核XMC1302T038X0200AB、XMC1302Q040X0200AB 32MHz 200KB 闪存 工业MCU

XMC1000 32位工业 MCU 将 ARM Cortex™-M0 核心与领先的 65nm 制造工艺相结合&#xff0c;克服了目前 8 位设计的局限。XMC1000系列让目前的 8 位用户有机会享受 32 位的功耗&#xff0c;同时不在价格或易用性上做出妥协。XMC1000 在其细分市场提供最为广泛的闪存产品线&#x…

3分钟,快速上手Postman接口测试

Postman是一个用于调试HTTP请求的工具&#xff0c;它提供了友好的界面帮助分析、构造HTTP请求&#xff0c;并分析响应数据。实际工作中&#xff0c;开发和测试基本上都有使用Postman来进行接口调试工作。有一些其他流程的工具&#xff0c;也是模仿的Postman的风格进行接口测试工…

下载|GitLab 2023 年 DevSecOps 全球调研报告:安全左移深入人心、AI/ML 蔚然成风

目录 谁应该对应用程序安全负主要责任&#xff1f; 安全实践的最大挑战 AI 驱动研发&#xff0c;提升研发效率 各个角色使用的工具数量是多少&#xff1f; 一体化 DevSecOps 平台有哪些优势&#xff1f; 56%、74%、71%、65%、57% 这些数字和 DevSecOps 结合在一起&#xf…

android adb命令获取处于当前屏幕的Activity

android adb命令获取处于当前屏幕的Activity 使用adb命令&#xff1a; adb shell dumpsys activity activities 输出&#xff0c;例如: ACTIVITY MANAGER ACTIVITIES (dumpsys activity activities) Display #0 (activities from top to bottom): * Task{38ef601 #5281 typ…

Java当中的栈

栈的理解 栈&#xff08;Stack&#xff09;是一种受限的线性数据结构&#xff0c;所谓受限是指栈只暴露栈顶和栈底的操作&#xff0c;其底层是由数组实现的。栈的特性是先进后出。 常用方法 注意上面的peek()方法和pop()方法的区别&#xff01; 实例 import java.util.Stack…

grpc中间件之链路追踪(otel+jaeger)

参考文档 https://github.com/grpc-ecosystem/go-grpc-middleware/blob/main/examples/client/main.go https://github.com/grpc-ecosystem/go-grpc-middleware/blob/main/examples/server/main.go https://github.com/open-telemetry/opentelemetry-go/blob/main/example/jaeg…

【Rust 基础篇】Rust 通道实现单个消费者多个生产者模式

导言 在 Rust 中&#xff0c;我们可以使用通道&#xff08;Channel&#xff09;来实现单个消费者多个生产者模式&#xff0c;简称为 MPMC。MPMC 是一种常见的并发模式&#xff0c;适用于多个线程同时向一个通道发送数据&#xff0c;而另一个线程从通道中消费数据的场景。本篇博…

搭建elasticsearch过程中遇到问题记录

##1.新建用户 解压es之前&#xff0c;新建用户做后续操作&#xff0c;root用户无法启动es。 ##2.增大普通用户可打开最大文件数 ##3.增大普通用户可启动线程数 ##4.增大用户可使用虚拟内存 编辑 /etc/sysctl.conf&#xff0c;追加以下内容&#xff1a; vm.max_map_count262144…

sql中group by 的使用

1、概述 Group By 从字面意义上理解就是根据By指定的规则对数据进行分组&#xff0c;所谓的分组就是将一个数据集划分为若干个小区域&#xff0c;然后针对若干个小区域进行数据处理 2、原始表 3、简单的Group By 示例1 select 类别&#xff0c;数量 as 数量之和 from A gro…

android studio 离线打包配置push模块

1.依赖引入 SDK\libs aps-release.aar, aps-unipush-release.aar, gtc.aar, gtsdk-3.2.11.0.aar, 从android studio的sdk中找到对应的包放到HBuilder-Integrate-AS\simpleDemo\libs下面 2.打开build.gradle&#xff0c;在defaultConfig添加manifestPlaceholders节点&#xff0c…

【代码随想录 | Leetcode | 第十天】哈希表 | 三数之和 | 四数之和

前言 欢迎来到小K的Leetcode|代码随想录|专题化专栏&#xff0c;今天将为大家带来哈希法~三数之和 | 四数之和的分享✨ 目录 前言15. 三数之和18. 四数之和总结 15. 三数之和 ✨题目链接点这里 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], num…

JVM运行时区域——对象创建内存分配过程

新创建的对象&#xff0c;都存放在伊甸园区域&#xff0c;当垃圾回收时&#xff0c;将伊甸园区域的垃圾数据销毁&#xff0c;然后将存活的对象转移到幸存者0区域&#xff0c;之后创建的新的对象还是存放在伊甸园区域&#xff0c;等到再次垃圾回收后&#xff0c;将伊甸园区域和幸…

RabbitMQ帮助类的封装

RabbitMQ帮助类的封装 基本部分 public class RabbitMQInvoker {#region Identy private static IConnection _CurrentConnection null;private readonly string _HostName null;private readonly string _UserName null;private readonly string _Password null;#endreg…

开篇词 | 「安卓学习路线」

操作系统 Java 集合、反射、泛型、并发编程&#xff08;线程安全&#xff0c;锁机制、线程隔离&#xff09;&#xff0c;IO 流&#xff0c;JVM&#xff08;内存结构、垃圾回收&#xff09; 安卓&#xff08;通过实践项目来学习基础知识&#xff09; 基础知识 Activity 和 Ser…

HTML5——基础知识及使用

HTML 文件基本结构 <html><head><title>第一个页面</title></head><body>hello world</body> </html> html 标签是整个 html 文件的根标签(最顶层标签).head 标签中写页面的属性.body 标签中写的是页面上显示的内容.title 标…