分类: 嵌入式
2014-06-09 20:40:31
4、LED左移动
实现移动,可以用上面的方法逐个点亮熄灭LED2~LED9灯,实现流水灯的效果。
//*******************************************
// 名称:LED灯左移动
//*******************************************
// 作用:从左到右依次让LED灯亮1秒然后熄灭
//*******************************************
#include
#define uint unsigned int
void delayms(uint);
sbit led2=P1^0;
sbit led3=P1^1;
sbit led4=P1^2;
sbit led5=P1^3;
sbit led6=P1^4;
sbit led7=P1^5;
sbit led8=P1^6;
sbit led9=P1^7;
void main()
{
while(1)
{
led2=0;
delayms(1000);
led2=1;
delayms(1000);
led3=0;
delayms(1000);
led3=1;
delayms(1000);
led4=0;
delayms(1000);
led4=1;
delayms(1000);
led5=0;
delayms(1000);
led5=1;
delayms(1000);
led6=0;
delayms(1000);
led6=1;
delayms(1000);
led7=0;
delayms(1000);
led7=1;
delayms(1000);
led8=0;
delayms(1000);
led8=1;
delayms(1000);
led9=0;
delayms(1000);
led9=1;
delayms(1000);
}
}
void delayms(unsigned int xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=114;j>0;j--);
}
可以看到,这个太复杂了,如果灯太多的话,程序命令更复杂。所以考虑用其他方法实现。在实现流水灯可以用C51已有的库文件_crol_()实现循环左移。
完整源代码如下:
//*******************************************
// 名称:LED灯左移动(用_crol_实现)
//*******************************************
// 作用:从左到右依次让LED灯亮1秒然后熄灭
//*******************************************
#include
#include
#define uint unsigned int
#define uchar unsigned char
void delayms(uint);
void main()
{
P1=0xFE; //给定初值,LED2被点亮
while(1)
{
delayms(1000);
P1=_crol_(P1,1);
}
}
void delayms(unsigned int xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=114;j>0;j--);
}
使用库函数的时候一定要注意:要记得引入头文件#include
右移的实现用,只需要将初始值和库函数改一下就可以了。
完整源代码如下:
//*******************************************
// 名称:LED灯右移动(用_cror_实现)
//*******************************************
// 作用:从右到左依次让LED灯亮1秒然后熄灭
//*******************************************
#include
#include
#define uint unsigned int
#define uchar unsigned char
void delayms(uint);
void main()
{
P1=0x7F; //给定初值,LED2被点亮
while(1)
{
delayms(1000);
P1=_cror_(P1,1);
}
}
void delayms(unsigned int xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=114;j>0;j--);
}
除了左移和右移以外,还可以实现花样灯。花样灯顾名思义就是灯的流动种类会很多,街上的霓虹灯就是一种花样灯。
5、花样灯
因为花样灯的种类很多,把所需要的所有花样,存储在一个数组里面,按照顺序送到相应的单片机口,实现点亮功能。
//*******************************************
// 名称:花样灯
//*******************************************
// 作用:按照设定的值显示花样灯
//*******************************************
#include
#define uint unsigned int
#define uchar unsigned char
void delayms(uint);
uchar code table[]={
0xFC,0xF9,0xE3,0xF7,0xCF,0x9F,0x3F,0x7F,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE7,0xDB,0xBD,0x7E,
0xBD,0xDB,0xE7,0xFF,0xE7,0xC3,0x81,0x00,0x81,0xC3,
0xE7,0xFF,0xAA,0x55,0x18,0xFF,0xF0,0x0F,0x00,0xFF,
0xF8,0xF1,0xE3,0xC7,0x8F,0x1F,0x3F,0x7F,0x7F,0x3F,
0x1F,0x8F,0xC7,0xE3,0xF1,0xF8,0xFF,0x00,0x00,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0xBF,0xDF,0xEF,0xF7,
0xFB,0xFD,0xfe,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xc0,
0xe0,0xf0,0xf8,0xfc,0xfe,0x00,0xff,0x00,0xff,0x00,
0xff,0x00,0xff};
void main()
{
uchar i;
while(1)
{
for(i=0;i<123;i++)
{
P1=table[i];
delayms(500);
}
}
}
void delayms(unsigned int xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=114;j>0;j--);
}
只要存储器允许的情况下,可以给数组中无限添加数据。
接下来实现另外一个现实中最常见的指示灯——交通灯。
6、交通灯
交通灯就是要考虑东西方向和南北方向的三个灯,在不同颜色下的变化。
在东西和南北方向分别用三个指示灯来模拟三种红绿灯指示。
从电路图可以看出,LED2、LED3为红色指示灯,LED4、LED5为黄色指示灯,LED6、LED7为绿色指示灯。设定LED2、LED4、LED6代表的是东西方向的三个红绿指示灯;LED3、LED5、LED7代表的是南方方向的红绿指示灯。
完整的源代码如下:
//*******************************************
// 名称:交通灯
//*******************************************
// 作用:模拟交通灯显示
//*******************************************
#include
#define uint unsigned int
#define uchar unsigned char
sbit RED_A=P1^0; //A为东西向
sbit RED_B=P1^1; //B为南北向
sbit YELLOW_A=P1^2;
sbit YELLOW_B=P1^3;
sbit GREEN_A=P1^4;
sbit GREEN_B=P1^5;
void delayms(uint);
void traffic_light();
uchar operation_type=1;
uchar a=0;
uchar i;
void main()
{
while(1)
{
traffic_light();
}
}
void delayms(unsigned int xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=114;j>0;j--);
}
void traffic_light()
{
uchar i;
switch (operation_type)
{
case 1:
GREEN_A=0; RED_A=1; YELLOW_A=1; //东西向绿灯亮
GREEN_B=1; RED_B=0; YELLOW_B=1; //南北向红灯亮
delayms(1000);
operation_type=2;
case 2:
delayms(1000);
GREEN_A=1; //东西向绿灯关闭
for(i=10;i>0;i--) //东西向黄灯闪烁
{ ++a;
if(a==10) RED_B=1;
YELLOW_A=~YELLOW_A;
delayms(500);
}
a=0;
operation_type=3;
case 3:
RED_A=0;YELLOW_A=1;GREEN_A=1; //东西向红灯亮
RED_B=1;YELLOW_B=1;GREEN_B=0; //南北向绿灯亮
delayms(1000);
operation_type=4;
case 4:
GREEN_B=1; //东西向绿灯关闭
for(i=10;i>0;i--) //东西向黄灯闪烁
{
++a;
if(a==10) RED_A=1;
YELLOW_B=~YELLOW_B;
delayms(500);
}
a=0;
operation_type=1;
}
}
到此, LED灯所有内容都学习完了。