从单片机基础到程序框架(全集 2019pdf版).pdf - 第394页
#include " REG52.H" void T0_ti me(); void Syste mInitial( void) ; void Delay (unsigned l ong u32Delay Time) ; void Perip heralInit ial(void) ; void Led_1 _Task(voi d); void Led_2 _Task(voi d); #define BLIN K_TI…

第九十节: 多任务并行处理两路跑马灯。
【90.1 多任务并行处理。】
两路速度不同的跑马灯,代表了两路独立运行的任务,单片机如何“并行”处理这两路任务,就涉及到
“多任务并行处理的编程思路”。
上图 90.1.1 灌入式驱动 8 个 LED 第 1 路跑马灯
上图 90.1.2 灌入式驱动 4 个 LED 新增加的第 2 路跑马灯
如上图,本节特别值得一提的是,新增加的第 2 路跑马灯用的是 4 个 LED,这 4 个 LED 的驱动 IO 口是“散
装的”,因为,前面 3 个是 P1 口的(P1.4,P1.5,P1.6),最后 1 个是 P3 口的(P3.3),这种情况下,肯定用
不了“移位”的处理思路,只能用跑马灯第 3 种境界里所介绍的“状态切换非阻塞”思路,可见,“IO 口拆
分”和“switch 状态切换”又一次充分体现了它们“程序框架万能扩展”的优越性。代码如下:

#include "REG52.H"
void T0_time();
void SystemInitial(void) ;
void Delay(unsigned long u32DelayTime) ;
void PeripheralInitial(void) ;
void Led_1_Task(void);
void Led_2_Task(void);
#define BLINK_TIME_1 1000 //控制第 1 路跑马灯的速度,数值越大“跑动”越慢。
#define BLINK_TIME_2 200 //控制第 2 路跑马灯的速度,数值越大“跑动”越慢。
sbit P0_0=P0^0;
sbit P0_1=P0^1;
sbit P0_2=P0^2;
sbit P0_3=P0^3;
sbit P0_4=P0^4;
sbit P0_5=P0^5;
sbit P0_6=P0^6;
sbit P0_7=P0^7;
sbit P1_4=P1^4;
sbit P1_5=P1^5;
sbit P1_6=P1^6;
sbit P3_3=P3^3;
volatile unsigned char vGu8TimeFlag_1=0;
volatile unsigned int vGu16TimeCnt_1=0;
volatile unsigned char vGu8TimeFlag_2=0;
volatile unsigned int vGu16TimeCnt_2=0;
void main()
{
SystemInitial();
Delay(10000);
PeripheralInitial();
while(1)
{
Led_1_Task(); //第 1 路跑马灯
Led_2_Task(); //第 2 路跑马灯
}
}

void T0_time() interrupt 1
{
if(1==vGu8TimeFlag_1&&vGu16TimeCnt_1>0) //软件定时器 1
{
vGu16TimeCnt_1--;
}
if(1==vGu8TimeFlag_2&&vGu16TimeCnt_2>0) //软件定时器 2
{
vGu16TimeCnt_2--;
}
TH0=0xfc;
TL0=0x66;
}
void SystemInitial(void)
{
TMOD=0x01;
TH0=0xfc;
TL0=0x66;
EA=1;
ET0=1;
TR0=1;
}
void Delay(unsigned long u32DelayTime)
{
for(;u32DelayTime>0;u32DelayTime--);
}
void PeripheralInitial(void)
{
}
//第 1 路跑马灯
void Led_1_Task(void)
{
static unsigned char Su8Step=0; //加 static 修饰的局部变量,每次进来都会保留上一次值。