流水灯个性化点亮
流水灯个性化点亮
实现发光二极管先由上往下、再由下往上、奇数、偶数循环点亮的流水灯
(ps:软件操作、烧录等参考博客之流水灯)
一、Proteus电路图
?
二、Keil代码
1、用数组实现
#include
#define uchar unsigned char
uchar tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xfe,0xfb,0xef,0xbf,0xfd,0xf7,0xdf,0x7f};//前八个数据为左移点亮数据、后八个为右移点亮数据、再后面四个数是奇数左移、最后四个数是偶数左移
void delay () //延时函数
{
uchar i,j;
for(i=0;i<255;++i)
for(j=0;j<255;++j);
}
void main() //主函数
{
uchar i;
while(1)
{
for(i=0;i<24;++i)
{
P1=tab[i]; //向P1口送出点亮数据
delay();
}
}
}
2、用移位运算符实现
#include
#define uchar unsigned char
void delay () //延时函数
{
uchar i,j;
for(i=0;i<255;++i)
for(j=0;j<255;++j);
}
void main()
{
uchar i,temp;
while(1)
{
temp=0x01; //左移初值(第一个发光二极管)赋给temp
for(i=0;i<8;++i)
{
P1=~temp; //temp中的数据取反后送P1口
delay();
temp=temp<<1; //temp中数据左移一位
}
temp=0x80; //右移初值(第八个发光二极管)赋给temp
for(i=0;i<8;++i)
{
P1=~temp; //temp中的数据取反后送P1口
delay();
temp=temp>>1; //temp中数据右移一位
}
temp=0x01; //左移初值(第一个发光二极管)赋给temp
for(i=0;i<8;++i)
{
P1=~temp; //temp中的数据取反后送P1口
delay();
temp=temp<<2; //temp中数据左移两位
}
temp=0x02; //右移初值(第二个发光二极管)赋给temp
for(i=0;i<8;++i)
{
P1=~temp;
delay();
temp=temp<<2; //temp中数据右移两位
}
}
}
3、用移位函数实现
#include
#include //包含左、右移位函数的头文件
#define uchar unsigned char
void delay ()
{
uchar i,j;
for(i=0;i<255;++i)
for(j=0;j<255;++j);
}
void main()
{
uchar i,temp;
while(1)
{
temp=0xfe; //初值为11111110
for(i=0;i<7;++i)
{
P1=temp; //temp中的点亮数据送P1口
delay();
temp=_crol_(temp,1); //执行循环左移函数,temp中的数据左移一位
}
for(i=0;i<7;++i)
{
P1=temp; //temp中的数据送P1口输出
delay();
temp=_cror_(temp,1); //执行循环右移函数,temp中的数据右移一位
}
for(i=0;i<4;++i)
{
P1=temp;
delay();
temp=_crol_(temp,2); //temp中的数据左移两位
}
temp=0xfd; //赋值为第二个发光二极管
for(i=0;i<4;++i)
{
P1=temp;
delay();
temp=_crol_(temp,2); //temp中的数据左移两位
}
}
}
三、效果展示
四、感言
对于for循环的结束条件,如果没有控制对,发光情况会错乱或者某一规律的没有显示完。第二种方法,在奇数发光后,右移两位实现偶数发光时,间隔较长,不知道为什么。