3.6 单只数码管循环显示0~9

本例运行时,电路中的单只数码管会循环显示0,1,2,…,9。

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

图3-6 单只数码管循环显示0~9电路

程序设计调试与实训:

本例的单只共阴数码管连接在P0端口,电路中必须添加上拉电阻。当P0端口相应引脚为1时,对应数码管段点亮。程序中预设了数字0~9的段码,0~9的段码按固定时间间隔循环发送到P0端口,产生数字循环显示效果。

本例源程序预设的数字段码表存放在数组DSY_CODE中,由于段码表是固定的,因此存储类型可设为code。由于本例给出的段码表是针对共阳数码管的,但电路中使用的却是共阴数码管,因此在段码送至P0端口显示时要将其取反。

读者可将本例段码表改为共阴数码管段码表,使程序实现相同功能。

源程序代码:

        //-----------------------------------------------------------------
        //  名称: 单只数码管循环显示0~9
        //-----------------------------------------------------------------
        //  说明: 主程序中的循环语句反复将0~9的段码送至P0端口,使数字0~9
        //       循环显示。
        //-----------------------------------------------------------------
        #include <reg51.h>
        #include <intrins.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,
    0xff};
        //-----------------------------------------------------------------
        // 延时
        //-----------------------------------------------------------------
        void DelayMS(uint x)
        {
          uchar t;
          while(x--) for(t = 0; t < 120; t++);
        }
        //-----------------------------------------------------------------
        // 主程序
        //-----------------------------------------------------------------
        void main()
        {
          uchar i = 0;
          P0 = 0x00;
          while(1)
          {
            P0 = ~DSY_CODE[i];
            i = (i+1) % 10;
            DelayMS(180);
          }
        }