#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在最左边停留了两个周期的时间,最右边也是同理,给人的感觉就是楞了一下。