Arduino程序设计(四)按键消抖+按键计数_arduino按键计数代码(2)

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新大数据全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注大数据)
img

正文

int lastButtonState = HIGH; // 上一次的按键状态
unsigned long lastDebounceTime = 0; // 上一次的触发时间
unsigned long debounceDelay = 10; // 消抖延时

void setup() {
pinMode(buttonPin, INPUT_PULLUP);
pinMode(ledPin,OUTPUT);
}

void loop() {
int reading = digitalRead(buttonPin); // 读取按键引脚状态

// 如果当前状态与上一次状态不同,更新上一次状态和触发时间
if (reading != lastButtonState) {
lastDebounceTime = millis();
}

// 如果经过了消抖延时,且当前状态与按键状态不同,更新按键状态
if ((millis() - lastDebounceTime) > debounceDelay) {
if (reading != buttonState) {
buttonState = reading;

  // 按键按下时执行的操作
  if (buttonState == HIGH) {
    digitalWrite(ledPin, HIGH);
    delay(50);
    digitalWrite(ledPin, LOW);
  }
}

}

lastButtonState = reading;
}


## 二、按键计数


### 1、示例代码


* 使用Arduino来实现按键计数。简单的示例代码如下:



//按键计数示例
const int buttonPin = 2; // 按钮连接到数字引脚2
int buttonState = 0; // 保存按钮状态
int count = 0; // 计数器

void setup() {
pinMode(buttonPin, INPUT); // 设置按钮引脚为输入模式
Serial.begin(9600); // 打开串口通信
}

void loop() {
buttonState = digitalRead(buttonPin); // 读取按钮状态

if (buttonState == HIGH) { // 如果按钮按下
count++; // 计数器加1
Serial.print("Button pressed. Count: ");
Serial.println(count);
delay(200); // 等待200毫秒,避免连续多次计数
}
}


示例中,我们将一个按钮连接到Arduino的数字引脚2。循环中,我们读取按钮的状态,如果按钮被按下(高电平),计数器就会加1,并通过串口打印出计数器的值。为了避免按钮按下时的抖动,我们在每次计数后延迟200毫秒。


上传这个代码到Arduino板,然后打开串口监视器(波特率设置为9600),当你按下按钮时,你将看到计数器的值递增。


### 2、按键计数实验


* (1)本实验采用Arduino UNO R3开发板及自主搭建电路的方式,实现预设功能。
* (2)按键计数的电路图如下图所示:  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/185a096da4d94290bf54d808c3759e62.png)
* (3)实现功能(基础):
* ① 第一次按下按键,LED1点亮;
* ② 第二次按下按键,LED1和LED2点亮;
* ③ 第三次按下按键,LED1~LED3点亮;
* ④ 第四次按下按键,LED1~LED4点亮;
* ⑤ 第五次按下按键,LED1~LED4熄灭;
* ⑥ 第六次按下按键,重复①现象;
* ⑦ 第七次按下按键,重复②现象……,以此类推。


**代码实现:**



//编写按键扫描程序,实现按键计数
/*实验现象:
① 第一次按下按键,LED1点亮;
② 第二次按下按键,LED1和LED2点亮;
③ 第三次按下按键,LED1~LED3点亮;
④ 第四次按下按键,LED1~LED4点亮;
⑤ 第五次按下按键,LED1~LED4熄灭;
⑥ 第六次按下按键,重复①现象;
⑦ 第七次按下按键,重复②现象……,以此类推。
*/

const int KEY = 7; //按键引脚
const int LED1 = 9; //LED1引脚
const int LED2 = 10; //LED2引脚
const int LED3 = 11; //LED3引脚
const int LED4 = 12; //LED4引脚

int KEY_count = 0; //按键计数

void setup()
{
pinMode(KEY, INPUT_PULLUP); //定义KEY为带上拉输入引脚
pinMode(LED1, OUTPUT); //定义LED1为输出引脚
pinMode(LED2, OUTPUT); //定义LED2为输出引脚
pinMode(LED3, OUTPUT); //定义LED3为输出引脚
pinMode(LED4, OUTPUT); //定义LED4为输出引脚
}

void loop()
{
ScanKey(); //按键扫描程序,当按键按下时候,该子程序会修改KEY_count的值

switch (KEY_count) {
case 0:
{
digitalWrite(LED1, LOW);
digitalWrite(LED2, LOW);
digitalWrite(LED3, LOW);
digitalWrite(LED4, LOW);
}
break;
case 1:
{
digitalWrite(LED1, HIGH);
}
break;
case 2:
{
digitalWrite(LED1, HIGH);
digitalWrite(LED2, HIGH);
}
break;
case 3:
{
digitalWrite(LED1, HIGH);
digitalWrite(LED2, HIGH);
digitalWrite(LED3, HIGH);
}
break;
case 4:
{
digitalWrite(LED1, HIGH);
digitalWrite(LED2, HIGH);
digitalWrite(LED3, HIGH);
digitalWrite(LED4, HIGH);
}
break;
default:
{
KEY_count = 0;
}
}
}

void ScanKey() //按键扫描程序
{
if (digitalRead(KEY) == LOW) //有按键按下
{
delay(10); //延时去抖动
if (digitalRead(KEY) == LOW) //有按键按下
{
KEY_count++; //按键计数
while (digitalRead(KEY) == LOW); //等待按键松手
}
}
}


