用两组I/O口控制16个流水灯的C51程序

用数组可以吗?怎么定义?或直接
P0=fe;
P2=fd;
P0=fd;
P2=fe;
P0=7b;
P2=ff;
P0=b7;
P2=ff;
P0=cf;
P2=ff;
可以吗?有更简单的程序吗?有啥建议和方法?可以写一下程序吗?Thanks
不用锁存器
灯亮之后不可以灭。。。须最后16个灯全亮。。。。。。。。

数组可以,直接也可以
数组的话,比如定义个数组,uchar led[]={0xfe,0xfd,0xfb,0x07………………};
for(i=0;i<8;i++)
{
P0=led[i];
delayms(1000)
}
直接的话,同样的道理,只是代码比较多一些,每次重新赋值一次P0都需要延时一下。
更简单的程序如下:
#include<reg51.h> //包含单片机寄存器的头文件
/*****************************
函数功能:延时一段时间
*****************************/
void delay(void)
{
unsigned int n;
for(n=0;n<30000;n++)
;
}
/*****************************
函数功能:主函数
*****************************/
void main(void)
{
unsigned char i;
while(1)
{
P1=0xff;
delay();
for(i=0;i<8;i++)//设置循环次数为8
{
P1=P1>>1; //每次循环P1的各二进位右移1位,高位补0
delay(); //调用延时函数
}
}

}追问

for(i=0;i<8;i++)//设置循环次数为8

为啥设置循环次数为8?
P0=0xff,P1=P0;
...(省略)
P0=P1<<1,P1=P2;
可以如上写吗?

追答

//可以如上写。对不起,我那个示例程序没按你的意图来,下面为你要求实现的效果
//P0,P1各接8个led灯,你编译试试,应该满足你的要求,一个接一个亮,最后16个led全亮
#include "reg52.h"
unsined char i;
void delay()
{unsigned int n; for(;n<30000;n++) ;}
void main()
{
for(;i<8;i++)
{P0=P0<<1;delay();}
for(i=0;i<8;i++)
{P1=P1<<1;delay();}
while(1);
}

追问

可以说一下吗?百度hi或者腾讯都可以?

追答

可以,我这里没安装仿真软件,没法试验,不知道你编译试验了吗?

追问

还木有。。。因为电路还木有焊。。。能留个号吗?腾讯的或者别的都可以?

追答

不用焊接电路,有开发板的话在开发板上试试就可以了,没有开发板安装proteus仿真一下也可以。你给我发私信即可,或者hi也可以

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-10-25
假设P0,P2同时控制16个灯,每个IO控制一个灯,每次只有一个灯亮。
void disp(void)
{
int deng;
char i;
deng=1; //只有一个灯亮
for(i=0;i<16;i++)
{
P0=deng&0xff;
P2=*((char *)&deng); //P2=(deng>>8)&0xff;也可以,但时间略长
delay_ms(200); //延时函数你自行定义
deng<<=1;
}
}追问

可以解释一下P2=*((char *)&deng); //P2=(deng>>8)&0xff;的意思吗?
。。。初学者很迷茫