从单片机基础到程序框架(全集 2019pdf版).pdf - 第393页
第九十节: 多任务并行处理两 路跑马灯。 【90.1 多任务并行处理。 】 两路速度不 同的跑马灯 , 代表了两路 独立运行的 任务,单片机如何 “并行 ” 处理这两路 任务, 就涉 及到 “多任务并行 处理的编程思 路” 。 上图 90.1.1 灌入式驱动 8 个 LED 第 1 路跑马灯 上图 90.1.2 灌入式驱动 4 个 LED 新增加的第 2 路跑马灯 如上图, 本节特别值 得一提的是, 新增加的第 2 路跑马灯用的是 4 …
它们的各种千变万化的组合逻辑,拆分之后程序框架就有了无限可能的扩展性。之所以整出 8 个步骤的切换,
也是同样的道理,为了增加程序框架无限可能的扩展性。这个程序虽然表面看起来繁琐,但是仔细一看它是
“多而不乱”,非常富有“队形感”。因此可以这么说,这个看似繁琐的跑马灯程序,其实背后蕴藏了编程界
的大智慧,它已经突破了“看山还是山”的境界。

第九十节: 多任务并行处理两路跑马灯。
【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 路跑马灯
}
}