pic单片机实现,如果1灯灭,2灯亮,3灯灭,按按键后3灯开始1s闪一次,5s内再次按下,3灯常亮,否则停止闪烁,3灯熄灭
时间: 2024-02-02 17:36:48 浏览: 101
用一个按钮控制三组灯,一个一个亮,一个一个灭.gxw
5星 · 资源好评率100%
以下是一个基于PIC单片机的实现代码:
```
#include <htc.h>
#define _XTAL_FREQ 20000000 // 设置晶振频率
__CONFIG(FOSC_HS & WDTE_OFF & PWRTE_OFF & MCLRE_ON & CP_OFF & CPD_OFF & BOREN_OFF & CLKOUTEN_OFF & IESO_OFF & FCMEN_OFF);
void main() {
TRISB = 0b11111110; // 设置RB0为输入,RB1-RB7为输出
PORTB = 0b00000100; // 初始化为3灯亮
while (1) {
if (PORTBbits.RB0 == 0) { // 如果按键被按下
__delay_ms(20); // 延迟去抖动
if (PORTBbits.RB0 == 0) { // 如果仍然按下
while (PORTBbits.RB0 == 0); // 等待按钮松开
while (1) { // 闪烁循环
PORTBbits.RB2 = 0; // 关闭3灯
__delay_ms(500); // 延迟500ms
PORTBbits.RB2 = 1; // 打开3灯
__delay_ms(500); // 延迟500ms
if (PORTBbits.RB0 == 0) { // 如果再次按下按钮
__delay_ms(20); // 延迟去抖动
if (PORTBbits.RB0 == 0) { // 如果仍然按下
while (PORTBbits.RB0 == 0); // 等待按钮松开
PORTBbits.RB2 = 1; // 打开3灯
break; // 跳出闪烁循环
}
}
}
}
}
// 如果不需要闪烁,则让3灯常亮
PORTBbits.RB2 = 1;
}
}
```
在这个代码中,我们首先设置了RB0为输入,RB1-RB7为输出。然后我们初始化将3灯点亮。
在主循环中,我们首先判断按键是否被按下。如果被按下,我们等待20ms的去抖动时间,并再次检查按键是否仍然被按下。如果是,那么我们进入闪烁循环。在这个循环中,我们先关闭3灯,然后延迟500ms,再打开3灯,再延迟500ms。然后我们再次检查按键是否被按下,如果是,我们再次等待20ms去抖动,并再次检查按键是否仍然被按下。如果是,我们就打开3灯并跳出闪烁循环。
如果按键没有被按下,那么我们就让3灯常亮。
这个代码可以在PIC单片机上编译并烧录。当你按下按钮时,3灯会开始闪烁,如果你再次按下按钮,3灯就会恒定点亮,否则就会停止闪烁并熄灭。
阅读全文