51单片机特殊流水灯设计:中间向两边流动效果详解

这是在学校嵌入式应用协会中开学考核的一道题目,具体如下:按下独立按键K1设置led流水灯,从中间向两边流动,后8个流水灯同时进行闪烁,并使用独立按键K2控制流水灯2级变速。

我对题目的理解比较简单粗暴,流水灯的实现直接运用for循环,由于LED为8位,从中间向两边流动为对称图形,所以我直接对两侧同时进行处理,并循环4次。流水灯函数-具体变化:1110 0111->1101 1011->1011 1101->0111 1110。0为亮,1则灭,循环四次。而我对流水灯得亮灭控制用的是十进制运算,由于芯片底层始终为二进制,所以控制LED的亮灭本质上还是二进制。而闪烁就是不断地亮灭交替,使用的是延迟与循环,二级变速则是外部中断处理。

具体代码如下:

//led闪烁,流水灯
//k3用来调节闪烁频率
//k2用来开启流水灯
#include "reg52.h"

#define led P0
sbit k3=P2^1;
sbit k2=P2^0;


void delayms (uint n)//延时函数
{
    uint i=0,j=0;
    for(i=0;i<n;i++)
        for(j=0;j<123;j++);
}

void speedchange()//闪烁时间 即二级变速函数
{
    if(k3==0)
    {
        delayms(10);
            if(k3==0)
            {
                speed-=1000;
            }
    }while(!k3);
}

void ledshanshuo()//闪烁处理
{
    while(1)
    {
        led=0x00;
        delayms(speed);
        led=0xff;
        delayms(speed);
    }        
}


void ledliushui()//流水灯函数-具体变化:1110 0111->1101 1011->1011 1101->0111 1110;0为亮,1则灭,循环四次;
{
    uchar a,b,i;
    a=8;
    b=16;
    for(i=0;i<4;i++)
    {
        a=a*2;
        b=b/2;
        led=(240-a)+(15-b);
        delayms(500);
    }
ledshanshuo();
}



void ledkeymanage()
{
    if(k2==0)
    {
        delayms(10);
            if(k2==0)
            {
                ledliushui();
            }
    }while(!k2);
}

void int0init()//外部中断初始化
{
    EX0=1;
    IT0=1;
    EA=1;
}

void int0() interrupt 0 //中断函数
{
    speedchange();
}

void main()
{
    int0init();//外部中断起始化;
    while(1)
    {
         ledkeymanage();//按键处理,按下按键后,开启流水灯  
    }
}

这道题有点像数学的找规律,刚开始有想过将LED四个四个分开,但是浪费引脚插口,就排除了。

如果有更好的方法,大佬,告诉我,求求了。

ps:求个赞,Thanks♪(・ω・)ノ

物联沃分享整理
物联沃-IOTWORD物联网 » 51单片机特殊流水灯设计:中间向两边流动效果详解

发表评论