作者Kniveschou (Knives)
看板ASM
標題Re: [問題] 新手學8051,請教各位
時間Sun Mar 23 03:45:55 2008
※ 引述《shen0410 (祐子)》之銘言:
: 最近在學8051
: 看到書上有一篇程式碼
org 00h ;設定起始程式碼
jmp start ;無條件跳躍到start,不寫這行也會往下執行到start
start:
mov a,
#00000001b ;丟八個燈,最右邊的暗(吧?)到A累加器,b代表二進位,
;一個二進位bit對應到一個P1.0,1.1這樣子過去
mov r0,#8 ;把R0丟數字八進去
loop:
mov p1,a ;把你丟到a的那串二進位放到P1,你接LED燈的Port 1
;你沒寫P1.0,P1.1 他就一次丟八個Bit
call delay ;呼叫delay,因為你沒有delay,執行的速度非常的快
;你看不出來是哪個有暗,因為他順移過去,
;人眼跟不到,所以才加Delay
rl a ;將你剛剛丟到A的左移一個,A會變成00000010B
;所以你的燈下次,跑到p1的時候,暗的那個燈會
;左邊移一格,(RL因該是不含進位旗標吧)
djnz r0,loop ;R0-1判斷是否為零,如果是0的話就往下執行
;不為0的時候跳到loop,因為你剛剛一開始設定
;R0=8,所以他會跑八次,剛好暗的燈移到最左邊
delay: ;Delay這段就是設定讓他跑迴圈,可是我實在懶的算
mov r7,#200 ;你就以後都這樣Call就好,別太計較了XDXD
d1: mov r6,#200
djnz r6,$ ;$這個用法好像怪怪的?
djnz r7,d1
ret ;你執行了這堆空回圈以後回去call delay
;的那行繼續往下執行
end ;end結束,打完收工
: 可是對照書上的指令又看不懂
: 希望高手可以慢慢解釋給我聽,謝謝
我沒翻書 人腦單步執行 如果有錯不要怪我XDXD
還有搞懂一下間接定址,直接定址mov @,#那些所代表的意思
這樣子寫程式比較有幫助,暫存器沒這麼多可以給你用XD
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.229.79.23
※ 編輯: Kniveschou 來自: 61.229.79.23 (03/23 03:46)
1F:→ Kniveschou:這篇文章 居然是183元 ......囧 03/23 03:48
2F:→ ck1362:$把它想像成 d2 djnz r6,d2 這樣就好了... 03/23 11:17
3F:推 dexders:jmp $+2 往下跳兩行 $-1網上跳一行 jmp $ 就是原地跳 03/23 13:55
4F:→ wuzen:樓上 $+2 不是往下跳兩行 是跳兩個byte 03/23 14:27
5F:推 rewolf:jmp $+2 剛好 2 byte 所以就是到下一個指令 , 當 delay 用 03/28 09:52
6F:推 saram:delay 時間太短了. 最好r6,r7都用255. 必要時call 兩次. 05/03 22:59
7F:→ saram:暫存器有32個, 還不夠? (4個rb分頁) 05/03 23:00