遇到一道流水灯问题,大神请进,谢谢了
- 题目是第一次一个灯流动一次,第二次两个灯流动,依次到8个灯,时间间隔为300ms。我写出的程序第3次开始灯的显示就有问题。大神帮忙改下,谢谢了。
#include<reg52.h>
#include<intrins.h>
void delay(int x)
{
int i,j;
for(i=110;i>=0;i--)
for(j=x;j>=0;j--);
}
void main()
{
int a,b;
while(1)
{
a=0xfe;
for(b=1;b<8;b++)
{
P1=a;
a=_crol_(a,1);
delay(300);
}
delay(300);
a=0xfc;
for(b=1;b<7;b++)
{
P1=a;
a=_crol_(b,1);
delay(300);
}
delay(300);
a=0xf8;
for(b=1;b<6;b++)
{
P1=a;
a=_crol_(a,1);
delay(300);
}
delay(300);
a=0xf0;
for(b=1;b<5;b++)
{
P1=a;
a=_crol_(a,1);
delay(300);
}
delay(300);
a=0xe0;
for(b=1;b<4;b++)
{
P1=a;
a=_crol_(a,1);
delay(300);
}
delay(300);
a=0xc0;
for(b=1;b<4;b++)
{
P1=a;
a=_crol_(a,1);
delay(300);
}
delay(300);
a=0x80;
for(b=1;b<3;b++)
{
P1=a;
a=_crol_(a,1);
delay(300);
}
delay(300);
a=0x00;
P1=a;
delay(300);
}
}
谢谢,你的是8种灯亮的情况都写出来,有没有简单一些的
试试直接for循环。我先看看,然后发给你
看不见你发的程序
#include<reg51.h>
#include<intrins.h>
#include<math.h>
void Delay(unsigned int c);
void main()
{
int a,b;
while(1)
{
P0=0x01;
for(b=8;b>0;b--)
{
for(a=8;a>0;a--)
{
Delay(3);
P0=_crol_(P0,1);
}
P0=P0+pow(2,8-b);
}
}
}
void Delay(unsigned int c)
{
int a,b;
for(;c>0;c--)
{
for(a=123;a>0;a--)
{
for(b=100;b>0;b--);
}
}
}
顶一贴,我是新手,感觉对啊,我的开发板坏了,等我试试哈
不好意思,第一次发的程序有误,这是正确的,亲测无误。
#include<reg52.h>
#include<intrins.h>
void delay(int x)
{
int i,j;
for(i=110;i>=0;i--)
for(j=x;j>=0;j--);
}
void main()
{
int a,b;
while(1)
{
a=0xfe;
for(b=0;b<8;b++)
{
P1=a;
a=_crol_(a,1);
delay(100);
}
delay(100);
a=0xfc;
for(b=0;b<7;b++)
{
P1=a;
a=_crol_(a,1);
delay(100);
}
delay(100);
a=0xf8;
for(b=0;b<6;b++)
{
P1=a;
a=_crol_(a,1);
delay(100);
}
delay(100);
a=0xf0;
for(b=0;b<5;b++)
{
P1=a;
a=_crol_(a,1);
delay(100);
}
delay(100);
a=0xe0;
for(b=0;b<4;b++)
{
P1=a;
a=_crol_(a,1);
delay(100);
}
delay(100);
a=0xc0;
for(b=0;b<3;b++)
{
P1=a;
a=_crol_(a,1);
delay(100);
}
delay(100);
a=0x80;
for(b=0;b<2;b++)
{
P1=a;
a=_crol_(a,1);
delay(100);
}
delay(100);
P1=0;
delay(100);
}
}
不好意思,第一次发的程序有误,这是正确的,亲测无误。
#include<reg52.h>
#include<intrins.h>
void delay(int x)
{
int i,j;
for(i=110;i>=0;i--)
for(j=x;j>=0;j--);
}
void main()
{
int a,b;
while(1)
{
a=0xfe;
for(b=0;b<8;b++)
{
P1=a;
a=_crol_(a,1);
delay(100);
}
delay(100);
a=0xfc;
for(b=0;b<7;b++)
{
P1=a;
a=_crol_(a,1);
delay(100);
}
delay(100);
a=0xf8;
for(b=0;b<6;b++)
{
P1=a;
a=_crol_(a,1);
delay(100);
}
delay(100);
a=0xf0;
for(b=0;b<5;b++)
{
P1=a;
a=_crol_(a,1);
delay(100);
}
delay(100);
a=0xe0;
for(b=0;b<4;b++)
{
P1=a;
a=_crol_(a,1);
delay(100);
}
delay(100);
a=0xc0;
for(b=0;b<3;b++)
{
P1=a;
a=_crol_(a,1);
delay(100);
}
delay(100);
a=0x80;
for(b=0;b<2;b++)
{
P1=a;
a=_crol_(a,1);
delay(100);
}
delay(100);
P1=0;
delay(100);
}
}
不好意思,第一次发的程序有误,这是正确的,亲测无误。
#include<reg52.h>
#include<intrins.h>
void delay(int x)
{
int i,j;
for(i=110;i>=0;i--)
for(j=x;j>=0;j--);
}
void main()
{
int a,b;
while(1)
{
a=0xfe;
for(b=0;b<8;b++)
{
P1=a;
a=_crol_(a,1);
delay(100);
}
delay(100);
a=0xfc;
for(b=0;b<7;b++)
{
P1=a;
a=_crol_(a,1);
delay(100);
}
delay(100);
a=0xf8;
for(b=0;b<6;b++)
{
P1=a;
a=_crol_(a,1);
delay(100);
}
delay(100);
a=0xf0;
for(b=0;b<5;b++)
{
P1=a;
a=_crol_(a,1);
delay(100);
}
delay(100);
a=0xe0;
for(b=0;b<4;b++)
{
P1=a;
a=_crol_(a,1);
delay(100);
}
delay(100);
a=0xc0;
for(b=0;b<3;b++)
{
P1=a;
a=_crol_(a,1);
delay(100);
}
delay(100);
a=0x80;
for(b=0;b<2;b++)
{
P1=a;
a=_crol_(a,1);
delay(100);
}
delay(100);
P1=0;
delay(100);
}
}
这个应该满足你的要求,前提是将硬件设置好
#include<reg52.h>
void delay();
void main()
{
P0 = 0xFF; //此行可不要,是我的习惯
while(1)
{
unsigned char i, j;
unsigned char shift; //设定临时变量,通过改变变量值为P0口赋值
for(i=1; i<9; i++)
{
j = i;
shift = 0x01;
while(j--)
{
P0 = ~shift;
shift = shift << 1;
delay();
}
}
}
}
void delay() //时间自己确定改变i的值即可
{
unsigned int i;
for(i=0; i<35000; i++);
}
不好意思,可能是我没表达清楚,第一次只有一个灯在流动,第二次两个灯一起流动,以此类推。还是谢谢你的回答,有兴趣的话就继续帮想下这题怎么做。
本人亲测,符合你的要求。
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar code dat[]={0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00};
void Delayms(uint n)
{
uint i,j;
for(i=n;i>0;i--)
for(j=115;j>0;j--);
}
void main()
{
uchar a,b,c;
while(1)
{
for(a=0;a<7;a++)
{
c=dat[a];
for(b=8-a;b>0;b--)
{
P0=c;
Delayms(300);
c=_crol_(c,1);
}
}
a=4;
while(a--)
{
P0=0x00;
Delayms(300);
P0=~P0;
Delayms(300);
}
}
}
我的板子是低电平点亮,如果你的是高电平点亮的话,就将数组改为以下数据:
uchar code dat[]={0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};
赤焰火狐正解,我的板子没问题
已经学知识感谢
已经学知识感谢
谢谢,正解!