怎么让三个数字不重叠显示?

这是下面程序(三数字个叠在一起了)

#include <reg51.h>
#include <intrins.h>

#define uchar unsigned char
#define uint  unsigned int

typedef unsigned char u8;
typedef unsigned int u16;

u8 code smgduan[] = {0x08,0x0C,0x08,0x08,
                     0x08,0x08,0x08,0x7F,
                     0x38,0x24,0x22,0x10,
                     0x08,0x04,0x3E,0x00,
                     0x38,0x24,0x10,0x08,
                     0x10,0x24,0x38,0x00};

void delay(u16 a)
{
    while(a--);
}

u8 i;

void DigDisplay()
{
    for(i = 0;i < 8;i++)
    {
        switch(i)
        {
            case(0):
                P0 = 0xFE;break;
            case(1):
                P0 = 0xFD;break;
            case(2):
                P0 = 0xFB;break;
            case(3):
                P0 = 0xF7;break;
            case(4):
                P0 = 0xEF;break;
            case(5):
                P0 = 0xDF;break;
            case(6):
                P0 = 0xBF;break;
            case(7):
                P0 = 0x7F;break;
            }
            P2 = smgduan[i];
            delay(100);
        }
}

void DigDisplay2()
{
    u8 b;
    for(b = 0;b < 8;b++)
    {
        switch(b)
        {
            case(0):
                P0 = 0xFE;break;
            case(1):
                P0 = 0xFD;break;
            case(2):
                P0 = 0xFB;break;
            case(3):
                P0 = 0xF7;break;
            case(4):
                P0 = 0xEF;break;
            case(5):
                P0 = 0xDF;break;
            case(6):
                P0 = 0xBF;break;
            case(7):
                P0 = 0x7F;break;
            }
            P2 = smgduan[b + 8];
            delay(100);
        }
}

void DigDisplay3()
{
    u8 c;
    for(c = 0;c < 8;c++)
    {
        switch(c)
        {
            case(0):
                P0 = 0xFE;break;
            case(1):
                P0 = 0xFD;break;
            case(2):
                P0 = 0xFB;break;
            case(3):
                P0 = 0xF7;break;
            case(4):
                P0 = 0xEF;break;
            case(5):
                P0 = 0xDF;break;
            case(6):
                P0 = 0xBF;break;
            case(7):
                P0 = 0x7F;break;
            }
            P2 = smgduan[c + 16];
            delay(100);
        }
}
void main()
{
    while(1)
    {                
        DigDisplay();
        DigDisplay2();
        DigDisplay3();    
    }    
}
 

试试清屏后再加个延时再打印下一个