_____________________________________________________
功能:
广告流水灯程序
时间:
2010—9—13
注释:
指令MOV P2,#80H是一条废指令,不起作用,可删除
_____________________________________________________
ORG 00H
MOV P2,#80H
START:MOV A,#0FFH ;赋初值
CLR C
MOV R2,#8
LOOP:RRC A ; 带进位右移
MOV P1,A
CALL DELAY
DJNZ R2,LOOP
MOV R2,#7
LOOP1:RLC A ; 带进位左移
MOV P1,A
CALL DELAY
DJNZ R2,LOOP1
JMP START
DELAY:MOV R3,#20 ; 延时0.2秒
D1: MOV R4,#20
D2: MOV R5,#248
DJNZ R5,$
DJNZ R4,D2
DJNZ R3,D1
RET
END
ORG是Origin的缩写:起始地址源。在汇编语言源程序的开始通常都用一条ORG伪指令来实现规定程序的起始地址。如果不用ORG规定则汇编得到的目标程序将从0000H开始。例如:
CLR C是CF置零,相当于STAB CF的反操作,目的是将进位位置零. DJNZ指令有两种格式:DJNZ Rn,rel和DJNZ direct,rel,其实它的功能不止这些,本程序中使用到的只是一个标号,也就是工作寄存器组Rn非零则转移到标号标示的位置执行程序,为零则顺序进行下一条指令的执行。 RLC A ;累加器带进位位循环左移 JMP $ ;原地不动,即一直保持,无条件转移
ORG 2000H
START:MOV A,#00H
其实:ORG 00H这条指令的作用是定位初始地址,这里只是一个规定,没有其它含义。如上边的两条代码,规定了起始地址,那么得到的目标程序将不会从默认的00H开始,而是从定义的2000H处执行。至于第二条指令,MOV P2,#80H这条指令完全没有用,可以删去。
DJNZ Rn,rel 寄存器减1,非零转移
DJNZ direct,rel 直接地址单元减1,非零转移
RRC A ;累加器带进位位循环右移
上边的两条移位指令是带进位的移位指令,注意和汇编语言程序设计中的SHR、SHL、SAR、SAL进行比对,它相当于是SAR和SAL,也就是算术移位指令,因为标志寄存器CF始终参与移位。其实,汇编语言程序中存在一个循环移位指令,用到这里效率会更高。
END ;汇编程序结束, 这里不用也没有关系
另外对于DJNZ Rn,$来说,也不难理解。Rn内容递减,而$不变,即所谓原地跳转,但这是有条件转移指令,对于无条件转移指令JMP $来说,就是原地不动,一直保持。
