;本程序的功能,通过P1口控制8个流水灯,从左循环到右,再从右循环到左
;其中并不包括中断按键,这个代码给你参考参考
;
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
|