多种花样流水灯


#include 
//位绑定
sbit LED = P0^0;
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;


/*一颗小灯点亮*/
void main()
{
    ENLED = 0;
    ADDR3 = 1;
    ADDR2 = 1;
    ADDR1 = 1;
    ADDR0 = 0;
    LED = 0;//点亮右小灯
    while(1);
}
/*一颗小灯闪烁 */
void main()
{
    unsigned int i = 0;
    ENLED = 0;
    ADDR3 = 1;//使用138译码器U3
    ADDR2 = 1;
    ADDR1 = 1;
    ADDR0 = 0;
    LED = 0;//点亮右小灯
    while(1)
    {
        LED = 0;
        for(i = 0;i < 30000;i++);//延时,让小灯闪烁
        LED = 1;
        for(i = 0;i < 30000;i++);
    }
}


/*小灯点亮,并向左一颗一颗的闪烁 */

unsigned int i = 0;//定义循环变量 i 用于延时
unsigned char cnt = 0;//定义计数变量,用于移位控制
void main()
{
    ENLED = 0;
    ADDR3 = 1;//使用138译码器U3
    ADDR2 = 1;
    ADDR1 = 1;
    ADDR0 = 0;
    while(1)
    {
         P0 = ~(0x01 << cnt);//P0等于 1 左移cnt位,控制 8 个 LED
         for(i = 0;i < 20000;i++);
         cnt++;//移位计数变量自加 1
         if(cnt >= 8)//移位计数超过 7 位后,再重新从 0 开始
         {
             cnt = 0;
         }
    }
}

/*控制LED左移后再右移(呼吸灯) */
//数据源
unsigned char code DataArray[]={0x7f,0xbf,0xdf,0xef,
                           0xf7,0xfb,0xfd,0xfe};

unsigned char i;//循环输出数组里面的值    
//延时
void delay_ms(unsigned int j)
{
        while(j--);
}
void main()
{
      //配置条件
        ADDR0 = 0;
        ADDR1 = 1;
        ADDR2 = 1;
        ADDR3 = 1;
        ENLED = 0; //使能
        
            while(1)
            {
                    for(i=0;i<8;i++)
                    {
                            P0=DataArray[0] >> i;//控制LED向右移
                            delay_ms(30000);
                    }
                    for(i=0;i<8;i++)
                    {
                          P0=~(DataArray[7] << i);//控制LED向左移
                          delay_ms(30000);
                    }
            }
}


/*控制LED左移后再右移(闪烁灯) */
//数据源
unsigned char code DataArray[]={0x7f,0xbf,0xdf,0xef,
                           0xf7,0xfb,0xfd,0xfe};
//方向标志位
unsigned char flag=0;

unsigned char i;
//延时
void delay_ms(unsigned int i)
{
        while(i--);
}
void main()
{
      //配置条件
        ADDR0 = 0;
        ADDR1 = 1;
        ADDR2 = 1;
        ADDR3 = 1;
        ENLED = 0; 
    
    if(flag==0)
    {
            for(i=0;i<8;i++)
            {
                    P0 = DataArray[i];
                    delay_ms(30000);
            }
            if(i==8)
            {
                flag=1;
            }
    }if(flag==1)
    {
            for(i=0;i<8;i++)
            {
                    P0 = DataArray[7-i];
                    delay_ms(30000);
            }
            if(i==8) 
            {
              flag=0;
            }
    }
    


    /*两边向中间闪烁  再从中间倒回去 */
    //数据源
unsigned char code buff[]={0x7e,0xbd,0xdb,0xe7,
                           0xe7,0xdb,0xbd,0x7e};
unsigned char i;
unsigned int cnt;
//延时
void delay_ms(unsigned int i)
{
        while(i--);
}
void main()
{
      //配置条件
        ADDR0 = 0;
        ADDR1 = 1;
        ADDR2 = 1;
        ADDR3 = 1;
        ENLED = 0; 
            while(1)
            {
                    cnt=0;
                     for(i=0;i<8;i++)
                        {
                            P0 = buff[i];
                            delay_ms(30000);
                        }
            }
}

/*实现同时向左或者向右  中间隔三颗 */

//数据源
unsigned char code buff[]={0x7e,0xbd,0xdb,0xe7,
                           0xe7,0xdb,0xbd,0x7e};
unsigned char i;
unsigned int cnt;
//延时
void delay_ms(unsigned int i)
{
        while(i--);
}
void main()
{
      //配置条件
        ADDR0 = 0;
        ADDR1 = 1;
        ADDR2 = 1;
        ADDR3 = 1;
        ENLED = 0; 
    
        TMOD = 0x01;
        TH0 = 0x4c;
        TL0 = 0x00;
        TR0 = 1;
    while(1)
    {
        for(i=0;i<8;)
      {
            if(TF0 == 1)
            {
                    TF0=0;
                    TH0 = 0x4c;
                    TL0 = 0x00;
                    cnt++;
                    if(cnt==10)
                    {
                            cnt=0;
                            P0 = buff[i];
                            i++;
                    }
            }
        }
    }
}


/* 定时器  和中断的结合  实现流水灯效果 */

#include 

sbit ADDR0=P1^0;
sbit ADDR1=P1^1;
sbit ADDR2=P1^2;
sbit ADDR3=P1^3;
sbit ENLED=P1^4;
//数据源
unsigned char code DataArray[]={0x7f,0xbf,0xdf,0xef,
                               0xf7,0xfb,0xfd,0xfe};

unsigned char i;//循环输出数组里面的值

unsigned short count = 0;//记录中断次数
                                                             
unsigned long second = 0;//记录所需要的时间
                                                             
bit flag = 0;
void main()
{
      //配置条件
            ADDR0 = 0;
            ADDR1 = 1;
        ADDR2 = 1;
        ADDR3 = 1;
            ENLED = 0; //使能
        //定时1ms的配置
            //采用定时器0 模式设置
            TMOD = TMOD | 0x01;
            //计数初始值
            TH0 = 0xfc;
            TL0 = 0x66;
            //开启定时
            TR0 = 1;
            //中断配置
            //中断总开关
            EA = 1;//IE = 0x80;
            //定时器0的中断时能
            ET0 = 1;
            while(1);
}

void InterruptTime0() interrupt 1
{
        //初始值重新赋值
    TH0 = 0xFC;
    TL0 = 0x66;
    count++;
    //消隐
    //P0 = 0xff;
    if(count == 1000)
    {
        count = 0;
        if(flag == 0)   //标志,0右移,1左移
        {
            P0 = (0x7F >> i++);
            if(i == 8)   //到8之后,修改标志位,清0
            {
                flag = 1;
                i = 0;
            }
        }
        if(flag == 1)   
        {
            P0 = ~(0xFF << i++);
            if(i == 8)
            {
                i = 0;
                flag = 0;
            }
        }
    } 
    
        
}

你可能感兴趣的:(多种花样流水灯)