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

3.7 8只数码管滚动显示单个数字

本例运行时,数字0~7单个显示在8只集成式数码管的相应位置上。

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

程序设计调试与实训:

本例使用了8只集成式7段共阳数码管(SEG-MPX8-CA-BLUE,共阳为CA,共阴为CC),所有数码管a引脚并联在一起,b,c,d,e,f,g,dp也是分别并联的,任何时候发送的段码均会传送到所有数码管上,所有数码管共阳极是独立的,本例中各数码管的共阳极分别与8只NPN三极管射极相连,程序运行时,任一时刻仅允许一只数码管的共阳极连接+5V,当向P0端口发送段码时,相应数字只会显示在某一只数码管上,依次循环选中8只数码管中的一只时,即可形成滚动显示效果。

图3-7 8只数码管滚动显示单个数字电路

要在数码管上滚动显示单个数字,任一时刻只需要选通一只数码管,例如,要在最左边数码管上显示数字,对于本例中的共阳数码管,其位引脚1(即本例中该数码管的共阳极)要设为1(+5V),由于使用的是NPN三极管,P2.0为1,即P2端口的值为00000001时,第1只三极管导通,对应数码管共阳极连接+5V,同理,如果需要在第3只数码管上显示数字,P2端口的值为00000100。

本例将位码初值设为0x80,即10000000,for循环中执行循环左移时,k值将为00000001,00000010,00000100,……,10000000,如此重复。每次段码的发送均与位选通码对应,形成单个数字的循环滚动显示。

读者可修改代码,使单个数字从右向左滚动显示。

源程序代码:

        //-----------------------------------------------------------------
        //  名称: 8只数码管滚动显示单个数字
        //-----------------------------------------------------------------
        //  说明: 数码管从左到右依次滚动显示0~7,程序通过每次仅循环选通一只数码管
        //  实现单只数码管滚动显示效果。
        //
        //-----------------------------------------------------------------
        #include <reg51.h>
        #include <intrins.h>
        #define uchar unsigned char
        #define uint  unsigned int
        //各数字的数码管段码
        uchar code DSY_CODE[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
        //-----------------------------------------------------------------
        // 延时
        //-----------------------------------------------------------------
        void DelayMS(uint x)
        { uchar i;
          while(x--) for(t = 0; i < 120; i++);
        }
        //-----------------------------------------------------------------
        // 主程序
        //-----------------------------------------------------------------
        void main()
        { uchar i,k = 0x80;
          while(1)
          { for(i = 0; i < 8; i++)
            {
                P2 = 0xFF;                    //关闭显示
                k = _crol_(k, 1);
                P0 = DSY_CODE[i];             //发送数字段码
                P2 = k;                       //发送数码管位码,打开对应的数码管
                DelayMS(300);
            }
          }
        }