#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// 初始化 LiquidCrystal_I2C 类,参数依次为 I2C 地址,列数,行数
LiquidCrystal_I2C lcd(0x27, 16, 2);
// 定义按钮引脚
const int button1Pin = 25;
const int button2Pin = 32;
const int button3Pin = 34;
// 变量用于存储按钮按下的时间
volatile unsigned long button1PressedTime = 0;
volatile unsigned long button2PressedTime = 0;
volatile unsigned long button3PressedTime = 0;
void setup() {
// 初始化 LCD
lcd.init(); // 初始化 LCD
lcd.backlight(); // 打开背光
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Press buttons");
lcd.setCursor(0, 1);
lcd.print("to start timing");
// 设置按钮引脚为输入,并启用内部上拉电阻
pinMode(button1Pin, INPUT_PULLUP);
pinMode(button2Pin, INPUT_PULLUP);
pinMode(button3Pin, INPUT_PULLUP);
// 设置按钮的中断
attachInterrupt(digitalPinToInterrupt(button1Pin), button1Pressed, FALLING);
attachInterrupt(digitalPinToInterrupt(button2Pin), button2Pressed, FALLING);
attachInterrupt(digitalPinToInterrupt(button3Pin), button3Pressed, FALLING);
}
void loop() {
// 在 LCD 上显示时间间隔
lcd.setCursor(0, 0);
lcd.print("Time1: ");
lcd.print(button2PressedTime - button1PressedTime);
lcd.print(" ms ");
lcd.setCursor(0, 1);
lcd.print("Time2: ");
lcd.print(button3PressedTime - button2PressedTime);
lcd.print(" ms ");
// 添加小延迟,减少 CPU 使用率
delay(100);
}
// 按钮的中断服务程序
void button1Pressed() {
button1PressedTime = millis();
detachInterrupt(digitalPinToInterrupt(button1Pin)); // 禁用中断
}
void button2Pressed() {
button2PressedTime = millis();
detachInterrupt(digitalPinToInterrupt(button2Pin)); // 禁用中断
}
void button3Pressed() {
button3PressedTime = millis();
detachInterrupt(digitalPinToInterrupt(button3Pin)); // 禁用中断
}