MCS-51单片机有丰富的位 *** 作指令,可以把大量的硬件组合逻辑用软件来代替,这样可以方便地应用于各种逻辑控制,主要用于控制线路通、断,继电器的吸合与释放等。位 *** 作指令如表所示。
(1)位修正指令
位修正指令包括: 位清零指令CLR、位置1指令SETBJ 位取反指令CPL。
(2) 位逻辑运算指令位逻辑运算指令与字节逻辑运算指令相似。其中“/b it”表示取反后在进行逻辑运算。
(3) 位数据传送指令位数据传送指令与字节数据传送指令相似。
(4)位条件转移类指令位条件转移类指令与字节条件转移类指令相似,地址偏移量re 1的计算方法相同。
(1) 短调用指令
短调用指令ACALL指令的目标地址是11位。在调用子程序时,该指令与AJMP指令类似,要求调用子程序的入口地址与ACALL指令后面指令的第一个字节在同一个2 K页面的程序存储器区域中。
(2)长调用指令长调用指令LCALL指令的目标地址是16位。可在64 K程序存储器区域范围内调用任何一个子程序。
(3) 子程序返回指令子程序返回指令RET,功能是使CPU从子程序返回到主程序的断点处,使主程序继续执行。
(4) 中断返回RETI中断返回指令RET I,功能是使CPU从中断服务子程序返回主程序的断点处,同时清除相应的中断状态寄存器,开发中断。
(5) 空 *** 作指令执行空 *** 作指令NOP,除PC内容加1外,不影响任何标志位和其他寄存器。NOP指令常用来产生一个机器周期的延迟。
调用及回过程:主程序调用了子程序,子程序执行完之后必须再回到主程序继续执行,不能“一去不回头”,那么回到什么地方呢?是回到调用子程序的下面一条指令继续执行
调用指令
LCALL addr16 ;长调用指令
ACALL addr11 ;短调用指令
上面两条指令都是在主程序中调用子程序,两者有一定的区别,但在开始学习单片机的这些指令时,能不加以区别,而且能用LCALL 标号,ACALL 标号,来理解,即调用子程序。
返回指令则说了,子程序执行完后必须回到主程序,如何返回呢?只要执行一条返回指令就能了,即执行 ret指令
单片机在调用子程序时,进行了怎样的堆栈 *** 作?栈: 在函数调用时,第一个进栈的是主函数中函数调用后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数,在大多数的C编译器中,参数是由右往左入栈的,然后是函数中的局部变量。注意静态变量是不入栈的。
当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令,程序由该点继续运行。
堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容有程序员安排。
单片机中如何调用写好的子程序?使用调用指令LCALL 可以去调用已经编写好了的子程序。
使用格式:LCALL 子程序名字(即子程序的首地址 用符号表示 叫符号地址)
例如:现有一个子程序
YS1MS: MOV R7,# 4
LL1: MOV R6,#200
LL2: DJNZ R6,LL2
DJNZ R7,LL1
RET
可以在主程序中 调用子程序
LCALL YS1MS
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)