您的位置:首页 > 其它

基于单片机的LED流水灯(着力解决加速减速bug问题)

2017-12-10 20:29 531 查看
设计花样流水灯,通过点亮组合发光二极管,显示十六个灯不同的花样,设置有开始、停止按键,并且可以通过相关按键来控制各花样运行的速度。在加速和减速按键上花了较多时间,看起来简单的东西自己写出来越困难。还有很多可以改进的地方。


#include<reg51.h>
#include<intrins.h>
unsigned char led_P0[]={0X01,0X02,0X04,0X08,0X10,0X20,0X40,0X80};   //从上往下循环点亮
unsigned char led_P2[]={0X01,0X02,0X04,0X08,0X10,0X20,0X40,0X80};
unsigned char led_P3[]={0X80,0X40,0X20,0X10,0X08,0X04,0X02,0X01};  //从下往上循环点亮
sbit P1_0=P1^0;
sbit P1_1=P1^1;
sbit P1_2=P1^2;
sbit P1_3=P1^3;
sbit P1_4=P1^4;
sbit P1_5=P1^5;
sbit P1_6=P1^6;
sbit P3_6=P3^6;
sbit P3_7=P3^7;

char i,k,t,zanting, moshi1, moshi2, moshi3, moshi4, moshi5, moshi6,jiasu,jiansu;

int a ,ms ;
/*测试延时1017.80us,约1ms*/
void delay(unsigned int z)
{
unsigned int x,y;
for(x = z; x > 0; x--)
for(y = 114; y > 0 ; y--);
}
/*
void delay (unsigned char time)
{
unsigned int j=15000;
for(;time>0;time--)
for(;j>0;j--);
} */

/*判断按键*/
void jiance()
{
switch(P1&0XFF)
{
case 0xfe: zanting=1;moshi1=0;moshi3=0;moshi2=0;moshi4=0;moshi5=0;moshi6=0;jiasu=0;jiansu=0; break;
case 0xfd:moshi1=1;zanting=0;moshi3=0;moshi2=0;moshi4=0;moshi5=0;moshi6=0;jiasu=0;jiansu=0;break;
case 0xfb:moshi2=1;zanting=0;moshi3=0;moshi1=0;moshi4=0;moshi5=0;moshi6=0;jiasu=0;jiansu=0;break;
case 0xf7:moshi3=1;zanting=0;moshi1=0;moshi2=0;moshi4=0;moshi5=0;moshi6=0;jiasu=0;jiansu=0;break;
case 0xef:moshi4=1;zanting=0;moshi3=0;moshi2=0;moshi1=0;moshi5=0;moshi6=0;jiasu=0;jiansu=0;break;
case 0xdf:moshi5=1;zanting=0;moshi3=0;moshi2=0;moshi4=0;moshi1=0;moshi6=0;jiasu=0;jiansu=0;break;
case 0xbf:moshi6=1;zanting=0;moshi3=0;moshi2=0;moshi4=0;moshi5=0;moshi1=0;jiasu=0;jiansu=0;break;
}
}

void  jiance2()
{
switch(P3) {
case 0xbf:jiasu=1; break;
case 0x7f:jiansu=1;break;
}
}
void init_timer0()
{
TMOD = 0x01;
TH0 = (65536 - 15000) / 256;
TL0 = (65536 - 15000) % 256;
ET0 = 1;
EA = 1;
TR0 = 1;
}

void timer0_intr() interrupt 1
{
TH0 = (65536 - 15000) / 256;
TL0 = (65536 - 15000) % 256;
jiance2();
jiance();
}

void key()
{
if(jiansu)   //速度减
{
jiansu = 0;
if(ms<1000)
ms += 100;
}
if(jiasu) //速度加
{
jiasu = 0;
if(ms>1)
ms -= 100;
}
}

void main()
{
init_timer0();     //函数声明
ms = 500;
a=0x01;
while(1)
{

if(zanting)
{
P0=0;
P2=0;
}
else{
if(moshi1)      //从上往下,循环点亮
{
for(i=0;i<16;i++)
{
key();
if(i<8)
{
P2=0x00;
P0=a;
}
else
{
P0=0x00;
P2=a;
}
a = _crol_(a,1);
delay(ms);
}

/*
for(i=0;i<8;i++)
{
P0=led_P0[i];
for(k=0;k<8;k++)
{       if(moshi1==0)
{
break;
}
P2=led_P2[k];
delay(200);

}
} */
}

if(moshi2)      //从下往上,循环点亮
{
a=0x80;
for(i=0;i<16;i++)
{

if(i<8)
{
P0=0x00;
P2=a;
a=_cror_(a,1);
delay(200);
}
if(i>7)
{
P2=0x00;
P0=a;
a=_cror_(a,1);
delay(200);

}
}
/*for(i=7;i>=0;i--)
{
P2=led_P2[i];
for(k=7;k>=0;k--)
{       if(moshi2==0)
{
break;
}
P0=led_P0[k];
delay(200);
}
} */
}

if(moshi3)      //从上往下,隔一个循环点亮

{
a=0x01;
for(i=0;i<16;i+=2)
{
if(i<8)
{
P2=0x00;
P0=a;
a=_crol_(a,2);
delay(400);
}
if(i>7)
{
P0=0x00;
P2=a;
a=_crol_(a,2);
delay(400);

}
}
}
/*for(i=0;i<8;i+=2)
{
P0=led_P0[i];
for(k=0;k<8;k+=2)
{
if(moshi3==0)
{
break;
}
P2=led_P2[k];
delay(200);
}
} */

if(moshi4)                  //全亮,闪动
{
P2=P0=0XFF;
delay(200);
P2=P0=0X00;
delay(200);
}

if(moshi5)              //中间向两边循环点亮
for(i=0;i<8;i++)
{
P0=led_P3[i];
P2=led_P2[i];
delay(200);
}
}

if(moshi6)              //中间向两边循环点亮
for(i=0;i<8;i++)
{
P0=led_P0[i];
P2=led_P3[i];
delay(200);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