从单片机基础到程序框架(全集 2019pdf版).pdf - 第391页

vGu8Time Flag_1=1; P0_0=0; P0_1=0; P0_2=0; P0_3=0; P0_4=0; P0_5=0; P0_6=1; //第 6 个灯 熄灭 P0_7=0; Su8Step= 7; //切换到下一 个步骤,精髓 语句! } break; case 7: if(0==vG u16TimeCnt_ 1) //时间到 { vGu8Time Flag_1=0; vGu16Tim eCnt_1=BLIN K_TIM…

100%1 / 836
vGu8TimeFlag_1=0;
vGu16TimeCnt_1=BLINK_TIME_1; //重装定时的时间
vGu8TimeFlag_1=1;
P0_0=0;
P0_1=0;
P0_2=0;
P0_3=0;
P0_4=1; //第 4 个灯熄灭
P0_5=0;
P0_6=0;
P0_7=0;
Su8Step=5; //切换到下一个步骤,精髓语句!
}
break;
case 5:
if(0==vGu16TimeCnt_1) //时间到
{
vGu8TimeFlag_1=0;
vGu16TimeCnt_1=BLINK_TIME_1; //重装定时的时间
vGu8TimeFlag_1=1;
P0_0=0;
P0_1=0;
P0_2=0;
P0_3=0;
P0_4=0;
P0_5=1; //第 5 个灯熄灭
P0_6=0;
P0_7=0;
Su8Step=6; //切换到下一个步骤,精髓语句!
}
break;
case 6:
if(0==vGu16TimeCnt_1) //时间到
{
vGu8TimeFlag_1=0;
vGu16TimeCnt_1=BLINK_TIME_1; //重装定时的时间
vGu8TimeFlag_1=1;
P0_0=0;
P0_1=0;
P0_2=0;
P0_3=0;
P0_4=0;
P0_5=0;
P0_6=1; //第 6 个灯熄灭
P0_7=0;
Su8Step=7; //切换到下一个步骤,精髓语句!
}
break;
case 7:
if(0==vGu16TimeCnt_1) //时间到
{
vGu8TimeFlag_1=0;
vGu16TimeCnt_1=BLINK_TIME_1; //重装定时的时间
vGu8TimeFlag_1=1;
P0_0=0;
P0_1=0;
P0_2=0;
P0_3=0;
P0_4=0;
P0_5=0;
P0_6=0;
P0_7=1; //第 7 个灯熄灭
Su8Step=0; //返回到第 0 个步骤重新开始往下走,精髓语句!
}
break;
}
}
分析总结这是第 3 种境界的跑马灯,很多初学者咋看此程序表示不理解,人家一条赋值语句就解决
8 LED 一次性显示的问题,你非要拆分成 8 条按位赋值的语句,人家只用一个判断就实现了 LED 灯移动显
示的功能,你非要整出 8 个步骤的切换,况且,整个程序的代码量明显增加了很多,这个程序好在哪?其实,
我这么做是用心良苦呀。这个程序的代码量虽然增多了但是仔细一看,并没有影响运行的效率。之所以
8 LED 灯拆分成一个一个的 LED 灯单独赋值显示,是因为,在我眼里,这个 8 LED 灯代表的不仅仅是 LED
灯,而是 8 个输出信号!这 8 个输出信号未来驱动的可能是不同的继电器,气缸,电机,大炮,导弹,以及
它们的各种千变万化的组合逻辑,拆分之后程序框架就有了无限可能的扩展性之所以整出 8 个步骤的切换,
也是同样的道理,为了增加程序框架无限可能的扩展性。这个程序虽然表面看起来繁琐,但是仔细一看它是
“多而不乱”,非常富有“队形感”。因此可以这么说,这个看似繁琐的跑马灯程序,其实背后蕴藏了编程界
的大智慧,它已经突破了“看山还是山”的境界。