? 發問時間: 電腦與網際網路程式設計 · 1 0 年前

8051單晶片程式問題

請問一下很懂得8051的高手

我的程式如下:

---------------------------------------------------------------------------

ORG 0000H

START:

MOV P0,#11111110B

ACALL DELAY

MOV P0,#11111100B

ACALL DELAY

MOV P0,#11111000B

ACALL DELAY

MOV P0,#11110000B

ACALL DELAY

MOV P0,#11100000B

ACALL DELAY

MOV P0,#11000000B

ACALL DELAY

MOV P0,#10000000B

ACALL DELAY

MOV P0,#00000000B

ACALL DELAY

MOV P1,#11111110B

ACALL DELAY

MOV P1,#11111100B

ACALL DELAY

MOV P1,#11111000B

ACALL DELAY

MOV P1,#11110000B

ACALL DELAY

MOV P1,#11100000B

ACALL DELAY

MOV P1,#11000000B

ACALL DELAY

MOV P1,#10000000B

ACALL DELAY

MOV P1,#00000000B

ACALL DELAY

MOV P2,#11111110B

ACALL DELAY

MOV P2,#11111100B

ACALL DELAY

MOV P2,#11111000B

ACALL DELAY

MOV P2,#11110000B

ACALL DELAY

MOV P2,#11100000B

ACALL DELAY

MOV P2,#11000000B

ACALL DELAY

MOV P2,#10000000B

ACALL DELAY

MOV P2,#00000000B

ACALL DELAY

MOV P3,#11111110B

ACALL DELAY

MOV P3,#11111100B

ACALL DELAY

MOV P3,#11111000B

ACALL DELAY

MOV P3,#11110000B

ACALL DELAY

MOV P3,#11100000B

ACALL DELAY

MOV P3,#11000000B

ACALL DELAY

MOV P3,#10000000B

ACALL DELAY

MOV P3,#00000000B

ACALL DELAY

DELAY:

MOV R6,#250

DL1 MOV R7,#200

DL2: DJNZ R7,DL2

DJNZ R6,DL1

RET

END

----------------------------------------------------------------------

我想請問一下高手

有沒有辦法將上面這麼一長串的程式碼

縮短呢????

或是有另外一種方法可以顯現出與上面相同的效果

然後程式碼比較短呢???

感謝您了~

已更新項目:

可是我需要的是亮過不滅的程式

左旋的程式中不是一次只會亮一個燈??

還是說有辦法改呢?

我的左旋程式:

ORG0000H

START:MOVR1,#07H

MOVA,#11111110B

LEFT:MOVP0,A

ACALLDELAY

RLA

DJNZR1,LEFT

DELAY:

MOV R6,#250

DL1 MOV R7,#200

DL2: DJNZ R7,DL2

DJNZ R6,DL1

RET

END

2 個已更新項目:

另外在請問一下

我接在LED的限流電阻

如果接220歐姆

會不會太小呢?

還是需要更大一點的???

3 個解答

評分
  • 1 0 年前
    最佳解答

    因為你的輸出資料都是重覆的

    我建議你用索引定址法來寫

    大概是以下的程式

    ORG 00H

    JMP START

    START: MOV DPTR,#TABLE ; 設定想要讀取資料區

    MOV R0,#00H ; 用於讀取TABLE的值

    MOV R1,#03H ; 用於判斷那一個輸出埠

    OUT: MOV A,R0

    MOVC A,@A+DPTR ; 讀取第R0筆的TABLE資料

    CALL CHECK ;判斷所要的輸出埠

    CALL DELAY

    INC R0

    CJNE R0,#8,OUT ; 若R0=8,表示已亮完了該輸出埠

    MOV R0,#00H ; 將R0歸零,使Px可以重新讀取TABLE的值

    INC R1

    CJNE R1,#4,OUT ;判斷是否已輸出完四個輸出埠

    JMP START

    CHECK: CJNE R1,#0,C1

    MOV P0,A

    RET

    C1: CJNE R1,#1,C2

    MOV P1,A

    RET

    C2: CJNE R1,#2,C3

    MOV P2,A

    RET

    C3: CJNE R1,#3,C4

    MOV P3,A

    C4: RET

    DELAY:

    MOV R6,#250

    DL1: MOV R7,#200

    DL2: DJNZ R7,DL2

    DJNZ R6,DL1

    RET

    TABLE: DB 11111110B,11111100B,11111000B,11110000B

    DB 11100000B,11000000B,10000000B,00000000B

    END

    這是用同一個主程式來讀取不同的值

    所以有寫了2個判斷用的程式

    這樣的方式在未來會很有幫助

    當程式會有可能寫到很長時

    用判斷的方式來共用主程式

    這會幫你縮短很多的程式輸寫

    希望這樣的程式你可以看的懂

    也希望可以幫到你

    2009-09-02 21:09:56 補充:

    限流電阻用220或330其實都可以

    阻值還不至於小到讓LED燒掉

    參考資料: myself
  • 1 0 年前

    ORG 0000H

    START:

    MOV R0,#80H ; P0 位址

    MOV R1,#4

    NEXT:

    MOV A,#FFH

    MOV R2,#8

    LEFT:

    CLR C

    RLC A

    MOV @R0,A

    ACALL DELAY

    DJNZ R2,LEFT

    2009-08-27 23:24:11 補充:

    MOV A,R0

    ADD A,#10H

    MOV R0,A ; 指向下一個 PORT

    DJNZ R1,NEXT

    AJMP START

    DELAY:

    MOV R6,#250

    DL1: MOV R7,#200

    DL2: DJNZ R7,DL2

    DJNZ R6,DL1

    RET

    END

    2009-08-27 23:29:06 補充:

    開始的地方要先將各個埠先初始化, 這樣循環會比較正常

    START:

    MOV P0,#FFH

    MOV P1,#FFH

    MOV P2,#FFH

    MOV P3,#FFH

    MOV R0,#80H ; P0 位址

    以上程式會一個一個亮起來, 在全亮之後全滅, 然後再重新一個一個亮起來, 一直重複.

  • ORG 0000H

    START:

    MOV P0,#11111110B

    ACALL DELAY

    MOV P0,#11111100B

    ACALL DELAY

    MOV P0,#11111000B

    ACALL DELAY

    MOV P0,#11110000B

    ACALL DELAY

    MOV P0,#11100000B

    ACALL DELAY

    MOV P0,#11000000B

    ACALL DELAY

    MOV P0,#10000000B

    ACALL DELAY

    MOV P0,#00000000B

    ACALL DELAY

    JMP START

    DELAY:

    MOV R6,#250

    DL1 MOV R7,#200

    DL2: DJNZ R7,DL2

    DJNZ R6,DL1

    RET

    END

    ------------------------------------------------------------------------

    你的目的是:左旋電路程式─ 左第1 個燈亮→左第2 個燈亮…(依此類推)

    先用這個試試看吧!!

    2009-08-22 17:39:14 補充:

    我講錯囉= ='""

    上面那個我少打了A!!你把我打的JMP START改為AJMP START

    你可以試試看!!真的!!我只是幫你加上AJMP START 跳躍 至 START !!

    參考資料: = =網路
還有問題?馬上發問,尋求解答。