从单片机基础到程序框架(全集 2019pdf版).pdf - 第381页
void LedTa sk(void) { static unsig ned char Su8Step =0; //加 static 修饰 的局部变量, 每次进来 都会保留上 一次值。 switch(S u8Step) { case 0: if(0==vGu1 6TimeCnt_ 1) //时间到 { P0_0=0; vGu8Time Flag_1=0; vGu16Tim eCnt_1=BLIN K_TIME_1; //重装 定时的时间…

volatile unsigned int vGu16TimeCnt_1=0;
void main()
{
SystemInitial(); //“四区一线”的“第一区”
Delay(10000); //“四区一线”的“一线”
PeripheralInitial(); //“四区一线”的“第二区”
while(1) //主循环
{
LedTask(); //“四区一线”的“第三区”
}
}
void T0_time() interrupt 1 //“四区一线”的“第四区”
{
if(1==vGu8TimeFlag_1&&vGu16TimeCnt_1>0)
{
vGu16TimeCnt_1--;
}
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)
{
}

void LedTask(void)
{
static unsigned char Su8Step=0; //加 static 修饰的局部变量,每次进来都会保留上一次值。
switch(Su8Step)
{
case 0:
if(0==vGu16TimeCnt_1) //时间到
{
P0_0=0;
vGu8TimeFlag_1=0;
vGu16TimeCnt_1=BLINK_TIME_1; //重装定时的时间
vGu8TimeFlag_1=1;
Su8Step=1; //切换到下一个步骤,精髓语句!
}
break;
case 1:
if(0==vGu16TimeCnt_1) //时间到
{
P0_0=1;
vGu8TimeFlag_1=0;
vGu16TimeCnt_1=BLINK_TIME_1; //重装定时的时间
vGu8TimeFlag_1=1;
Su8Step=0; //返回到上一个步骤,精髓语句!
}
break;
}
}

第八十九节: 跑马灯的三种境界。
【89.1 跑马灯的三种境界。】
跑马灯也称为流水灯,排列的几个 LED 依次循环的点亮和熄灭,给人“跑动起来”的感觉,故称为“跑
马灯”。实现跑马灯的效果,编程上有三种思路,分别代表了跑马灯的三种境界,分别是:移位阻塞,移位
非阻塞,状态切换非阻塞。
图 89.1.1 灌入式驱动 8 个 LED
本节用的是 8 个 LED 灯依次挨个熄灭点亮,如上图所示。
【89.2 移位阻塞。】
移位阻塞,“移位”用的是 C 语言的左移或者右移语句,“阻塞”用的是 delay 延时。代码如下:
#include "REG52.H"
void T0_time();
void SystemInitial(void) ;
void Delay(unsigned long u32DelayTime) ;
void PeripheralInitial(void) ;
void LedTask(void);
void main()
{
SystemInitial();
Delay(10000);
PeripheralInitial();
while(1)