誰可以幫我注釋下面這個8051的指令
如果裡面的指令有錯或是你有更好的寫法....
也請您一起告訴我
謝謝!!!
top_numequ 30h
display_num equ 31h
org 00h
jmp reset
org 03h
jmp int_reset
org 13h
jmp int_start
reset
movsp,#6fh
movtop_num,#00h
movdisplay_num,#00h
mov r5,#5
setb ea
setb ex0
setb ex1
setb p0.0
clr 20h.0
clr 20h.1
clr 20h.3
ready
call top_control
call display
jb 20h.1,start
jmp ready
start
mova,top_num
mov display_num,a
loop
call display
call counter
call delay
jb 20h.0,reset
jb 20h.3,over
mov a,p2
jmp loop
over
clr p0.0
movr2,#20
led_loop
movr1,#200
djnz r1,$
djnz r2,led_loop
setb p0.0
call delay
djnz r5,over
stop
call display
jmp stop
display
mov a,display_num
mov p1,a
ret
counter
mov a,display_num
cjnea,#00,dec_num
setb 20h.3
jmp count_over
dec_num
dec a
push a
anl a,#0fh
subb a,#9
pop a
jc dec_over
subb a,#6
dec_over
mov display_num,a
count_over
ret
top_control
cpl a
mov top_num,a
ter
int_reset
setb 20h.0
reti
int_start
setb 20h.1
reti
delay
mov r0,#120
mov tmod,#00000000b
wait
mov th0,#>(2**13-5000)
mov tl0,#<92**13-5000)
setb tr0
jnb tf0,$
clr tf0
djnz r0,wait
ret
end
2006-03-21 08:49:08 · 2 個解答 · 發問者 聶瘋 1 in 電腦與網際網路 ➔ 程式設計
top_num equ 30h ; top_num = 30hdisplay_num equ 31h; display_num = 31h org 00h ; 程式從0開始 jmp reset ;無條件的跳到 reset org 03h ;ie0(p3.2)的中斷向量 jmp int_reset;發生中斷時跳到int_reset org 13h ;ie1(p3.3)的中斷向量 jmp int_start;發生中斷時跳到int_startreset: mov sp,#6fh ; 堆疊指標=6fh mov top_num,#00h ; top_num= 0 ,也就是30h=0 mov display_num,#00h ;display_num=0 mov r5,#5 ; r5 <= 5 setb ea ; 云許中段 setb ex0;啟動外部中斷0 setb ex1;啟動外部中斷1,可改成 mov ie,#100000011 setb p0.0;p0.0 = 1 clr 20h.0;把20.0h,20.1h,20.3h設為0 clr 20h.1 clr 20h.3ready: call top_control;呼叫top_control副程式 call display;呼叫display副程式 jb 20h.1,start;如所標示之位元為1,跳到start jmp ready;無條件的跳到readystart: mov a,top_num ; a<=top_num mov display_num,a ; display_num <= aloop: call display call counter call delay ;呼叫副程式 jb 20h.0,reset;如所標示之位元為1,跳到reset jb 20h.3,over;如所標示之位元為1,跳到over mov a,p2 ; a <= p2 jmp loop ;無條件的跳到loopover: clr p0.0 ;p0.0 = 0
2006-03-26 17:30:11 補充:
mov r2,#20 ;r2 = 20
led_loop: mov r1,#200 ;r1 = 200
djnz r1,$;r1=r1-1,直到0才往下
djnz r2,led_loop ;r2=r2-1,直到0才往led_loop
setb p0.0 ; p0.0 = 1
call delay ;呼叫delay副程式
djnz r5,over;r5=r5-1,直到0才往over
stop: call display;呼叫display副程式
2006-03-26 17:31:10 補充:
jmp stop;無條件的跳到stop
display: mov a,display_num ; a <= display_num
mov p1,a ; p1 <= a
ret;回呼叫它的程式
counter: mov a,display_num ; a <= display_num
cjne a,#00,dec_num;比較且若不等於0跳到dec_num
setb 20h.3 ;20.3h = 1
2006-03-26 17:31:36 補充:
jmp count_over;無條件的跳到count_over
dec_num: dec a ; a = a-a
push a ; 把a的值放到sp+1去
anl a,#0fh ;a = a and 00001111
subb a,#9 ;a = a - 9
pop a ; 把a拿回來
jc dec_over;假使進位設定則跳到dec_over
subb a,#6 ;a =a-6
2006-03-26 17:32:01 補充:
dec_over: mov display_num,a;display_num <= a
count_over: ret回呼叫它的程式
top_control:cpl a ;累積器中的每一個位元均作邏輯運算(1的補數),原先為1的位元變成0
mov top_num,a ; top_num <= a
ter: ;?????
int_reset:;中斷0有動作
setb 20h.0; 20.0h = 1
reti;回主程式
2006-03-26 17:32:24 補充:
int_start:中斷1有動作
setb 20h.1;20.1h = 1
reti;回主程式
delay: mov r0,#120 ;r0 <=120
mov tmod,#00000000b;tmod <= 0
wait:
mov th0,#>(2**13-5000);th0= 2*13-5000的高位
mov tl0,#<(92**13-5000);tl0=92*13-50002的低位
setb tr0; 啟動tr0
jnb tf0,$ ;計時器0假使位元未被設定則等待
2006-03-26 17:33:02 補充:
clr tf0 ; tf0 = 0
djnz r0,wait ;r0 = r0 -1 ,不等於0跳到wait
ret; 回call 它的程式
end ;沒了
2006-03-26 12:27:58 · answer #1 · answered by BUMEGG 7 · 0⤊ 0⤋
top_num equ 30h
display_num equ 31h
org 00h;程式由00h開始
jmp reset
org 03h;外部INT0(P32)中斷
jmp int_reset
int_reset
setb 20h.0
reti
org 13h;外部INT1(P33)中斷
jmp int_start
int_start
setb 20h.1
reti
reset
mov sp,#6fh;堆疊記憶體從6F開始
mov top_num,#00h
mov display_num,#00h
mov r5,#5
setb ea
setb ex0;允許外部中斷0
setb ex1;允許外部中斷1
setb p0.0
clr 20h.0
clr 20h.1
clr 20h.3
ready
call top_control;將A反向值放入top_num
call display;display_num值由P1輸出
jb 20h.1,start;20h.1若為1就到start否到ready
jmp ready
start
mov a,top_num
mov display_num,a
loop
call display;display_num值由P1輸出
call counter;看要顯示幾次由display_num決定
call delay;延遲120*5000us
jb 20h.0,reset
jb 20h.3,over
mov a,p2
jmp loop
over
clr p0.0;讓PO.0為0
mov r2,#20
led_loop
mov r1,#200
djnz r1,$
djnz r2,led_loop;延遲200*20us
setb p0.0;讓PO.0為1
call delay
djnz r5,over
stop;程式最後迴圈處
call display
jmp stop
display
mov a,display_num
mov p1,a
ret
counter
mov a,display_num
cjne a,#00,dec_num
setb 20h.3
jmp count_over
dec_num
dec a
push a
anl a,#0fh
subb a,#9
pop a
jc dec_over;小於9代表要進位
subb a,#6;大於9再減6........這段應該是加6所以建議是add a,#6
dec_over
mov display_num,a ;這段副程式應該是個位數的16==>10
count_over
ret
top_control
cpl a
mov top_num,a
ret
delay;延遲120*5000us
mov r0,#120
mov tmod,#00000000b
wait
mov th0,#>(8192-5000)
mov tl0,#<(8192-5000)
setb tr0
jnb tf0,$
clr tf0
djnz r0,wait
ret
end
希望有幫助
簡單指令就不另作註解了
2006-03-26 13:31:17 · answer #2 · answered by ...... 1 · 0⤊ 0⤋