我这个程序为何实现不了,51单片机流水灯,从左移到右,又从右移到左。单个亮,求大神

如题所述

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

    
温馨提示:答案为网友推荐,仅供参考