大家請看下面的一段程序 (李學海的PIC基礎編第二版188頁)
要實現的功能是RD端口的燈從0到7依次點亮,然后滅;再從7到0依次點亮,再到滅;循環.
我的問題:為何不能進入delay,在MPlab里面等等好久也不進去,燒到實驗板的硬件板后,只看到RD0和RD7兩個燈亮,不能達到預期的效果.
大家幫忙看一下錯在哪里
;***************************
;<<8珠式霹靂燈控制器>>2009/4/16
;文件名為piliding.asm
;***************************
INCLUDE "C:\Program Files\Microchip\MPASM Suite\P16F877A.INC"
__Config H'3B31'
status equ 3h ;定義狀態寄存器地址
portd equ 8h
trisd equ 88h
flag equ 25h
org 000h
nop
bsf status,5
movlw 00h
movwf trisd
bcf status,5
movlw 01h
movwf portd
bsf flag,0
loop btfss status,0
goto loop1
comf flag,1
loop1 btfss flag,0
goto loop2
rlf portd,0
movwf portd
goto loop3
loop2 rrf portd,0
movwf portd
loop3 call delay
goto loop
;DELAY子程序
delay movlw 0ffh
movwf 20h
lp0 movlw 0ffh
movwf 21h
lp1 decfsz 21h,1
goto lp1
decfsz 20h,1
goto lp0
return
;***********************************
end
pic16f877a 匯編跑馬燈程序請教 李學海書第二版187頁
全部回復(2)
正序查看
倒序查看
剛才的程序沒有加注釋,現加上,這樣大家可以看明白了吧
;***************************
;<<8珠式霹靂燈控制器>>2009/4/16
;文件名為piliding.asm
;***************************
INCLUDE "C:\Program Files\Microchip\MPASM Suite\P16F877A.INC"
__Config H'3B31'
status equ 3h ;定義狀態寄存器地址
portd equ 8h ;定義端口D的數據寄存器地址
trisd equ 88h ;定義D的方向寄存器地址
flag equ 25h ;定義一個左/右移的標志寄存器
org 000h
nop
bsf status,5 ;體1
movlw 00h
movwf trisd
bcf status,5
movlw 01h
movwf portd
bsf flag,0 ;左右移標志位置,首先進行左移LED
loop btfss status,0 ;測試進借位位,是1則修改標志
goto loop1 ;是0則不修改標志
comf flag,1 ;FLAG的BIT0作為村志位,取反
loop1 btfss flag,0 ;判斷標志位,是1則跳到循環左移
goto loop2 ;是0則跳到循環右移
rlf portd,0
movwf portd
goto loop3
loop2 rrf portd,0
movwf portd
loop3 call delay
goto loop
;DELAY子程序
delay movlw 0ffh
movwf 20h
lp0 movlw 0ffh
movwf 21h
lp1 decfsz 21h,1
goto lp1
decfsz 20h,1
goto lp0
return
;***********************************
end
;***************************
;<<8珠式霹靂燈控制器>>2009/4/16
;文件名為piliding.asm
;***************************
INCLUDE "C:\Program Files\Microchip\MPASM Suite\P16F877A.INC"
__Config H'3B31'
status equ 3h ;定義狀態寄存器地址
portd equ 8h ;定義端口D的數據寄存器地址
trisd equ 88h ;定義D的方向寄存器地址
flag equ 25h ;定義一個左/右移的標志寄存器
org 000h
nop
bsf status,5 ;體1
movlw 00h
movwf trisd
bcf status,5
movlw 01h
movwf portd
bsf flag,0 ;左右移標志位置,首先進行左移LED
loop btfss status,0 ;測試進借位位,是1則修改標志
goto loop1 ;是0則不修改標志
comf flag,1 ;FLAG的BIT0作為村志位,取反
loop1 btfss flag,0 ;判斷標志位,是1則跳到循環左移
goto loop2 ;是0則跳到循環右移
rlf portd,0
movwf portd
goto loop3
loop2 rrf portd,0
movwf portd
loop3 call delay
goto loop
;DELAY子程序
delay movlw 0ffh
movwf 20h
lp0 movlw 0ffh
movwf 21h
lp1 decfsz 21h,1
goto lp1
decfsz 20h,1
goto lp0
return
;***********************************
end
0
回復
@hunter-007
剛才的程序沒有加注釋,現加上,這樣大家可以看明白了吧;***************************;2009/4/16;文件名為piliding.asm;***************************INCLUDE"C:\ProgramFiles\Microchip\MPASMSuite\P16F877A.INC"__ConfigH'3B31'statusequ3h;定義狀態寄存器地址portdequ8h;定義端口D的數據寄存器地址trisdequ88h;定義D的方向寄存器地址flagequ25h;定義一個左/右移的標志寄存器org000hnopbsfstatus,5;體1movlw00hmovwftrisdbcfstatus,5movlw01hmovwfportdbsfflag,0;左右移標志位置,首先進行左移LEDloopbtfssstatus,0;測試進借位位,是1則修改標志gotoloop1;是0則不修改標志comfflag,1;FLAG的BIT0作為村志位,取反loop1btfssflag,0;判斷標志位,是1則跳到循環左移gotoloop2;是0則跳到循環右移rlfportd,0movwfportdgotoloop3loop2rrfportd,0movwfportdloop3calldelaygotoloop;DELAY子程序delaymovlw0ffhmovwf20hlp0movlw0ffhmovwf21hlp1decfsz21h,1gotolp1 decfsz20h,1gotolp0return;***********************************end
comf flag,1
改為comf flag,0
改為comf flag,0
0
回復