LOOP:MOV P1,A
RL A
ACALL DELAY
DJNZ RO,LOOP;【每次执行这个djnz指令,R0都会减一,当r0==0时才会执行 RR A指令,】
RR A
ACALL DELAY
SJMP LOOP;【这边跳转到loop时,R0的值是为0的】
可以这样修改:
MAIN:
MOV A,#11111110B
LOOP:
MOV R0,#7
LEFTMOVE:
MOV P1,A
RL A
ACALL DELAY
DJNZ R0,LEFTMOVE;【R0等于0后,开始进行右移】
MOV R0,#7
RIGHTMOVE:
MOV P1,A
RR A
ACALL DELAY
DJNZ R0,RIGHTMOVE;【R0等于0后,开始进行左移】
AJMP LOOP
追问老师不让用软件延时,可以用中断吗?
我用定时器做了,就是把RR RL放到中断里,
可是它执行了前面的rl就不知行后面的rr了
还是我重新出题?
我先采纳了您的?
追答 ORG 0000H
LJMP MAIN
ORG 000BH
LJMP Timer0Interrupt
MAIN:
MOV R7,#0
LCALL InitTimer0
MOV A,#11111110B
LOOP:
MOV R0,#7
LEFTMOVE:
MOV P1,A
CJNE R7,#10,LEFTMOVE;【延时500ms】
MOV R7,#0
RL A
DJNZ R0,LEFTMOVE;【R0等于0后,开始进行右移】
MOV R0,#7
RIGHTMOVE:
MOV P1,A
CJNE R7,#10,RIGHTMOVE;【延时500ms】
MOV R7,#0
RR A
DJNZ R0,RIGHTMOVE;【R0等于0后,开始进行左移】
LJMP LOOP
InitTimer0:;【12MHz 定时50ms】
MOV TMOD,#01H
MOV TH0,#3CH
MOV TL0,#0B0H
SETB EA
SETB ET0
SETB TR0
RET
Timer0Interrupt:
PUSH DPH
PUSH DPL
PUSH ACC
MOV TH0,#3CH;【12MHz 定时50ms】
MOV TL0,#0B0H
INC R7 ;【中断计数】
POP ACC
POP DPL
POP DPH
RETI
END