不好意思,延时用了楼上的。keil下编译OK。假设P1接灯。
ORG 00H
SJMP START
ORG 30H
START:
MOV A ,#00
SETB C
MOV R0,#9
;从左到右
LOOP1:
RLC A
MOV P1, A
ACALL DELAY
DJNZ R0, LOOP1
;从右到左
MOV R0,#9
LOOP2:
RRC A
MOV P1, A
ACALL DELAY
DJNZ R0, LOOP2
SJMP START
DELAY:
MOV R6,#20
DELAY_0:MOV R5,#255
DJNZ R5,$
DJNZ R6,DELAY_0
RET
END
这个程序比较简单了。再精简,只能精简一句,将MOV P1,A 放在DELAY函数里。这样减少一行。
简单介绍一下:
首先就是你要轮流点亮,就是将1循环一圈,因为你要全灭一次,所以用到CY。
RG 00H
SJMP START
ORG 30H
START:
MOV A ,#00 ;//清空A寄存器
SETB C ;//将CY置1,然后带进位左移就会进入将A的b0
MAINLOOP: ;//大循环起始
MOV R0,#9 ;设置移位次数,要灭一次,所以设置为9
;从左到右
LOOP1:
RLC A ;带进位左移一次;第一次移位结果为01
MOV P1, A ;将A中值放入P1点亮对应LED;该句可放在DELAY里,然后从右到左也去掉该句
ACALL DELAY ;延时,保持灯亮一段时间,自己根据实际情况调整一下。
DJNZ R0, LOOP1 ;循环,点亮下一个灯,最后一次,A为0,将全灭一次,CY为1
;从右到左
MOV R0,#9 ;设置循环次数
LOOP2: ;循环起始表示
RRC A ;带进位右移,第一次结果为80H
MOV P1, A ;更新P1点亮对应LED
ACALL DELAY ;延时,保持灯亮一段时间
DJNZ R0, LOOP2 ;循环,点亮下一个灯
SJMP MAINLOOP ;循环,重新开始下一轮
如果你是管脚输出低LED才亮,只需将MOV A ,#00 和SETB C改为MOV A, #0FFH和CLR C即可。
方案2:位寻址区00做标志,为0从左到右,该标志为1从右到左
ORG 00H
SJMP START
ORG 30H
START:
MOV A ,#00
SETB C
MOV R0,#9
CLR 00H
LOOP1:
RLLED:
JB 00H, RRLED
RLC A
AJMP DISP
RRLED:
RRC A
DISP:
MOV P1, A
ACALL DELAY
DJNZ R0, LOOP1
CPL 00H
AJMP START
DELAY:
MOV R6,#20
DELAY_0:MOV R5,#255
DJNZ R5,$
DJNZ R6,DELAY_0
RET
END
下面是方案1的流程图,这种流程图不知怎么写好,而且写出来基本是对每行的代码的解释。
org 00h
sjmp main
org 30h
main:
mov r7,#8
mov r0,#00h
loop:
mov dptr,#100h
mov a,r0
movc a,@a+dptr
mov p1,a
acall delay
inc r0
djnz r7,loop
mov r0,#00h
mov r7,#8
loop_0:mov dptr,#200h
mov a,r0
movc a,@a+dptr
mov p1,a
acall delay
inc r0
djnz r7,loop_0
sjmp main
delay:mov r6,#20
delay_0:mov r5,#255
djnz r5,$
djnz r6,delay_0
ret
org 100h
db 根据灯的实际连接状态写
org 200h
db 根据灯的实际连接状态写
end
循环以后
连续赋值就可以了!!
不会汇编