单片机C语言程序设计实训100例
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.4 花样流水灯

在上一案例中,LED只能按某种单调的规律显示,无法实现复杂多变的花样显示。本例中两组LED连接在P0和P2端口,它们按预先设定的花样变换显示。

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

程序设计调试与实训:

本例将设计的花样预设在两个数组中,它们分别与两组LED对应,各数组中的每个字节对应一种显示组合,程序循环读取数组中的显示组合并送往端口,实现自定义花样的自由显示。

本例P0、P2端口对应的花样数组所占空间较大,且预设后相对固定,因此Pattern_P0,Pattern_P2的存储类型均设为code,由于电路中LED共阳连接,初始时将P0、P2均设为0xFF,在开始时将它们全部关闭。

读者可以自行调整数组内容,改变数组大小,实现自定义的花样显示。

图3-4 花样流水灯电路

源程序代码:

        //-----------------------------------------------------------------
        //  名称: 花样流水灯
        //-----------------------------------------------------------------
        //  说明: 16只LED分两组按预设的多种花样变换显示。
        //-----------------------------------------------------------------
        #include <reg51.h>
        #define uchar unsigned char
        #define uint  unsigned int
        uchar code Pattern_P0[] =
        {
          0xFC,0xF9,0xF3,0xE7,0xCF,0x9F,0x3F,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
          0xE7,0xDB,0xBD,0x7E,0xBD,0xDB,0xE7,0xFF,0xE7,0xC3,0x81,0x00,0x81,0xC3,0xE7,0xFF,
          0xAA,0x55,0x18,0xFF,0xF0,0x0F,0x00,0xFF,0xF8,0xF1,0xE3,0xC7,0x8F,0x1F,0x3F,0x7F,
          0x7F,0x3F,0x1F,0x8F,0xC7,0xE3,0xF1,0xF8,0xFF,0x00,0x00,0xFF,0xFF,0x0F,0xF0,0xFF,
          0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
          0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE,
          0xFE,0xFC,0xF8,0xF0,0xE0,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xE0,0xF0,0xF8,0xFC,0xFE,
          0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF
        };
        uchar code Pattern_P2[] =
        {
          0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFC,0xF9,0xF3,0xE7,0xCF,0x9F,0x3F,0xFF,
          0xE7,0xDB,0xBD,0x7E,0xBD,0xDB,0xE7,0xFF,0xE7,0xC3,0x81,0x00,0x81,0xC3,0xE7,0xFF,
          0xAA,0x55,0x18,0xFF,0xF0,0x0F,0x00,0xFF,0xF8,0xF1,0xE3,0xC7,0x8F,0x1F,0x3F,0x7F,
          0x7F,0x3F,0x1F,0x8F,0xC7,0xE3,0xF1,0xF8,0xFF,0x00,0x00,0xFF,0xFF,0x0F,0xF0,0xFF,
          0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,
          0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
          0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFC,0xF8,0xF0,0xE0,0xC0,0x80,0x00,
          0x00,0x80,0xC0,0xE0,0xF0,0xF8,0xFC,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
          0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF
        };
        //-----------------------------------------------------------------
        // 延时
        //-----------------------------------------------------------------
        void DelayMS(uint x)
        {
          uchar t;
          while(x--) for(t = 0; t < 120; t++);
        }
        //-----------------------------------------------------------------
        // 主程序
        //-----------------------------------------------------------------
        void main()
        {
          uchar i;
          while(1)
          {
            //从数组中读取数据送至P0端口和P2端口显示
            for(i = 0; i < 136; i++)
            {
                P0 = Pattern_P0[i];
                P2 = Pattern_P2[i];
                DelayMS(100);
            }
          }
        }