1. #include<reg51.h> 
  2. #include<intrins.h> 
  3. #include<myio.h> 
  4. #define uchar unsigned char 
  5. #define uint unsigined int 
  6. #define LED P0 
  7. sbit BUZZ=P0^6; 
  8.         
  9.  //延时 
  10. void delay(int x) 
  11.  { 
  12.  uchar i,j; 
  13.       for(i=0;i<x;i++) 
  14.          for(j=0;j<120;j++); 
  15.  } 
  16.  
  17. //主程序 
  18. void main() 
  19.   P2=0xa0; 
  20.   BUZZ=1; 
  21.   P2=0x80; 
  22.   P0=0xfe; 
  23.   LED=0xfe; //最右边灯亮 
  24.    while(1) 
  25.     { 
  26.       do 
  27.        {     
  28.          delay(200);   
  29.          LED=(LED<<1)|0x01;  //左移 
  30.      //   P0=_crol_(P0,1) ;        
  31.        }   while(LED!=0x7f);      //当最左边灯亮时跳出循环 
  32.       do 
  33.       { 
  34.        delay(200); 
  35.              LED=(LED>>1)|0x80;     //右移 
  36.     //   P0=_cror_(P0,1) ; 
  37.       } while(LED!=0xfe);   
  38.      
  39.          delay(100); 
  40.          alter(3); 
  41.          flash(3); 
  42.         right(3);        
  43.          left(3);              
  44.        } 

比较简单的一个C语言小程序,应用在51单片机上。

当left(3)执行到最后一步时LED=0x7f,即0111 1111

此时在执行while(1)循环的第一步:LED=(LED<<1)|0x01 ;LED的状态将变为LED=0xff 即1111 1111

以后便无法跳出第一个do while循环,所以会出现看似while(1)无法循环的假象。

注释掉的语句可作为循环移动的另一种方法。