为什么我的51单片机左右往复流水灯,为什么从左到右或者从右到左会愣一下

#include<reg52.h>
sbit ADDR0=P1^0;
sbit ADDR1=P1^1;
sbit ADDR2=P1^2;
sbit ADDR3=P1^3;
sbit ENLED=P1^4;
void main()
{
unsigned int i=0;
unsigned char cnt=0;
unsigned char dire=0;
ENLED=0;
ADDR3=1;
ADDR2=1;
ADDR1=1;
ADDR0=0;

                       while(1)
                       {
                         if (dire==0)
                             {
                         P0=~(0x01<<cnt);
                           for(i=0;i<20000;i++);
                           cnt++;
                                  if(cnt>=8)
                                    { 
                                        cnt=0;
                                        dire=1;
                                    }
                                }
              else
              {
                 P0=~(0x80>>cnt);
                            for(i=0;i<20000;i++);
                            cnt++;
                                    if(cnt>=8)
                                    {
                                        cnt=0;
                                        dire=0;
                                    }
                                }
                                    
                         
                        }
                    }

所谓楞一下,就是多等了一会儿,你分析一下两种状态交替时候执行的操作就明白了。
很明显,从右边往左边滚动的,滚到最左边,按这个滚动循环,LED会在最左边停留一个周期,然后进入下一轮从左往右滚的的循环,这个循环的第一个周期,LED的动作就是停在最左边一个周期的时间,所以从外部看,LED在最左边停留了两个周期的时间,最右边也是同理,给人的感觉就是楞了一下。