原创 MCS-51单片机I/O端口的存取设计

2009-8-16 08:29 1650 5 5 分类: MCU/ 嵌入式

发布: 2009-4-04 00:02 |  作者: hnrain |   查看: 18次


  MCS-51单片机通常有4个8位I/O端口, 向各端口的写数据均写入到对应端口的锁存器中, 但对各端口的读操作却有两个方式:读锁存器和读引脚 电子园51单片机学习网3[(c{ L+zyZ'K

 电子园51单片机学习网.Sx y KD/`!g1t ~j


'Y^;B;n.TD!o5F01 读-修改-写操作

-Ma'Rv3J?'r0

qh1C ^e*R+j0
'},y&M8][7D0    Pn(指P0,P1,P2,P3)在51汇编语言中是特殊的标识符,既代表Pn端口引脚,又代表Pn锁存器(Pn SFR)。在MCS-51指令系统中有些指令读锁存器的值, 有些指令则读引脚上的值。读锁存器指令是从锁存器中读取一个值并进行处理, 把处理后的值(原值或已修改后的值)重新写入锁存器中。这类指令称为读-修改-写指令, 表1列举了有该功能的指令 当目的操作数是Pn端口或Pn端口的某一位时. 该指令读取锁存器的值.

4paM,B!y([?%s2h$t0

7[i _ }/deAfGz0电子园51单片机学习网(j6G^ aT%^
 

o.b }_8q8QE2be0

K3Ppw9C q0电子园51单片机学习网"S bE l]!Z;I/\Vw
    这些指令的一个共同特点, 就是要先并行读入Pn锁存器(非Pn端口引脚)中的值,作一定的修改,然后再写入谚端口的锁存器。表1中晶后三条指令读-修改-写关系不够明显。实际上它们的执行过程序是:先将Pn的8位锁存器内容一起读人,再对指定位进行修改, 然后又 8位一起写入锁存器。电子园51单片机学习网u%h-zq2yd v


%r rnZ3yZ&tZN~k0电子园51单片机学习网 vy;v ih!Q(u*o2Pv
    对于读-修改-写指令。直接读锁存器而不是读端口引脚, 是因为从引脚上读出的数据不一定能真正反映锁存器的状态 例如:若用Pn的某一位引脚直接驱动一个NPN三极管的基极,当向此端口写“1” 时, 三极管导通并把端口引脚的电平钳位约0.7 V (对于硅管) 这时,CPU若从此引脚读取数据. 会把该数据(应为1)错读为0;若直接从锁存器读取, 则读出正确的数据。电子园51单片机学习网#A*BE ~*ULu1}d


"W'M/]6A?s4S0c2a0
{#E nb+l_l0    理解了Pn的特殊性及读-修改-写指令后, 就不难理解指令PUSH Pn的含义了。它的执行过程是:读Pn引脚(非读Pn锁存器)的值, 然后将此数值压入堆栈 以下是一段测试程序:电子园51单片机学习网:N Y3STi7x.X

L o_R nx5|:@0ORG 1000H电子园51单片机学习网u/k[O.V4p]
1000 75A07F MOV P2,#7FH电子园51单片机学习网WW;hkl~3P1Z+Yb
1003 7900   MOV R1,#00H电子园51单片机学习网7JY)y(m,F ]
1005 74FF   MOV A,#0FFH
:a uYk.p B@l01007 COA0   PUSH P2电子园51单片机学习网K8y*L5~$r:b
1009 D0A0   POP P2
u/o%L Aq)Y\$i'vYp0100B F3     MOVX @R1,A
.]6oMdqm1d0100C 22     RET电子园51单片机学习网X#hz:X H{Gm'I


H,j+{v(uUm1I7IO0
)r)Jnm@_,\0电子园51单片机学习网-R1]7\4Y'Ok"kg~n
    这段程序原意是将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)地址中 有兴趣的读者可以尝试一下。

(tL&pJVgkF%c4Y0 电子园51单片机学习网#BPz3wcn

 

s]@6@"[P9N8Yoa:{0

d [5[/x:|? L1K^02 可靠读取Pn锁存器中数据的方法电子园51单片机学习网@7PzF~"p


Q3c0P F Ip0
wMD1k$\0    上述程序并无实际运行意义, 在这里只是引出如何可靠地读取Pn锁存器中的数据问题。在MCS51指令系统中并没有一条指令可以让汇编程序员直接读取Pn锁存器的数据。在表1中只有JBC Pn.Y,Label可以较快速地获取Pn锁存器第Y位的值。由于篇幅关系,本文只介绍P2锁存器的操作,其他锁存器的操作可参照P2写出 下面是获取P2锁存器值的子程序。电子园51单片机学习网K*[\T/PK'vX I

电子园51单片机学习网#s^UuJX g


0U]J6n1px&L0
z6p}/V{~+O ?0GetSfrP2:PUSH IE ;保护中断允许寄存器电子园51单片机学习网Rg6Co u#M2sAec
CLR EA ;禁止所有中断
y4keSf0MOV A.#0FFH
1Of,`[&^a5DS8l0JBC P2.0,$+5;P2锁存器位0为"1" 则清"0"并跳
f MJ9@o {0;转到$+5地址(JBC P2.1,$+5)电子园51单片机学习网%J7bdf Ibd.g\


b{OMmu,X0CLR ACC.0 ;否则ACC.0清为"0"
DOQj I7Wv0JBC P2.1,$+5
&x"t+p/n!c5j%O)p0CLR ACC.1电子园51单片机学习网 OrQ KUi8C}"z$i
JBC P2.2,$+5电子园51单片机学习网-rWL3O7fiA v
CLRACC2
cFm*^7_0o.u0JBC P2.3,$+5电子园51单片机学习网3y&A2J"V xY
CLR ACC 3电子园51单片机学习网"sK{.V,Y&~
JBC P2.4,$+5电子园51单片机学习网*HBrrM0| V
CLR ACC 4电子园51单片机学习网(kPGX-so2l&k
JBC P2.5,$+5电子园51单片机学习网 S[8B"tL&N+P
CLRACC 5
/~ MC?!A&FW1f+xz0JBC P2.6,$+5
#BO-Iw3`5V3kl!g0CLR ACC.6
,w&x;[,a^6Z2k0JBC P2.7,$+5电子园51单片机学习网(Ly3A&Nt dC
CLR ACC.7电子园51单片机学习网C#vU5w7m%p*l9U
MOV P2,A ;恢复P2锁存器原值
!C{ n,\ p+K%{WUr'A*Nq0POPIE  ;恢复中断允许寄存器电子园51单片机学习网 cW*iC+N UE D _J
RET

h;b2W_q~tG)Ga0

YbX5RN7g{ X0    另外也可在RAM 中建立各Pn锁存器的映像.通过专用程序对Pn锁存器进行操作 这样就可以在不对引脚状态有任何影响的情况下,快速可靠地读取与Pn锁存器一致的数值。以在内部RAM 中建立P2映像为例:电子园51单片机学习网bC%LP2XA4~]

k'Fn3sM qf/[A!j0EP2 Data 60H ;P2锁存器映像
v:C&\ K)[$Uj0WriteSfrP2: MOV EP2,A ;将A写人P2锁存器映像
w'jo;upJ t0MOV P2,A ;将A写人P2锁存器电子园51单片机学习网s/Q~DCb:d1C
RET
r:Yk9o{Kgd0ReadSfrP2: MOV A,EP2 ;将P2锁存器映像写入A
1Do)Vu\IbY,T+w0RET电子园51单片机学习网uG7JLxpV*}K


h!N&\pp uc'?8\0
AI#L,FA-S%P8aN0电子园51单片机学习网6ESS3IdF#f6r*D
    如果确信读P2端口时的值都等于P2锁存器中的值,则可以用51单片机地址指针及其应用的操作方法,简单地PUSHP2和POP P2指令来保护和恢复现场程序段中使用的P2锁存器

3y&Z+u2Q+pI\ `0

0i'J1]T0x$Q"z5d q-]0
G`[P T0    以上三种读取Pn锁存器值的方法, 第二种方法,即在RAM 中建立Pn锁存器映像的方法,存取速度较快,适台MCS-51的任何工作方式,在读过程中不会对Pn锁存器及端口引脚状态有任何干扰,是三种方法中最好的。电子园51单片机学习网e"cdf p

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
5
关闭 站长推荐上一条 /3 下一条