发布: 2009-4-04 00:02 | 作者: hnrain | 查看: 18次
!v:Q|$Z!f8xF45985
5_:[HU;_ t45985 电子园51单片机学习网 r}b'{T-z#{ Xk#h1 读-修改-写操作电子园51单片机学习网on"y]cC9V7U
电子园51单片机学习网U.I5eZv)l.R2xF电子园51单片机学习网[.u@-r)W]4i
Pn(指P0,P1,P2,P3)在51汇编语言中是特殊的标识符,既代表Pn端口引脚,又代表Pn锁存器(Pn SFR)。在MCS-51指令系统中有些指令读锁存器的值, 有些指令则读引脚上的值。读锁存器指令是从锁存器中读取一个值并进行处理, 把处理后的值(原值或已修改后的值)重新写入锁存器中。这类指令称为读-修改-写指令, 表1列举了有该功能的指令 当目的操作数是Pn端口或Pn端口的某一位时. 该指令读取锁存器的值.电子园51单片机学习网z#K Sa2i c
电子园51单片机学习网 Dg:}7{0a4e1a
+U!}|0C+g'~.?.}45985电子园51单片机学习网!gW-R8p!];i
这些指令的一个共同特点, 就是要先并行读入Pn锁存器(非Pn端口引脚)中的值,作一定的修改,然后再写入谚端口的锁存器。表1中晶后三条指令读-修改-写关系不够明显。实际上它们的执行过程序是:先将Pn的8位锁存器内容一起读人,再对指定位进行修改, 然后又 8位一起写入锁存器。
&D ~Y5h:bZb#}5Q s;u45985
.J6}f"L rT9{Z qBi45985 对于读-修改-写指令。直接读锁存器而不是读端口引脚, 是因为从引脚上读出的数据不一定能真正反映锁存器的状态 例如:若用Pn的某一位引脚直接驱动一个NPN三极管的基极,当向此端口写“1” 时, 三极管导通并把端口引脚的电平钳位约0.7 V (对于硅管) 这时,CPU若从此引脚读取数据. 会把该数据(应为1)错读为0;若直接从锁存器读取, 则读出正确的数据。电子园51单片机学习网/{sZ wC4V3z
8c },?(^'cZ:W#A`45985
^ j`:@4le+o"d45985 理解了Pn的特殊性及读-修改-写指令后, 就不难理解指令PUSH Pn的含义了。它的执行过程是:读Pn引脚(非读Pn锁存器)的值, 然后将此数值压入堆栈 以下是一段测试程序:电子园51单片机学习网eFn/@q't
电子园51单片机学习网g3Z nVG*\
ORG 1000H
[$]7nE9p"G lf_459851000 75A07F MOV P2,#7FH电子园51单片机学习网j6G@~FB l)Q;bk
1003 7900 MOV R1,#00H
s;^M7]R$]%S459851005 74FF MOV A,#0FFH
3A c UcYgp o459851007 COA0 PUSH P2电子园51单片机学习网+Q^rPn
1009 D0A0 POP P2
h']B[Ks R|S:x3g45985100B F3 MOVX @R1,A电子园51单片机学习网j~;[s*bR1z Af
100C 22 RET电子园51单片机学习网xo;z;d4t,hP
i"B5e*j0e1F45985电子园51单片机学习网2I;qu-W!Ap&o
,R^_A5o0dd}u45985 这段程序原意是将FFH立即数存人外部RAM地址为7F00的单元中, 但具体的运行结果与这段程序是在片内或片外被执行有密切关系。若在片内,结果与程序原意一致;若在片外,MCU执行这段片外程序后 结果却把FFH错误地送到了外部RAM 的1000H地址去。为什么会出错?因为在执行片外程序时, 出现在P2端口引脚上的数据是PCH (程序指针的高8位,此时为10H),在执行PUSH P2指令时.读取P2引脚上的数据是10H.所以将10H压入堆栈,紧跟的POP P2指令是将当前栈顶数据10H弹出并写入P2锁存器,然后执行的MOVX @R1,A指令,将A中的数据写入[P2R1](此时P2RI=1000H)地址中 有兴趣的读者可以尝试一下。
}ySRces:OW+t45985 电子园51单片机学习网pWW7qu/q$h!p't
2 可靠读取Pn锁存器中数据的方法
.NF!^5~#_Fv45985*qt)t"y#\&Q'R,I u J9Ve45985
Fu]7per45985 上述程序并无实际运行意义, 在这里只是引出如何可靠地读取Pn锁存器中的数据问题。在MCS51指令系统中并没有一条指令可以让汇编程序员直接读取Pn锁存器的数据。在表1中只有JBC Pn.Y,Label可以较快速地获取Pn锁存器第Y位的值。由于篇幅关系,本文只介绍P2锁存器的操作,其他锁存器的操作可参照P2写出 下面是获取P2锁存器值的子程序。电子园51单片机学习网-l3\1b2S\(a#y
电子园51单片机学习网!@JF2^-p8[(J
电子园51单片机学习网Rl0~L$jGC
GetSfrP2:PUSH IE ;保护中断允许寄存器电子园51单片机学习网'b!C#C$|kd^
CLR EA ;禁止所有中断电子园51单片机学习网 }4?8J'hJ?+l
MOV A.#0FFH
I a~ w ]!jn45985JBC P2.0,$+5;P2锁存器位0为"1" 则清"0"并跳电子园51单片机学习网~C D?'i}@`ih*Q
;转到$+5地址(JBC P2.1,$+5)电子园51单片机学习网&k u8t{T [SVn
8`z(E,F'?'c45985CLR ACC.0 ;否则ACC.0清为"0"
rL NzM gvR0V45985JBC P2.1,$+5电子园51单片机学习网&g*Dj3K y1|(R [o2g
CLR ACC.1
e `4TYl45985JBC P2.2,$+5
@;u4\dJ K45985CLRACC2电子园51单片机学习网+Q { O P5@"Y
JBC P2.3,$+5
fX0^ WiZ Z45985CLR ACC 3电子园51单片机学习网 s^u4w&IS
JBC P2.4,$+5电子园51单片机学习网s)r F? mCc[p
CLR ACC 4
[([%hd Y@45985JBC P2.5,$+5
3\K\6Ma45985CLRACC 5电子园51单片机学习网6Ec-bD,BUE
JBC P2.6,$+5
_ C(G6K$fN+iOs45985CLR ACC.6电子园51单片机学习网x q1m@E2?
JBC P2.7,$+5电子园51单片机学习网DmETjgw
CLR ACC.7电子园51单片机学习网8q(r(G4\t'v9B6c
MOV P2,A ;恢复P2锁存器原值
HN^q.L/Y,vOAf45985POPIE ;恢复中断允许寄存器电子园51单片机学习网:H;@1_6_OT
RET电子园51单片机学习网J] Of"x;cvO_6Q
另外也可在RAM 中建立各Pn锁存器的映像.通过专用程序对Pn锁存器进行操作 这样就可以在不对引脚状态有任何影响的情况下,快速可靠地读取与Pn锁存器一致的数值。以在内部RAM 中建立P2映像为例:电子园51单片机学习网@Btw9bx1Jt%Ht
电子园51单片机学习网Y6iUr8n
EP2 Data 60H ;P2锁存器映像
UMBY&_4z45985WriteSfrP2: MOV EP2,A ;将A写人P2锁存器映像电子园51单片机学习网/X B4|`v'Q5T4@z
MOV P2,A ;将A写人P2锁存器
)h c j i Yf9y6j1C45985RET电子园51单片机学习网4N T+w7Rm@(Q:|zLy
ReadSfrP2: MOV A,EP2 ;将P2锁存器映像写入A
7JM EA~/tpi45985RET
%a8Je-H.gJ;L45985电子园51单片机学习网Qa/oQeB"\4CU9m[
电子园51单片机学习网 W} L.|&^ `Dx-[$x1n%W
如果确信读P2端口时的值都等于P2锁存器中的值,则可以用51单片机地址指针及其应用的操作方法,简单地PUSHP2和POP P2指令来保护和恢复现场程序段中使用的P2锁存器
*C:N:Xg5vZ45985电子园51单片机学习网2jjg`EL&~a&R
以上三种读取Pn锁存器值的方法, 第二种方法,即在RAM 中建立Pn锁存器映像的方法,存取速度较快,适台MCS-51的任何工作方式,在读过程中不会对Pn锁存器及端口引脚状态有任何干扰,是三种方法中最好的。电子园51单片机学习网GJ0rHq8j[y
文章评论(0条评论)
登录后参与讨论