功能1:主程序中,用定时器2实现300ms跑马灯,跑马方式为:LED3&LED4->LED2&LED5->LED1&LED6->LED2&LED5->LED3&LED4.一直循环 功能2: 按下KEY1触发外部中断,中断服务为:LED0&LED1->LED2&LED3->LED4&LED5->LED6&LED7,切换间隔时间为200ms,循环3次,完成后返回断点位置。 功能3: 按下KEY3触发外部中断,中断服务为:LED0->LED7齐闪烁,闪烁间隔时间为400ms,闪烁5次,完成后返回断点位置。要求:KEY3中断能够抢占KEY1中断
时间: 2023-07-20 09:25:09 浏览: 90
好的,你的第一个问题是关于一个嵌入式系统的功能实现,我可以回答。这个系统主要有三个功能:一个是跑马灯的循环显示,一个是按下 KEY1 触发 LED 的切换,另一个是按下 KEY3 触发 LED 的闪烁。其中 KEY3 中断可以抢占 KEY1 中断。具体的实现可以参考以下代码:
```c
#include <reg52.h>
unsigned char code LED[8] = {0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F}; // 逐个点亮的数码管数据
void main() {
TMOD = 0x10; // 定时器2工作在模式1
TH1 = 0xFC; // 定时器2初值
TL1 = 0x66;
ET1 = 1; // 允许定时器2中断
TR1 = 1; // 启动定时器2
EX0 = 1; // 允许外部中断0
IT0 = 1; // 设置为下降沿触发
EX1 = 1; // 允许外部中断1
IT1 = 1; // 设置为下降沿触发
EA = 1; // 允许中断
while (1) {
// 循环执行跑马灯的操作
}
}
void Timer1() interrupt 3 { // 定时器2中断服务函数
static unsigned char i = 0;
switch (i) {
case 0:
P1 = LED[0];
P2 = LED[7];
break;
case 1:
P1 = LED[1];
P2 = LED[6];
break;
case 2:
P1 = LED[2];
P2 = LED[5];
break;
case 3:
P1 = LED[1];
P2 = LED[6];
break;
case 4:
P1 = LED[0];
P2 = LED[7];
break;
}
i = (i + 1) % 5;
TH1 = 0xFC; // 重新设置定时器2初值
TL1 = 0x66;
}
void External0() interrupt 0 { // 外部中断0服务函数
static unsigned char i = 0;
while (i < 3) { // 切换间隔时间为200ms,循环3次
P1 = 0x55;
P2 = 0xAA;
i++;
delay(200); // 延时200ms,需要自己实现
}
i = 0;
}
void External1() interrupt 2 { // 外部中断1服务函数
static unsigned char i = 0;
while (i < 5) { // 闪烁间隔时间为400ms,闪烁5次
P1 = P2 = 0xFF;
i++;
delay(400); // 延时400ms,需要自己实现
}
i = 0;
}
void delay(unsigned int t) { // 延时函数
unsigned int i, j;
for (i = 0; i < t; i++) {
for (j = 0; j < 1000; j++) {
// 空循环
}
}
}
```
以上是一个简单的实现,具体的操作流程和函数实现需要根据实际情况进行调整。
阅读全文