标题:
我这个单片机汇编程序为什么不能做到左右移
[打印本页]
作者:
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