* (4)实现功能(进阶):
* ① 第一次按下按键,LED1和LED3亮500ms后熄灭,间隔150ms后,LED2和LED4亮150ms后熄灭,间隔150ms后,LED1和LED3亮150ms后熄灭……,重复操作。
* ② 第二次按下按键,LED1~LED4从左往右依次点亮,等LED4熄灭后,再从左往右依次点亮,重复操作,相邻两个LED灯亮灭的时间间隔为50ms。
* ③ 第三次按下按键,LED1~LED4从右往左依次点亮,等LED1熄灭后,再从右往左依次点亮,重复操作,相邻两个LED灯亮灭的时间间隔为50ms。
* ④ 第四次按下按键,LED1~LED4从左往右依次点亮,再从右往左依次点亮,重复操作,相邻两个LED灯亮灭的时间间隔为50ms。
* ⑤ 第五次按下按键,LED1~LED4熄灭。
* ⑥ 第六次按下按键,重复①现象
* ⑦ 第七次按下按键,重复②现象……,以此类推。


**代码实现:**



//编写按键扫描程序,实现按键计数
//注意:按下按键后,即下一次按下按键前,时间间隔>10s
/*实验现象:
① 第一次按下按键,LED1和LED3亮150ms后熄灭,间隔150ms后,LED2和LED4亮150ms后熄灭,间隔150ms后,LED1和LED3亮150ms后熄灭……,重复操作。
② 第二次按下按键,LED1~LED4从左往右依次点亮,等LED4熄灭后,再从左往右依次点亮,重复操作,相邻两个LED灯亮灭的时间间隔为50ms。
③ 第三次按下按键,LED1~LED4从右往左依次点亮,等LED1熄灭后,再从右往左依次点亮,重复操作,相邻两个LED灯亮灭的时间间隔为50ms。
④ 第四次按下按键,LED1~LED4从左往右依次点亮,再从右往左依次点亮,重复操作,相邻两个LED灯亮灭的时间间隔为50ms。
⑤ 第五次按下按键,LED1~LED4熄灭。
⑥ 第六次按下按键,重复①现象
⑦ 第七次按下按键,重复②现象……,以此类推。
*/

const int KEY = 7; //按键引脚
const int LED1 = 9; //LED1引脚
const int LED2 = 10; //LED2引脚
const int LED3 = 11; //LED3引脚
const int LED4 = 12; //LED4引脚

int KEY_count = 0; //按键计数

void setup()
{
pinMode(KEY, INPUT_PULLUP); //定义KEY为带上拉输入引脚
pinMode(LED1, OUTPUT); //定义LED1为输出引脚
pinMode(LED2, OUTPUT); //定义LED2为输出引脚
pinMode(LED3, OUTPUT); //定义LED3为输出引脚
pinMode(LED4, OUTPUT); //定义LED4为输出引脚
}

void loop()
{
ScanKey(); //按键扫描程序,当按键按下时候,该子程序会修改KEY_count的值

switch (KEY_count) {
case 0:
{
digitalWrite(LED1, LOW);
digitalWrite(LED2, LOW);
digitalWrite(LED3, LOW);
digitalWrite(LED4, LOW);
}
break;
case 1:
{
//第一次按下按键
digitalWrite(LED1, HIGH);
digitalWrite(LED2, LOW);
digitalWrite(LED3, HIGH);
digitalWrite(LED4, LOW);
delay(150);
digitalWrite(LED1, !digitalRead(LED1));
digitalWrite(LED2, !digitalRead(LED2));
digitalWrite(LED3, !digitalRead(LED3));
digitalWrite(LED4, !digitalRead(LED4));
delay(150);
}
break;
case 2:
{
//刷新LED1~LED4状态
digitalWrite(LED1, LOW);
digitalWrite(LED2, LOW);
digitalWrite(LED3, LOW);
digitalWrite(LED4, LOW);

    //第二次按下按键
    digitalWrite(LED1, HIGH);
    delay(50);
    digitalWrite(LED1, !digitalRead(LED1));
    digitalWrite(LED2, HIGH);
    delay(50);
    digitalWrite(LED2, !digitalRead(LED2));
    digitalWrite(LED3, HIGH);
    delay(50);
    digitalWrite(LED3, !digitalRead(LED3));
    digitalWrite(LED4, HIGH);
    delay(50);
    digitalWrite(LED4, !digitalRead(LED4));
    delay(50);
  }
  break;
case 3:
  {
    //刷新LED1~LED4状态
    digitalWrite(LED1, LOW);
    digitalWrite(LED2, LOW);
    digitalWrite(LED3, LOW);
    digitalWrite(LED4, LOW);

    //第三次按下按键
    digitalWrite(LED4, HIGH);
    delay(50);
    digitalWrite(LED4, !digitalRead(LED4));
    digitalWrite(LED3, HIGH);
    delay(50);
    digitalWrite(LED3, !digitalRead(LED3));
    digitalWrite(LED2, HIGH);
    delay(50);
    digitalWrite(LED2, !digitalRead(LED2));
    digitalWrite(LED1, HIGH);
    delay(50);
    digitalWrite(LED1, !digitalRead(LED1));
    delay(50);
  }
  break;
case 4:
  {
    //刷新LED1~LED4状态
    digitalWrite(LED1, LOW);
    digitalWrite(LED2, LOW);
    digitalWrite(LED3, LOW);
    digitalWrite(LED4, LOW);

    //第四次按下按键
    digitalWrite(LED1, HIGH);
    delay(50);
    digitalWrite(LED1, !digitalRead(LED1));
    digitalWrite(LED2, HIGH);
    delay(50);
    digitalWrite(LED2, !digitalRead(LED2));
    digitalWrite(LED3, HIGH);
    delay(50);

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注大数据)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

talWrite(LED2, !digitalRead(LED2));
digitalWrite(LED3, HIGH);
delay(50);

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注大数据)
[外链图片转存中…(img-ikzyzHo3-1713273392944)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 26
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值