单灯亮灭流水灯,所有的灯逐个亮和灭 两灯亮灭流水灯 单灯逐一亮后再灭 用C语言或者汇编语言或者单片机语言

如题所述

#include <reg51.H>
//假设P2口顺序接LED,并且高电平点亮;
typedef unsigned char uchar;
typedef unsigned int uint;
void delay1ms(uint);

main()
{

while(1)
{
static uchar order=1;
uchar n;
P2=0x00; //每种方式的开始,灯光全灭
if(order==1) //方式一:全灯逐个点亮,然后逐个灭掉
{
for(n=0;n<8;n++)
{
P2|=0x01<<n; //逐个点亮,直至全亮
delay1ms(500); //半秒间隔
}
for(n=0;n<8;n++)
{
P2<<=1; //逐个灭,直至全灭
delay1ms(500);
}
}
else if(order==2) //方式二:全灯两两先亮后灭;
{
for(n=0;n<8;n+=2)
{
P2=0x03<<n;
delay1ms(500);
P2=0x00;
delay1ms(500);
}
}
else //方式三:全灯逐个先亮后灭;
{
for(n=0;n<8;n++)
{
P2=0x01<<n;
delay1ms(500);
P2=0x00;
delay1ms(500);
}
}
if(++order>3)order=1; //order控制闪烁方式循环
}
}

void delay1ms(uint t)
{
uint i;
uchar j;
for(i=0;i<t;i++)
for(j=0;j<121;j++);
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-06-08
#include "reg52.h"
#include "intrins.h"

void main()
{
int x=0x01;
int a;
while(1)
{
a=10000;
P1=~x;
while(a--);
x=_irol_(x,1);
}
}

在intrins.h头文件中有逻辑移位函数,假设你的灯是低电平点亮,就需要让x取反,不然就不取反,irol函数是用来进行逻辑移位的。
程序中没有使用单独写延时函数,因为完全不需要,while(a--)就够了,如果流水灯速度很快,你就加大a值,反之减小本回答被网友采纳
第2个回答  2012-05-31
其实你下个C语言的protues100例,里面很多学习单片机的基本程序,貌似也有你要的这程序。要的留个邮箱!追问

你能帮我把这三个问题合成一个程序吗

追答

#include

#define uchar unsigned char
#define uint unsigned int

uchar led[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,
0xfc,0xf3,0xcf,0x3f,
0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00};

void delay1ms(uint t)
{
uint i;
uchar j;
for(i=0;i<t;i++)
for(j=0;j<121;j++);
}

void main()
{
uchar i;
for(i=0;i<20;i++)
{
delay1ms(800);
P2=led[i];
}
}

追问

这是那三个的的合成吗