标题: 我这个单片机汇编程序为什么不能做到左右移 [打印本页]

作者: asd-123    时间: 2019-3-25 12:27
标题: 我这个单片机汇编程序为什么不能做到左右移
status equ 03h               ;定义状态寄存器的地址
portd equ 08h                ;定义端口D的寄存器的地址
trisd equ 88h                ;定义端口D的方向控制寄存器的地址
flag equ 20h                 ;定义一个左右移标志寄存器
m equ 21h                    ;定义一个计数器变量
w equ 0                      ;定义传送目标寄存器的W的指示位
f equ 1                      ;定义传送目标寄存器的RAM的指示位
rp0 equ 5                    ;定义一个状态寄存器的体选页位指示位
dly1 equ 21h                 ;定义一个延时变量
dly2 equ 22h                 ;定义另一个延时变量
;---------------------------------主程序------------------------------------
org 000h
nop
bsf status,rp0              ;将状态控制寄存器的页选位选择体1
movlw 00h                   ;将立即数00H送W
movwf trisd                 ;转送到端口D的方向控制寄存器,设定输出
bcf status,rp0              ;将状态控制寄存器的页选位选择体0
bcf status,0                ;
movlw 0ffh                  ;将立即数0FEH先送到W
movwf portd                 ;再转送到端口D,显示
k1                           ;
movlw 01h                   ;将立即数01H先送到W
xorwf flag,f                ;将左右移标志位取反
btfss flag,0                ;测试左右移标志位FLAG=1左移。否则右移
goto loop1                  ;否,右移
goto loop2                  ;是,左移
loop1                        ;右移子程序名
movlw 0ah                   ;将立即数0AH送W
movwf m                     ;将立即数0AH转送到M
s1                           ;
decfsz m,f                  ;M减一,结果送M。如果结果为0则跳一步,否则顺序执行。
goto n1                     ;转到右移
goto k1                     ;转到k1
loop2                        ;左移子程序名
movlw 08h                   ;将立即数08H先送到W
movwf m                     ;再转送到M
s2
decfsz m,f                  ;M减一,结果送M.如果结果为0则跳一步,否则顺序执行
goto l1                     ;转到右移
goto k1                     ;转到K1
n1
rrf portd,f                 ;端口D循环右移指令
call delay                  ;调延时子程序
goto s1                     ;返回到计数器S1循环
l1
rlf portd,f                 ;端口D循环左移指令
call delay                  ;调延时子程序
goto s2                     ;返回到计数器S2循环
;--------------------------------延时子程序------------------------------------
delay                        ;子程序名
movlw 01h                  ;将外层循环参数0FFH经过W
movwf dly1                  ;送入用作外部循环变量的DLY1
lp0                          ;
movlw 0ffh                  ;将内层循环参数0FFH经过W
movwf dly2                  ;送入用作内层循环变量的DLY2
lp1                          ;
decfsz dly2,f               ;内层变量DLY2内容递减,若为0跳一步
goto lp1                    ;跳到LP1处
decfsz dly1,f               ;外层变量DLY1内容递减,若为0跳一步
goto lp0                    ;跳转的LP0处
return                      ;返回主程序
end                         ;
作者: asd-123    时间: 2019-3-25 17:32
找到原因了,谢谢




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1