您的位置:首页 > 其它

左右来回移动的流水灯

2016-01-28 12:13 267 查看
最近整理以前的程序代码,看到这个程序。这个程序好像是一个QQ群当时一个人问的一个问题,当时随手写了这个程序。这个程序运用到2个标志位,一个是左移标志位flag和右移标志位flag1。通过这两个标志位来决定移动的方向。硬件连接:51单片机的P0口连接一组LED灯,LED是下拉电阻。直接上代码:

#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
void Delay10ms(uint);
uchar aa;
uchar flag,flag1; 	//flag设定循环左移标志,flag1设定循环右移的标志
void main()
{
uchar i,j;
aa=0x01;
P0 = aa;
Delay10ms(100);//如果不加这个延时,第一个灯看到就闪一下
flag = 1;
while(1)
{
if(flag)
{
for(i=0;i<7;i++)
{
aa = _crol_(aa,1);
P0 = aa;
Delay10ms(100);
}
flag = 0;
flag1 = 1;
}
if(flag1)
{
for(j=7;j>0;j--)
{
aa = _cror_(aa,1);
P0 = aa;
Delay10ms(100);
}
flag1 = 0;
flag = 1;
}
}
}
void Delay10ms(uint c)   //误差 0us
{
uchar a, b;

//--c已经在传递过来的时候已经赋值了,所以在for语句第一句就不用赋值了--//
for (;c>0;c--)
{
for (b=38;b>0;b--)
{
for (a=130;a>0;a--);
}

}
}


今天把程序跑起来的时候发现2个问题。一、单片机上电后,第一个灯闪一下。找到原因是初始化aa并赋给P0后没有延时一段时间,加入延时后正常显示。二、在左移和右移的时候会出现紊乱的现象,找到原因是把计数器i和j的值都计数的8次,因为第一个灯初始化是亮的,应该往左移7位就8个灯全部点亮了,这个时候该往右移的,右移也只需要移动7位够了。因此把这个问题解决后就正常显示了。

这个小例子可以看出我们在写程序的时候,一定要把问题分析透彻了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: