51单片机的汇编语言程序设计
死循环
SJMP $
程序会不断重复执行这条指令直到被外部中断或复位。要跳出这个无限循环:
外部中断:如果微控制器配置了外部中断,并且满足中断条件,中断服务程序可以被调用,从而跳出循环。
SJMP $
这条指令中的 $
符号是一个汇编语言中的立即数,代表当前指令的地址。
所以,SJMP $
实际上是一个无限循环的指令,因为它告诉程序跳回到当前指令的位置并重新执行它。这通常用于等待某个事件的发生,或者在某些情况下,作为程序的暂停或死循环。
如果程序执行到 SJMP $
这条指令,它将不断重复执行这条指令,直到程序被外部事件打断或停止。
简单延时
所有的二极管闪动:
ORG 0000H
START: MOV P1,#00H
ACALL DELAY
MOV P1,#0FFH
ACALL DELAY
AJMP STAET
DELAY: MOV R3,#7FH
DEL2: MOV R4,#0FFH
DEL1: NOP
DJNZ R4,DEL1
DJNZ R3,DEL2
RET
END
DELAY: MOV R3,#(X)H ;内循环次数X
DEL2: MOV R4,#(Y)H ;外循环次数Y
DEL1: NOP ;1T
NOP ;1T
DJNZ R4,DEL1 ;2T
DJNZ R3,DEL2 ;2T (忽略)
RET
T 为一个机器周期,也即 12 个时钟周期
如果晶振频率为
近似的延时时间:
DELAY: MOV R2,#10H
DEL2: MOV R3,#200H
DEL2: MOV R4,#125H
DEL1: NOP ;1T
NOP ;1T
DJNZ R4,DEL1 ;2T
DJNZ R3,DEL2 ;2T (忽略)
DJNZ R2,DEL2 ;2T (忽略)
RET
子程序
堆栈保证:子程序调用、返回到主程序中的正确位置,并接着执行主程序中的后续指令
比较两个数的大小
SUBB A,@R1 ;带借位的减法,
JNC NEXT ; 无借位时 CY=0 跳转,也即A>=@R1 时跳转
MOV A,@R1 ; 顺序执行到此时,也即 将更大的值赋给A