09-独立按键的长按和短按

独立按键的长按和短按

1. 硬件部分

1.1 按键简介

image-20210828093632609

1.2 按键抖动

image-20210828093737695

1.3 按键识别

image-20210828093819733

按键长按与短按判别流程图

image-20210828093849710

1.4 按键选择

image-20210821160304352

2. 软件编程

2.1 框架式编程结构搭建

  1. 新建ROTARY_Drive.c,ROTARY_Drive.h

image-20210821160642390

  1. 保存

  2. 添加进工程

image-20210821160827576

  1. 打标签

image-20210821161004506

  1. all.h包含LCD1602_Ser.h

image-20210821161038521

  1. ROTARY_Drive.c包含all.h

image-20210821161219223

2.2 初始化

  1. 定义管脚,并设置标准IO模式

image-20210821162945512

image-20210828094958687

  1. 初始化函数,并声明,主函数里调用

image-20210821163024503

image-20210821163041333

image-20210821163057867

2.3 按键扫描数据分配

  1. 定义按键读取函数,外部声明

image-20210821163114297

image-20210821163122631

  1. 主函数里新建数据分配函数,按键读取函数包含在内,主函数调用

image-20210821163153544

image-20210821163205608

测试:简单判断按键的按下,放开

判断按键值0/1,数码管输出结果

image-20210821163720168

定义变量读取按键并输出,外部声明

image-20210821163731895

image-20210821163741079

测试1:变量赋值并通过数码管显示

字节型变量,需要3位数码管显示十进制

image-20210821164307592

image-20210821164340441

测试2:按键放开25,按下100

image-20210821164615786

2.4 按键检测

总图:

image-20210821212631723

按键状态:

ROTARY_MUTE==0 按下

ROTARY_MUTE==1 释放

消抖,延时

image-20210821212812779

划分两种状态

image-20210821212840557

短按

image-20210821213011406

image-20210821213029420

长按

image-20210821213558511

image-20210821213947454

上述代码是最简单的长短按判断

由图可发现flag1的作用:

长按释放后不会被判断为短按,将退出

宏定义几种按键的动作

image-20210821214148793

使用场景测试
  1. 长按 短按连续++

新开变量,并声明,同时数码管显示改由此变量赋值

image-20210821214607850

image-20210821214557069

此时短按、长按可以不断累加值

  1. 长按一次和长按不放的区别

长按1次执行1次对应结果,不会连续执行长按结果

引入flag2

image-20210821215751094

判为长按,flag2便写0

只有当按键释放,flag2=1重新导通开关

下一次长按才执行长按输出

image-20210821215822911

  1. 短按+1,长按自动++

image-20210821220022480

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Arduino可以通过检测按键的状态来区分按和短按。一般情况下,我们可以使用digitalRead函数来读取按键的状态,当按键按下时,digitalRead函数会返回HIGH,当按键松开时,digitalRead函数会返回LOW。根据这个原理,我们可以编写程序来检测按键的状态,从而实现按和短按的功能。 以下是一个简单的Arduino代码示例,用于检测按键的状态: ``` const int buttonPin = 2; // 按键连接的引脚 int buttonState = 0; // 按键状态 unsigned long startTime; // 记录按键按下的时间 void setup() { pinMode(buttonPin, INPUT); Serial.begin(9600); } void loop() { // 读取按键状态 buttonState = digitalRead(buttonPin); // 当按键按下时,记录按下的时间 if (buttonState == HIGH) { startTime = millis(); } // 当按键松开时,判断按键按下的时间 if (buttonState == LOW) { unsigned long duration = millis() - startTime; // 如果按键按下的时间小于500毫秒,认为是短按 if (duration < 500) { Serial.println("Short press"); } // 如果按键按下的时间大于500毫秒,认为是按 if (duration > 500) { Serial.println("Long press"); } } } ``` 上述代码中,我们首先定义了一个按键连接的引脚和一个记录按键状态的变量。在setup函数中,我们将该引脚设置为输入模式,并初始化串口通信。在loop函数中,我们首先读取按键的状态,如果按键处于按下状态,我们就记录按下的时间。当按键松开时,我们计算按键按下的时间,并根据时间度判断是短按还是按。如果按键按下的时间小于500毫秒,我们就认为是短按;如果按键按下的时间大于500毫秒,我们就认为是按。最后,我们使用Serial.println函数将结果输出到串口上。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值