视频讲解
或者哔哩哔哩观看
https://www.bilibili.com/video/BV1fv411G7VU/
例1 已知程序执行前有A=01H,SP=42H,(41H)=FFH,(42H)=FFH。下列程序执行后:
POP DPH
POP DPL
MOV DPTR,#3000H
RL A
MOV B,A
MOVC A,@A+DPTR
PUSH ACC
MOV A,B
INC A
MOVC A,@A+DPTR
PUSH ACC
RET
ORG 3000H
DB 10H,80H,30H,50H,30H,50H
解答:
POP DPH ; (42H)赋值给DPH,这个关系一直存在,知道程序结束。 SP= 41 H,
POP DPL ;(41H)赋值给DPL,SP=40H
MOV DPTR,#3000H ;DPTR=#3000H
RL A ;A=02H ;16进制左移一位,先化为二进制过程更明显。
MOV B,A ;B=02H
MOVC A,@A+DPTR ;查表得A=30H , 是从00H开始 查表的。
PUSH ACC ;将A 中的值赋值给,上一个空出位41H,(41H)=DPL 。 因为SP指针指向的栈 ,是有值的, 只有比他高的地址是空的。如指向(01H),那么(01H)中有值,(02H),(03H)….. 中没值。SP=41H,(41H)=#30H=DHL
MOV A,B ;A=02H
INC A ;A=03H
MOVC A,@A+DPTR ;查表A=50H
PUSH ACC ;将A 的值赋给再上一个空位,(42H)=50H=DPH 。
RET ;子程序结束!RET指令弹出断点位置即SP最近两字节数据SP=SP-2=40H,PC=5030(大端对齐)
ORG 3000H
DB 10H,80H,30H,50H,30H,50H
例2 P1.7=ACC.0×(B.0+P2.1)+(P3.2)非
MOV C, B.0
ORL C, P2.1
ANL C, ACC.0
ORL C, /P3.2
MOV P1.7, C
END
例3 一台主机与三台从机通信
例4 将片外数据存储器4004H、5005H、6006H单元的内容交换(16位交换)
POP DPH
POP DPL
mov dptr,#4004h
clr a
movx a,@dptr
push acc
mov dptr,#5005h
clr a
movx a,@dptr
mov b,a
pop acc
movx @dptr,a
mov dptr,#4004h
mov a,b
movx @dptr,a
mov dptr,#5005h
clr a
movx a,@dptr
push acc
mov dptr,#6006h
clr a
movx a,@dptr
mov b,a
pop acc
movx @dptr,a
mov dptr,#5005h
mov a,b
movx @dptr,a
例5 51单片机DAC0832各种波形程序
程序:
请勿标注电阻大小
牛
牛
?
牛
很强
牛
牛
牛
可以可以
牛
(大拇指)
wow
好家伙,你冒充我
牛
牛
大佬大佬