;流水灯程序
PORT EQU P1
ORG 0000H ;主程序开始地址0000H
AJMP START ;跳转到地址MAIN处执行
ORG 0030H ;主程序地址0030H
START: CALL LEFT ;设定左移次数,存放于寄存器R5
CALL RIGHT ;将数据FFH赋值给A
JMP START ;跳转到START
;以下是左移子程序
LEFT: PUSH PSW ;将PSW压入堆栈
SETB RS1 ;将RS1置1,同下一条指令一起
;选定寄存器组2
CLR RS0 ;将RS0置0
MOV R4,#8 ;将数据8赋值给R4
MOV A,#0FFH ;将数据FFH赋值给A
CLR C ;将进位位C清0
NEXT1: RLC A ;带进位左移
MOV PORT,A ;将A中数据赋给P2
CALL LATER ;调用延时程序
DJNZ R4,NEXT1 ;R4=R4-1,R4≠0时,转到NEXT1
POP PSW ;出栈到PSW
RET ;子程序结束,返回主程序
;以下是右移子程序
RIGHT: PUSH PSW ;PSW压入堆栈
SETB RS1 ;将RS1置1,同下一条指令一起选定
;寄存器组2
SETB RS0 ;将RS0置1
MOV R4,#8 ;将数据8赋值给R4
MOV A,#0FFH ;将数据FFH赋值给A
CLR C ;将进位为清0
NEXT2: RRC A ;带进位位右移A
MOV P1,A ;将A中数据赋给P2
CALL LATER ;调用延时程序
DJNZ R4,NEXT2 ;R4=R4-1,R4≠0时,转到NEXT2
POP PSW ;出栈到PSW
RET ;子程序结束,返回主程序
;以下是延时子程序
LATER: MOV R7,#0FFH ;
AD1: MOV R6,#0A0H ;
AD2: DJNZ R6,AD2 ;
DJNZ R7,AD1 ;
RET ;
END
|