Arduino中的中断函数
Interrupt function in Arduino
我目前正在研究将按钮作为输入的项目,当我们从第一个 LED 开始单击按钮时,它会移动,每 0.5 秒后 LED 会相互跟随。中断函数运行良好,但问题是循环结束时中断运行。我想在单击按钮时关闭 LED。如何解决这个问题?
int button;
void setup() {
DDRD = B11110000;
attachInterrupt(digitalPinToInterrupt(2), buttonPressed, RISING);
}
void loop() {
if(button) {
PORTD = B00010000;
delay(500);
PORTD = PORTD <<1;
delay(500);
PORTD = PORTD <<1;
delay(500);
PORTD = PORTD <<1;
delay(500);
}
else {
PORTD = B00000000;
}
}
void buttonPressed() {
if(button == 0) {
button = 1;
}else {
button = 0;
}
}
您可以重写代码来检查每个 LED 的按钮状态,而不是执行整个循环。这意味着 LED 仍然会在整整 0.5 秒的时间内保持点亮。
int button;
void setup() {
DDRD = B11110000;
attachInterrupt(digitalPinToInterrupt(2), buttonPressed, RISING);
}
void loop() {
if(button) {
PORTD = PORTD <<1;
if (PORTD == 0) {
PORTD = B00010000;
}
delay(500);
} else {
PORTD = B00000000;
}
}
void buttonPressed() {
button = !button;
}
要使 LED 立即变暗,您不应使用延迟,而应循环最多 0.5 秒并检查按钮状态;
unsigned long timeout = millis() + 500;
while (button && millis() < timeout);
或者更多的上下文
void loop() {
if(button) {
next_light();
sleep(500);
} else {
PORTD = B00000000;
}
}
void next_light() {
PORTD = PORTD <<1;
if (PORTD == 0) {
PORTD = B00010000;
}
}
void sleep(unsigned long timeout) {
unsigned long end = millis() + timeout;
while (button && millis() < end);
}
void buttonPressed() {
button = !button;
}
我目前正在研究将按钮作为输入的项目,当我们从第一个 LED 开始单击按钮时,它会移动,每 0.5 秒后 LED 会相互跟随。中断函数运行良好,但问题是循环结束时中断运行。我想在单击按钮时关闭 LED。如何解决这个问题?
int button;
void setup() {
DDRD = B11110000;
attachInterrupt(digitalPinToInterrupt(2), buttonPressed, RISING);
}
void loop() {
if(button) {
PORTD = B00010000;
delay(500);
PORTD = PORTD <<1;
delay(500);
PORTD = PORTD <<1;
delay(500);
PORTD = PORTD <<1;
delay(500);
}
else {
PORTD = B00000000;
}
}
void buttonPressed() {
if(button == 0) {
button = 1;
}else {
button = 0;
}
}
您可以重写代码来检查每个 LED 的按钮状态,而不是执行整个循环。这意味着 LED 仍然会在整整 0.5 秒的时间内保持点亮。
int button;
void setup() {
DDRD = B11110000;
attachInterrupt(digitalPinToInterrupt(2), buttonPressed, RISING);
}
void loop() {
if(button) {
PORTD = PORTD <<1;
if (PORTD == 0) {
PORTD = B00010000;
}
delay(500);
} else {
PORTD = B00000000;
}
}
void buttonPressed() {
button = !button;
}
要使 LED 立即变暗,您不应使用延迟,而应循环最多 0.5 秒并检查按钮状态;
unsigned long timeout = millis() + 500;
while (button && millis() < timeout);
或者更多的上下文
void loop() {
if(button) {
next_light();
sleep(500);
} else {
PORTD = B00000000;
}
}
void next_light() {
PORTD = PORTD <<1;
if (PORTD == 0) {
PORTD = B00010000;
}
}
void sleep(unsigned long timeout) {
unsigned long end = millis() + timeout;
while (button && millis() < end);
}
void buttonPressed() {
button = !button;
}