有关于LED矩阵翻页异常的问题

这个本来是想用LED显示0——2翻页的,但是下载到单片机只是停留在0就不动了,麻烦专业人员帮我解决一下,谢谢。(用的是普中的51单片机)

#include "reg51.h"
#include "intrins.h"

typedef unsigned int u16;
typedef unsigned char u8;

sbit SRCLK=P3^6;
sbit RCLK=P3^5;
sbit SER=P3^4;

img


u8 ledwei[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};

u8 flag;
u8 i;

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

void Timer0Init() //定时器0中断
{
TMOD|=0X01;

TH0=0XFC;    
TL0=0X18;    
ET0=1;
EA=1;
TR0=1;    

}

void Hc595SendByte(u8 dat1,u8 dat2)
{
u8 a;

SRCLK = 1;
RCLK = 1;

for(a=0;a<8;a++)    
{
    SER = dat1 >> 7;        
    dat1 <<= 1;

    SRCLK = 0;            
    _nop_();
    _nop_();
    SRCLK = 1;    
}

for(a=0;a<8;a++)         
{
    SER = dat2 >> 7;         
    dat2 <<= 1;

    SRCLK = 0;        
    _nop_();
    _nop_();
    SRCLK = 1;    
}

RCLK = 0;
_nop_();
_nop_();
RCLK = 1;

}

void xian0() //显示0
{
while(1)
{
for(i=0;i<8;i++)
{
Hc595SendByte(ledwei[i],ledduan0[i]);
delay(10);
}
}
}

void xian1() //显示1
{
while(1)
{
for(i=0;i<8;i++)
{
Hc595SendByte(ledwei[i],ledduan1[i]);
delay(10);
}

 }

}

void xian2() //显示2
{
while(1)
{
for(i=0;i<8;i++)
{
Hc595SendByte(ledwei[i],ledduan2[i]);
delay(10);
}
}
}

void main()
{
Timer0Init();
while(1)
{
if(flag==0) xian0();
if(flag==1) xian1();
if(flag==2) xian2();
}
}

void Timer0() interrupt 1
{
static u16 i2;
TH0=0XFC;
TL0=0X18;
i2++;
if(i2==1000)
{
i2=0;
flag++;
if(flag>2)
flag=0;
}
}

显示用无限循环只能一直执行一个无限循环,最好做法是适时退出无限循环好让其他循环可以执行.