作者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