LED学习及一个花样流水灯的实现

      在STC89C52RC中,负责显示的有8个LED灯,8位数码管,并且支持1602和12864两种液晶显示屏;本篇总结的是8位红光LED灯模块。

     

     主要处理的是点亮和熄灭灯的操作。0是点亮,1是熄灭。其中点亮一位LED灯,有两种方法:一个是定义一个可以位寻址的变量;一个是利用总线方式直接为P0口赋值。

方法1例子:

/******************************************************** 位定义方式点亮一个LED灯********************************************************/ #include sbit p0_0=P0^0; //位定义P0口的第一位为p0_0 /*主函数*/ void main() //主函数 { p0_0=0; //p0_0置低,点亮第一个LED灯 while(1); }

方法2例子:

/****************************************** 用总线方式点亮一个LED灯 ******************************************/ #include void main() //主函数 { P0=0xfe; //直接给P0口的8个位赋值:0xfe=11111110B,低电平点亮末位LED while(1); //死循环,让程序停在此处 }

 

利用时延,在不同的时间段点亮不同位置的灯,可以实现花样流水灯。

一下给出一个例子:

/***************************************************************** 花样流水灯: 8个LED间隔300ms由右至左,再由左至右,再重复一次,然后全部熄灭再以 300ms间隔全部闪烁3次。之后,间隔300ms第一次一个LED亮并流动一次, 第二次两个LED亮并流动一次,……依次到8个LED亮后全部熄灭。最后,间 隔300ms先奇数亮再偶数亮,循环三次;两个LED分别从两边往中间流动三次; 再从中间往两边流动三次;8个LED再全部闪烁3次;关闭发光管,程序停止。 *****************************************************************/ #include #include void delay(int z);//声明延时函数 void flow1(); void flow2(); void flow3(); /*主函数*/ void main() { flow1();//调用flow1,完成第一部分的任务 delay(300);//延时300ms flow2(); delay(300); flow3(); P0=0xff; while(1); } /*定义延时函数*/ void delay(int z) { int x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } /*定义实现第一部分功能的函数: 8个LED间隔300ms由右至左,再由左至右,再重复一次,然后全部熄灭再以 300ms间隔全部闪烁3次。*/ void flow1() { int x,y,z; int a; P0=0x7f;//点亮l8 delay(300); //延时300ms for(a=0;a<2;a++) { for(x=0;x<7;x++) //左移 { P0=_cror_(P0,1);//调用循环左移函数,并赋值给P0 delay(300); } P0=0xfe;//点亮l1 delay(300); for(y=0;y<7;y++) //右移 { P0=_crol_(P0,1); delay(300); } } for(z=0;z<3;z++) //全部亮和全部暗闪烁三次 { P0=0xff; delay(300); P0=0x00; delay(300); } } /*定义完成第二部分功能的函数flow2:第一次一个LED亮并流动一次, 第二次两个LED亮并流动一次,……依次到8个LED亮后全部熄灭*/ void flow2() { int x; P0=0xfe;//点亮一个灯,左移 delay(300); for(x=0;x<7;x++) { P0=_crol_(P0,1); delay(300); } P0=0xfc;//点亮两个灯,左移 delay(300); for(x=0;x<6;x++) { P0=_crol_(P0,1); delay(300); } P0=0xf8;//点亮三个灯,左移 delay(300); for(x=0;x<5;x++) { P0=_crol_(P0,1); delay(300); } P0=0xf0;//点亮四个灯,左移 delay(300); for(x=0;x<4;x++) { P0=_crol_(P0,1); delay(300); } P0=0xe0; //点亮五个灯,左移 delay(300); for(x=0;x<3;x++) { P0=_crol_(P0,1); delay(300); } P0=0xc0;//点亮六个灯,左移 delay(300); for(x=0;x<2;x++) { P0=_crol_(P0,1); delay(300); } P0=0x80;//点亮七个灯,左移一次 delay(300); for(x=0;x<1;x++) { P0=_crol_(P0,1); delay(300); } P0=0x00;//点亮八个灯 delay(300); P0=0xff;//全部熄灭 } /*定义完成第三部分功能的函数:间隔300ms先奇数亮再偶数亮,循环三次;两个LED分 别从两边往中间流动三次;再从中间往两边流动三次;8个LED再全部闪烁3次;*/ void flow3() { int x; for(x=0;x<3;x++) //先奇数亮,再偶数亮,循环三次 { P0=0x55; delay(300); P0=0xAA; delay(300); } for(x=0;x<3;x++) //从两边往中间流动三次 { P0=0x7e; delay(300); P0=0xbd; delay(300); P0=0xdb; delay(300); P0=0xe7; delay(300); } for(x=0;x<3;x++) //从中间往两边流动三次 { P0=0xe7; delay(300); P0=0xdb; delay(300); P0=0xbd; delay(300); P0=0x7e; delay(300); } for(x=0;x<3;x++) //全暗全亮闪烁三下 { P0=0xff; delay(300); P0=0x00; delay(300); } }

个人认为,LED灯的学习还是比较简单的。

你可能感兴趣的:(LED学习及一个花样流水灯的实现)