在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灯的学习还是比较简单的。