关于led显示小数点有时出错,解决办法是将延迟函数移到switch后面,但是为什么

关于led显示小数点有时出错,解决方法是将延迟函数移到switch后面,但是为什么?
错误代码:
C/C++ code

void display(){
int i;
LedOut[0]=Disp_Tab[dat[0]%10000/1000];
LedOut[1]=Disp_Tab[dat[0]%1000/100]|0x80;
LedOut[2]=Disp_Tab[dat[0]%100/10];
LedOut[3]=Disp_Tab[dat[0]%10]|0x80;
LedOut[4]=Disp_Tab[dat[1]%10000/1000]|0x80;
LedOut[5]=Disp_Tab[dat[1]%1000/100];
LedOut[6]=Disp_Tab[dat[1]%100/10]|0x80;
LedOut[7]=Disp_Tab[dat[1]%10];
for(i=0;i<8;i++){
P0=LedOut[i];
delay(100);//延迟加载这,小数点显示错误,乱了(小数点本来应该显示在2,4,5,7位,实际显示在1,4,6,7位,就是乱了!!)
switch(i){
case 0:pc=0;pb=0;pa=0;break;
case 1:pc=0;pb=0;pa=1;break;
case 2:pc=0;pb=1;pa=0;break;
case 3:pc=0;pb=1;pa=1;break;
case 4:pc=1;pb=0;pa=0;break;
case 5:pc=1;pb=0;pa=1;break;
case 6:pc=1;pb=1;pa=0;break;
case 7:pc=1;pb=1;pa=1;break;}
}}



正确代码:
C/C++ code

void display(){
int i;
LedOut[0]=Disp_Tab[dat[0]%10000/1000];
LedOut[1]=Disp_Tab[dat[0]%1000/100]|0x80;
LedOut[2]=Disp_Tab[dat[0]%100/10];
LedOut[3]=Disp_Tab[dat[0]%10]|0x80;
LedOut[4]=Disp_Tab[dat[1]%10000/1000]|0x80;
LedOut[5]=Disp_Tab[dat[1]%1000/100];
LedOut[6]=Disp_Tab[dat[1]%100/10]|0x80;
LedOut[7]=Disp_Tab[dat[1]%10];
for(i=0;i<8;i++){
P0=LedOut[i];
switch(i){
case 0:pc=0;pb=0;pa=0;break;
case 1:pc=0;pb=0;pa=1;break;
case 2:pc=0;pb=1;pa=0;break;
case 3:pc=0;pb=1;pa=1;break;
case 4:pc=1;pb=0;pa=0;break;
case 5:pc=1;pb=0;pa=1;break;
case 6:pc=1;pb=1;pa=0;break;
case 7:pc=1;pb=1;pa=1;break;}
delay(100);}}//延迟加后面,正常了



求解啊!!!!

------解决方案--------------------
这个理解下逻辑就可以了
一个是先改变八段,再位选,然后延时,正确显示
另一个则是改变八段后延时,视觉停留在这个延时时,但是这个是上一次的位选