51单片机汇编程序详解:POP是干什么的

51单片机汇编程序详解:POP是干什么的,第1张

POP是d栈指令,我们写程序过程中,有时候会用到,寄存器冲突现象,比如,我们刚在A中存储了一个数据,但是我们又要做加法,我们不希望A中的书据丢失,怎么办,与时,就可以用到push指令,在Sp指向的空间开辟栈空间,把A中的内容压进去,等我们需要压入的数据的时候,就用Pop指令d出,这样,就实现了,即做完了工作,又保护了现场。

欢迎多多交流,纯手打。。。。

四个按键,定义如下:

KEY1 BIT P30

KEY2 BIT P31

KEY3 BIT P32

KEY4 BIT P33

按键处理程序:

;-----------------------------------

READ_KEY:

JB KEY1, K2

CALL DELAY

JB KEY1, K2

JNB KEY1, $

PUSH ACC

INC 75H

MOV A, 75H

CJNE A, #10, ZINT01

MOV 75H, #0

ZINT01:

POP ACC

JMP K_EXIT

;---------------

K2: JB KEY2, K3

CALL DELAY

JB KEY2, K3

JNB KEY2, $

PUSH ACC

INC 76H

MOV A, 76H

CJNE A, #10, ZINT01

MOV 76H, #0

ZINT01:

POP ACC

JMP K_EXIT

;---------------

K3: JB KEY3, K4

CALL DELAY

JB KEY3, K4

JNB KEY3, $

PUSH ACC

DEC 75H

MOV A, 75H

CJNE A, #255, ZINT03

MOV 75H, #9

ZINT03:

POP ACC

JMP K_EXIT

;---------------

K4: JB KEY4, K_EXIT

CALL DELAY

JB KEY4, K_EXIT

JNB KEY4, $

PUSH ACC

DEC 76H

MOV A, 76H

CJNE A, #255, ZINT04

MOV 76H, #9

ZINT04:

POP ACC

K_EXIT:

RET

;---------------

DELAY:

DJNZ R7, $

DJNZ R7, $

RET

;-----------------------------------

ProteUS 调试通过!

顺便提一下,我见心去的老婆,也就是你妈妈了。她也提问了,嘿嘿!

BUF1 EQU 2000H

BUF2 EQU 3000H

ORG 00H

AJMP _INIT_SYS

_INIT_SYS:

MOV SP,#80H

MOV DPTR,#2000H

MOV R0,#010H

_INIT_NUM:

MOV A,R0

MOVX @DPTR,A

INC DPTR

DJNZ R0, _INIT_NUM

MOV R0,#20H

MOV R1,#30

MOV R2,#112

_INIT_SUM:

MOV A,R2

MOV @R0,A

INC R0

INC R2

DJNZ R1, _INIT_SUM

_MAIN:

LCALL _CAL

LCALL _SUM

AJMP $

_CAL: ;{

; 1以BUF1为起始地址的外存储区中,存放有16个单字节无符号二进制数,试编

; 一程序,求其平均值并送BUF2单元

PUSH 0

PUSH 1

PUSH 2

MOV R0,#010H

MOV DPTR,#BUF1

CLR A

CLR C

MOV R1,#0

MOV R2,#0

_CAL_ADD:

MOVX A,@DPTR

ADDC A,R1

MOV R1,A

JNC _CAL_ADD_END

INC R2

_CAL_ADD_END:

INC DPTR

DJNZ R0, _CAL_ADD

MOV R0,#4 ; /16

CLR C

_DIV_LOOP:

MOV A,R2

RRC A

MOV R2,A

MOV A,R1

RRC A

MOV R1,A

DJNZ R0, _DIV_LOOP

;四舍五入

JNC _CAL_END

INC R1

_CAL_END:

MOV A,R1

MOV DPTR,#BUF2 ; (1+2+3++16) /16 =85 YUEDENGYU 9

MOVX @DPTR,A

POP 2

POP 1

POP 0

RET ;}

_SUM: ;{

; 2从内部存储器20H单元开始,有30个数据。

; 试编一个程序,把其中的正数、负数分别送51H和71H开始的存储单元,

; 并分别记下正数、负数的个数送50H和70H单元。

PUSH 0

PUSH 1

PUSH 2

PUSH 3

MOV R3,#30

MOV R1,#51H

MOV R2,#71H

MOV R0,#20H

_SUM_LOOP:

MOV A,@R0

ANL A,#80H

JZ _SUM_ZHENG

_SUM_FU:

MOV A,@R0

PUSH 0

MOV A,R2

MOV R0,A

MOV @R0,A ; 相对寻址仅能用r0 r1,否则编译报错

POP 0

INC R2

AJMP _SUM_END

_SUM_ZHENG:

MOV A,@R0

MOV @R1,A

INC R1

_SUM_END:

INC R0

DJNZ R3, _SUM_LOOP

CLR C

MOV A,R1

SUBB A,#51H

MOV 50H,A

CLR C

MOV A,R2

SUBB A,#71H

MOV 70H,A

POP 3

POP 2

POP 1

POP 0

RET ;}

END

以上就是关于51单片机汇编程序详解:POP是干什么的全部的内容,包括:51单片机汇编程序详解:POP是干什么的、51单片机汇编语言编程独立按键、51单片机问题 编程(用汇编)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9832328.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-02
下一篇2023-05-02

发表评论

登录后才能评论

评论列表(0条)

    保存