3.2 从左到右的流水灯

本例连接P0端口的8只LED从左到右循环滚动点亮,产生走马灯效果。

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

图3-2 从左到右的流水灯电路

程序设计调试与实训:

本例中的8只LED连接在P0端口,LED阴极指向P0,阳极通过限流电阻接+5V,由于LED接在P0端口,而P0内部无上拉电阻,因此LED只能按图3-2所示来连接,8只电阻同时起限流和上拉作用。如果将它们全部接在P1、P2或P3端口,读者还可以将所有LED反接,阳极指向端口,阴极通过限流电阻后共同接地,这样连接后再相应修改程序,仍可以出现相同的运行效果。

程序将P0端口初值设为0xFE(11111110),由于电路中LED是共阳连接的,该初值会使第0只LED被点亮,当11111110向左循环移位时,即可使8只LED从左向右形成循环走马灯效果。循环左移由函数_crol_完成,注意添加头文件intrins.h。

读者可修改本例代码,实现LED循环右移显示的效果(循环右移函数为_cror_)。

源程序代码:

        //-----------------------------------------------------------------
        //  名称: 从左到右的流水灯
        //-----------------------------------------------------------------
        //  说明: 接在P0端口的8只LED从左到右循环依次点亮,产生走马灯效果。
        //-----------------------------------------------------------------
        #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()
        {
            P0 = 0xFE;
            while(1)
            {
              P0 = _crol_(P0,1); //P0端口的值向左循环移动1位
              DelayMS(150);
            }
        }