
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单片机问题 编程(用汇编)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)