unsigned char lights = 0; //lights到各位分别表示P10~P17
int i=0;
while (1)
{
//①L1、L2、…L8依次点亮
lights = 0x01;
for (i=0; i<7; i++)
{
delay(500);
lights = lights << 1;
}
delay(500);
//②L1、L2、…L8依次熄灭
lights = 0xfe;
for (i=0; i<7; i++)
{
delay(500);
lights = (lights << 1) + 0x01;
}
delay(500);
//③L1、L2、…L8全亮
lights = 0xff;
delay(500);
//全灭
lights = 0x00;
delay(500);
}
恩,不知道你要什么语言的!但是我觉得你提问本身矛盾哈!一只怎么左移?你是亮一只吧!
下面是我一个移位的流水灯程序,你先看看这个程序,延时这里你修改一下就是哈,用定时器来触发移位。提示你,你每秒移动移位,那你每个亮多久呢?要考虑好哦!后面我附加一个1s的定时器,你就自己稍微拼凑哈,挺简单的,希望你能解决!
#include
<reg52h>
#include
<intrinsh>
#define
uint
unsigned
int
#define
uchar
unsigned
char
void
delay(uint);
void
main()
{
uchar
aa;
aa=0xfe;
while(1)
{
P1=aa;
delay(800);
aa=_crol_(aa,1);
}
}
void
delay(uint
z)
{
uint
x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
定时器的
void
T0_time()
interrupt
1
//隔50ms跑过来到中断程序里来,
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
num++;
if(num==20)//50ms20为1s
{
num=0;
led1=~led1;//实现灯的闪动
led2=~led2;
}
}
稍微融合一下就OK
ORG 0000H
LJMP BEGIN
ORG 000BH
LJMP T0ISR
ORG 0030H
;---------------------------------------
BEGIN:
MOV SP,#5FH
MOV TMOD,#01H
MOV TH0,#3CH
MOV TL0,#0B0H
MOV A,#0
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P1,A
SETB TR0
SETB ET0
SETB EA
MOV R2,#0
MOV R4,#0
MOV R7,#0
SJMP $
T0ISR:
CLR TR0
MOV TH0,#3CH
MOV TL0,#0B0H
SETB TR0
INC R7
CJNE R7,#10,T01
T01:
JC T0E
MOV R7,#0
INC R2
INC R4
CJNE R2,#10,T02
T02:
JC LP
MOV R2,#0
LP:
MOV A,R2
MOV DPTR,#TABLE
MOVC A,@A+DPTR ;找到相应位显示代码
MOV P1,A
CJNE R4,#9,T03
T03:
JC LEDDIS
MOV R4,#1
LEDDIS:
MOV A,#0FFH
CLR C
PUSH 04H
LEDDIS1:
RLC A
DJNZ R4,LEDDIS1
MOV P0,A
POP 04H
T0E:
RETI
TABLE: ; 共阴极数码管显示代码表
DB 3FH,06H,5BH,4FH,66H ;01234
DB 6DH,7DH,07H,7FH,6fh ;56789
END
while{}是一个死循环,然后定时器要先设定定时时长。程序在死循环里跑然后每当定时时间到的时候就中断来处理定时器的程序,同时重新更改定时值。然后跳出中断再回到主程序while{}中中断的位置继续执行。如此往复!
以上就是关于如何用C语言写一个循环彩灯的程序,采用定时器方式1工作。全部的内容,包括:如何用C语言写一个循环彩灯的程序,采用定时器方式1工作。、控制一只二极管亮,用定时器每隔一秒循环左移位的程序<单片机>急、用汇编语言写一程序,利用定时计数器,定时一秒,一个数码管秒个位加1,同时有八个LED灯在循环流动。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)