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♪(・ω・)ノ