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

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

你可能感兴趣的:(单片机)