花样LED

程序现象:
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();
}
}

上一篇:几何图形渲染


下一篇:嵌入式Linux学习笔记——汇编指令LDR、STR