51单片机通用寄存器Rn不够用怎么办?(我是新手)
不是听说通用寄存器Rn有四组嘛,是不是切换一组后就又可以从R0用到R7了,然后用R0、R1、R7来编延时子程序,等结束后再换回到原来的那组去?如果这样可以,汇编程序怎么编,请指教。
还有直接用push 01h 可以把R1压入堆栈吗?
51的工作寄存器一共有32个,为内存中的00H--1FH单元,分为4组,分别是
0组00H--07H单元、1组08H--0FH单元、2组10H--17H单元、3组18H--1FH单元,
每组的8个单元分别对应R0--R7。
这四组中只有一组是当前工作寄存器,程序中使用的就是当前工作寄存器中的8个单元。当前工作寄存器是可以由我们编程序指定的,并且在程序中可以随时变换。
在PSW中,的PSW4、PSW3两位组合的00、01、10、11四个状态,分别指定工作寄存器的0组、1组、2组、3组,
只需要用指令改变PSW的这两位状态,就可以改变当前工作寄存器组。
这样,实际上就是有32个工作寄存器可以选用。
就是这样的了:
RS1 RS0 字节地址
0 0 0组寄存器 00H~07H
0 1 1组寄存器 08H~0FH
1 0 2组寄存器 10H~17H
1 1 3组寄存器 18H~1FH
RS1=PSW.4 RS0=PSW.3
通过更改RS0 RS1 位状态可随意切换4组寄存器
谢谢,有空我去试试。
那push 01h可以把0组的R1压入堆栈,是不?
在调用子程序时Rn好像会自动入栈,返回子程序时会自动出栈,起到现场保护作用。我最近也在学,具体怎么回事也不太清楚。
下面代码是正确的,可以参考一下。
ORG 0000H
START:
MOV R7,#08H
MOV A,#0FFH
CLR C
LED:
RLC A
MOV P1,A
CALL DELAY
DJNZ R7,LED
AJMP START
;;延时1s(1+20+100X20)+[(250X100X20)+(100X20)+20]X2=1006462 us=1s
DELAY: ;机械周期
MOV R5,#20 ;1 1
DLY3: MOV R6,#100 ;20 1
DLY2: MOV R7,#250 ;100X20 1
DLY1: DJNZ R7,DLY1 ;250X100X20 2
DJNZ R6,DLY2 ;100X20 2
DJNZ R5,DLY3 ;20 2
RET
END
