程序现象:
1、先从右到左逐个亮灭;再从左到右逐个亮灭;
2、由两侧向中间,再中间向两侧亮灭;
3、先右再左逐个亮起,不熄灭;再从左到右逐个熄灭;
4、先左再右逐个亮起,不熄灭;再从右到左逐个熄灭;
#include "reg52.h"
#define led P2 //对整个P2端口进行操作
/* 延时函数 */
void delay(unsigned int del) //10ms * del
{
unsigned int i,j;
for(i=0; i<del; i++)
for(j=0; j<1827; j++)
;
}
void Led_Pipeline_1() //先从右到左逐个亮灭;再从左到右逐个亮灭;
{
unsigned char i;
delay(10);
led=0xfe; //初始状态将LED0点亮
for(i=0;i<8;i++)// 1111 1110
{
P2=~(0x01<<i); //将0000 0001左移i位,然后将结果取反赋值到P2口
delay(20); //大约延时200ms
}
// led=0xFF; //熄灭所有LED
// delay(20);
for(i=1;i<8;i++)
{
P2=~(0x80>>i); //将1右移i位,然后将结果取反赋值到P2口
delay(20);
}
// led=0xFF; //熄灭所有LED
}
void Led_Pipeline_2() //两侧向中间,再中间向两侧亮灭
{
unsigned char i,High,Low;
delay(20);
led=0x7E; //初始状态将两侧点亮
High=led&0xF0; //高四位 0111 0000
Low=led&0x0F; //低四位 0000 1110
delay(30);
for(i=0;i<3;i++)
{
High=~(~High>>1); //将0x8F右移1位 0100 0111, 1011 1000
Low=~(~Low<<1); //将0xFE左移1位
led=(High&0xF0)|(Low&0x0F);//保证高位、低位不受到移位影响
delay(30);
}
// led=0xFF; //熄灭所有LED
// delay(20);
// led=0xE7;//初始状态将中间两颗LED点亮
// delay(30);
for(i=0;i<3;i++)
{ //1110 0111
High=~(~High<<1); //将0x1*左移i位
Low=~(~Low>>1); //将0x*8右移i位
led=(High&0xF0)|(Low&0x0F);//保证高位、低位不受到移位影响
delay(30);
}
led=0xFF; //熄灭所有LED
}
void Led_Pipeline_3() //先右再左逐个亮起,不熄灭;再从左到右逐个熄灭;
{
unsigned char i;
delay(20);
led=0xfe; //初始状态将LED0点亮
delay(10);
for(i=0;i<8;i++)
{
P2=0xFE<<i; //将1111 1110左移i位,然后将结果赋值到P2口
delay(10); //大约延时100ms
}
led=0xFF; //熄灭所有LED
for(i=0;i<8;i++)
{
P2=~(0xFF>>i); //将1111 1111右移i位,然后将结果取反赋值到P2口
delay(10);
}
led=0xFF; //熄灭所有LED
}
void Led_Pipeline_4() //先左再右逐个亮起,不熄灭;再从右到左逐个熄灭;
{
unsigned char i;
delay(20);
led=0x7F;
delay(10);
for(i=0;i<8;i++)
{
P2=0x7F>>i;
delay(10);
}
led=0xFF;
for(i=0;i<8;i++)
{
P2=~(0xFF<<i);
delay(10);
}
led=0xFF; //熄灭所有LED
}
void main()
{
while(1)
{
Led_Pipeline_1();
Led_Pipeline_2();
Led_Pipeline_3();
Led_Pipeline_4();
}
}