关于流水灯的程序在不作变动的情况下变花样;
  在我学习流水灯程序时,我在想能不能在不改变程序的情况下,变化多样呢?如是,我只是将间隔的数值,作了点变动,仿真是就发现这个方法是可以,可以实现;流水灯流动起来;单只LED常亮;单只闪亮,间隔一只,二只,三只四只流水,还可以实现流动方向的改变,以下是我对此作出改动的一点理解,不知道从理论上讲不讲得通,希望这里的行家里对我的分析作点点评,也是对我学习C语言最大的支持和鼓励。
以下是流水灯控制程序(仿真得出的,还没有实际仿真)
   《流水灯控制程序》
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
void delay(uint );
uint a;
void main()
{
    a=0x7f;
    while(1)
    {
        delay(10);
        P1=a;
        a=_crol_(a,1); /*改变a 的值来实现多样变化*/
    }
}
void delay(uint z )
{
    uint x,y;
    for(x=z;x>0;x--)
    for(y=100;y>0;y--);
}
在这个程序里,只要改变大循环中a的值就能实现多种变化,在这里要想使流水灯隔二隔三的流动这点是不难的,要想隔几只就改为所需数,所以这里就不解释了,下面关于将流水灯变成不流动单只常亮对于初学都来说可能还有点不理解吧。(这样做的目的是能过学习思考,以后对编程是有很大的帮助的,我是这样想的。)
1;让一只发光管常亮(都是用以上程序,程序不作改变,以下同)
我们知道,上述所编的程序,实际上是让单片机作时序运行(P1口)而每一口为八位,在我们所编程里,为了让灯流动起来,除了让亮灭都要有一定的时间间隔外,还要按一定的方式位移,在这个程序中,通常是把a的值设定为1,(* 有注释的这一条)如果想让流水灯中的第一只发光管常这而不流动,只需将a的数设定为8,那么从0到7,每次跳转都只能在第7位上显示,由于虽然隔有八位,但间隔时间都在毫秒级,一般不易察觉到它是闪动,所以给你的视觉就是常亮 如果想其闪动,当然要把所间隔的时间调长一点即可。
2间隔向左流动(间隔二位或三位)这是向左间隔二位或三位的流动,只要将a值调2或3即可。但到了间隔四时,只能看到第四和第七来回跳亮,就象猫眼一样,也就是第4和7来回变动,这是因为P1总共只有八位,0—7;要间隔四当然只能是4—7跳亮了,这点不难理解。
3改变方向向右流动;对于这一点,可能对我们初学者来说,还不容易理解,不是有向右流动的程序吗,是的,但能不能在不改动程序的情况下来实现呢,我想回答也是肯定的,比如说,现在将左方向流动的灯,变成向右方向流动,也只需改设a的值即可,将 a调为7,我们知道,程序没有变,灯的流动实际也没有变,可效果切实发生了变化,给你的感觉灯是从左开始向右移动的,为什么呢?我们知道,在这个程序中,是一直循环的,而每循环一次,就得向左移动一位,
P1=0  1  2  3  4  5  6  7    0  1   2  3   4   5   6  7 
前面一组0-7是第一次循环,后面带下横线的是第二次,当我们将a值调为7时,首次亮为0位,移动一位,从1数起,那么间隔七位就应是7为亮(7为0),当进行第三次循环时,程序向前移动一位,那就是7向前移动一位,就是0,从0,向后数七位,这时,要亮的位数就会跳到带下横线的一组,要亮的是第六位,再向后移动一位,以此类推,首次亮0,第二次循环亮7,第三次循环亮6。。。。。不断循环,就得到了向右移动的效果 把a值设为大于5—7都是向右流动,7是间隔一位,6是间隔二位,5是间隔三位,4是平跳,当把a设定为9时,仍为向左流动,间隔一位,因为每次循环最多只能有八位,大于八就按余数,即9-8=1或8-9=-1(绝对值为1).
所以,我们可以通过这样的设置,能更深刻的理解和掌握单片机的应用,我们学习编程,就是要达到应用自如,想怎么用就怎么用,充分发挥其优势,只有把这些学深学透,才能在实际应用中得到更进一步的提升.不知道我的这观点对否,请朋友多多指教 。