• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

pic16f877a 汇编跑马灯程序请教 李学海书第二版187页

大家请看下面的一段程序 (李学海的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
全部回复(2)
正序查看
倒序查看
2009-04-17 16:57
刚才的程序没有加注释,现加上,这样大家可以看明白了吧
;***************************
;<<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
回复
ycwgr
LV.1
3
2009-04-20 13:08
@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
0
回复