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

3.9 数码管闪烁显示

本例电路与前一案例相同,程序稍有差异,形成了显示内容的闪烁效果,即所有字符同时显示,同时关闭,如此循环。

程序设计调试与实训:

上一案例中对数码管的循环选通采用了循环左移函数,本例中则专门提供了位选通的索引数组DSY_IDX(位码表),每字节展开为二进制数时,其中仅有一位为1,这表示每次只有一只数码管被选通。这样设计虽然占用了更多的空间,但每次输出位码时不需要再执行移位运算。

完成本例学习与调试后,读者可修改代码,在数码管上闪烁显示由3~5个数字构成的数字串。

源程序代码:

        //-----------------------------------------------------------------
        //  名称: 8只数码管闪烁显示数字串
        //-----------------------------------------------------------------
        //  说明: 数码管闪烁显示由0~7构成的一串数字。
        //       本例用动态刷新法显示了一串数字,在停止刷新时所有数字显示消失。
        //-----------------------------------------------------------------
        #include <reg51.h>
        #define uchar unsigned char
        #define uint  unsigned int
        //数字0~9的数码管段码表
        uchar code DSY_CODE[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
        //数码管的选通索引表(位码表)
        uchar data DSY_IDX [] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
        //-----------------------------------------------------------------
        // 延时
        //-----------------------------------------------------------------
        void DelayMS(uint x)
        {
          uchar i;
          while(x--) for(i = 0; i < 120; i++);
        }
        //-----------------------------------------------------------------
        // 主程序
        //-----------------------------------------------------------------
        void main()
        {
          uchar i,j;
          P0 = 0xFF;
          P2 = 0x00;
          while(1)
          {
            //动态扫描显示,刷新30次,实际上实现了8只数码管的保持显示延时
            for(i = 0; i < 30; i++)
            {
                for(j = 0; j < 8; j++)
                {
                P2 = DSY_IDX [j];
                P0 = DSY_CODE[j];
                DelayMS(2);
                }
            }
            P2 = 0x00; //所有数码管共阳极与+5V断开
            DelayMS(1000); //关闭持续一段时间
          }
        }