8051程式 單燈走馬燈

不好意思我是第一次接觸8051程式

所以有些真的不太懂

他的程式是這樣的

ORG 00H

START: MOV R1,#8

MOV A ,FEH

LOOP: MOV P1,A →可以大概"敘述"一下這一段LOOP嗎

CALL DELAY

RL A

DJNZ R1,LOOP

JMP START

DELAY: MOV R7,#05 →我想問為什麼一定要R5.R6.R7 #05 #249 #200到底是什麼

DEYA1: MOV R6,#249 意思。

DELA2: MOV R5,#200

DJNZ R5,$ →還有下面這些DJNZ到底是什麼意思...

DJNZ R6,DELA2

DJNZ R7,DELA1

RET

END

請各位幫解惑

已更新項目:

名詞解釋我知道....我是要了解他的涵義

5 個解答

評分
  • 1 0 年前
    最佳解答

    針對你的程式,以下解釋希望對你有幫助

    ORG 00H表示電源開啟後晶片程式從00H位址開始;START: MOV R1,#8是程式開始標記,其中MOV R1,#8是因為我們要讓8顆LED做左旋動作,因此共需要做左移8次,因此才會有#8值;接著MOV A ,FEH從程式來看LED是以Low電位驅動,所以累加器A給11111110數值,也就是LED一開始會從第0bit先亮。LOOP: MOV P1,A這一段程式標記配合上一行程式,將累加器的值搬移到port1上輸出顯示,隨後下一行CALL DELAY,從程式片段來看若沒下call delay程式也能正常執行,但單晶片執行速度是百萬移分之1,所以我們眼睛沒有辦法看到led的變化結果,因此才會下一段延遲程式,因此port1腳位的bit0 LED先亮,隨後RL A代表累加器A做左移一位元,也就是從原本11111110左移一個位元:11111101。隨後下DJNZ R1,LOOP,是指說R1暫存器每次減1,不為0跳到LOOP標記在執行,由於你一開始設#8,所以減1後R1為7,因此不為0,它會跳回到LOOP標記那行程式再執行。 依照此述它共左旋8次,並依序送出11111110、11111101、11111011、11110111....10111111、01111111至port1,所以你才會看到LED做左旋動作。最後JMP START是因為它已經執行完8次左移動作,我們要讓它重新開始,我們就必須再給它一個值。

    最後延遲程式我稍做說明:

    R7/R6/R5是一個暫存器,我們會利用#05,#249,#200的數值送至這些暫存器內,最主要是因為我們在延遲程式中下一段DJNZ的判斷指令,因此你的數值設越大延遲的時間就越久,但每個暫存器的值不可超過255,因為它是8bit暫存器;就你所提到DJNZ R5,$這一行程式其實也是R5每次減1,不為0跳躍的指令,只是你不懂的是它為什麼是$字號,這裡你只要記得R5只要沒減至為0它就永遠在此行程式執行,直到R5從200減至0為止。最後延遲副程式有一個RET指令,你必須記得下RET返回指令,要不然它不會從DELAY副程式返回到主程式執行,千萬切記。

    參考資料: ME
  • 匿名使用者
    6 年前

    【亞洲36588合法彩券公司直營 官網: A36588.NET 】

    【 最新活動→迎接新會員,首存狂送20% 】

    【運動→電子→對戰→現場→彩球 】

    【免費服務 →電影區、討論區、KTV歡唱、運動轉播、即時比分、24H客服 】

    【亞洲36588合法彩券公司直營 官網: A36588.NET 】

  • 匿名使用者
    7 年前

    台灣首家合法博弈網站正式成立

    體育博彩、真人對戰、現場遊戲、彩球

    投注高賠率,歡迎您來體驗!

    官方網站 aa777.net

  • matttt
    Lv 6
    1 0 年前

    DJNZ R5,$ →DJNZ 是將R5暫存器的資料減1,判斷是否為零,是零的話就向下執行,要不然就到標籤位子

  • 您覺得這個回答如何?您可以登入為回答投票。
  • 1 0 年前

    我也才剛摸

    所以解釋不好的地方請多多見諒

    ORG 00H

    START: MOV R1,#8

    MOV A ,FEH

    LOOP: MOV P1,A →把A的資料搬進去P1裡面

    CALL DELAY

    RL A

    DJNZ R1,LOOP

    JMP START

    DELAY: MOV R7,#05 → R5、R6、R7好像是暫存器

    DEYA1: MOV R6,#249 意思。 MOV R6,#249 是把249這數目搬進去R6暫存器

    DELA2: MOV R5,#200

    DJNZ R5,$ →DJNZ 是將R5暫存器的資料減1,判斷是否為零

    DJNZ R6,DELA2

    DJNZ R7,DELA1

    RET

    END

    參考資料: 自己摸索
還有問題?馬上發問,尋求解答。