单片机使用外部中断0实现 当按键按下奇数次时,实现流水灯效果 当按键按下偶数次时,实现闪烁灯效果代码
时间: 2024-02-28 14:55:07 浏览: 141
好的,下面是一个基于51单片机的实现代码示例:
```c
#include <reg52.h>
// 定义LED端口
sbit LED = P1^0;
// 定义按键端口
sbit KEY = P3^2;
// 定义计数器
unsigned int count = 0;
// 延时函数
void delay(unsigned int ms) {
unsigned int i, j;
for (i = 0; i < ms; i++) {
for (j = 0; j < 110; j++);
}
}
// 中断服务程序
void InterruptServiceRoutine() interrupt 0 {
if (KEY == 0) { // 判断按键是否按下
count++; // 计数器加1
delay(10); // 延时去抖动
}
}
// 流水灯效果
void FlowingEffect() {
unsigned int i, j;
while (1) {
for (i = 0; i < 8; i++) {
LED = 0xfe << i;
for (j = 0; j < 200; j++) delay(1);
}
}
}
// 闪烁灯效果
void FlashingEffect() {
while (1) {
LED = 0xff;
delay(500);
LED = 0x00;
delay(500);
}
}
// 主函数
void main() {
// 设置外部中断0的中断触发方式为下降沿触发
IT0 = 1;
EX0 = 1;
EA = 1;
while (1) {
if (count % 2 == 0) {
FlashingEffect(); // 实现闪烁灯效果
} else {
FlowingEffect(); // 实现流水灯效果
}
}
}
```
这个代码示例中,我们首先定义了LED和按键的端口,并设置了计数器的初始值为0。然后,我们实现了一个延时函数来控制灯的亮灭时间和效果。接着,我们定义了一个中断服务程序来检测按键的状态并将计数器加1。最后,我们实现了流水灯效果和闪烁灯效果的函数,并在主函数中根据计数器的值来选择相应的灯效。
希望这个代码示例能对你有所帮助!
阅读全文