3.3 左右来回循环的流水灯

本例运行时,8只LED左右来回循环滚动点亮,产生来回走马灯效果。

本例电路如图3-3所示。

图3-3 左右来回循环的流水灯电路

程序设计调试与实训:

本例中的8只LED连接在P2端口,LED阳极连接P2,阴极通过限流电阻接地,对于P0端口,这样连接时任何LED都不会点亮,即使P0端口输出的是0xFF。

由于本例所有LED共阴连接,P2端口相应引脚输出1时,才会使相应LED点亮,为产生单个LED循环滚动效果,P2端口初值设为0x01(00000001),这会使第1只LED点亮,主程序中第1个for循环使其循环左移,依次为00000010,00000100,00001000,……直到变为10000000。第2个for循环使其循环右移,依次为01000000,00100000,00010000,……直到变为00000001如此重复。

另外,读者还要注意两个并列的for循环都只需要执行7次而不是8次。

调试本例后,读者可将LED改为共阳连接,重新修改程序,看能否实现同样的效果,同时,还可以在每次来回滚动显示后再添加全亮和全灭的闪烁效果。

源程序代码:

        //-----------------------------------------------------------------
        //  名称: 8只LED左右来回点亮
        //-----------------------------------------------------------------
        //  说明:程序利用循环移位函数_crol_和_cror_形成来回滚动效果。
        //-----------------------------------------------------------------
        #include <reg51.h>
        #include <intrins.h>
        #define uchar unsigned char
        #define uint  unsigned int
        //-----------------------------------------------------------------
        // 延时
        //-----------------------------------------------------------------
        void DelayMS(uint x)
        {
          uchar t;
          while(x--)
          {
            for(t = 0; t < 120; t++);
          }
        }
        //-----------------------------------------------------------------
        // 主程序
        //-----------------------------------------------------------------
        void main()
        {
            uchar i;
            P2 = 0x01;
            while(1)
            {
              for (i = 0; i < 7; i++)
              {
                P2 = _crol_(P2,1); //P2端口向左循环移动1位
                DelayMS(150);
              }
              for (i = 0; i < 7; i++)
              {
                P2 = _cror_(P2,1); //P2端口向右循环移动1位
                DelayMS(150);
              }
            }
        }