资源描述:
《51单片机io口的存取》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、MCS-51单片机通常有4个8位I/O端口,向各端口的写数据均写入到对应端口的锁存器中,但对各端口的读操作却有两个方式:读锁存器和读引脚1读-修改-写操作 Pn(指P0,P1,P2,P3)在51汇编语言中是特殊的标识符,既代表Pn端口引脚,又代表Pn锁存器(PnSFR)。在MCS-51指令系统中有些指令读锁存器的值,有些指令则读引脚上的值。读锁存器指令是从锁存器中读取一个值并进行处理,把处理后的值(原值或已修改后的值)重新写入锁存器中。这类指令称为读-修改-写指令,表1列举了有该功能的指令当目的操作数是Pn端口或Pn端口的某一位时.
2、该指令读取锁存器的值. 这些指令的一个共同特点,就是要先并行读入Pn锁存器(非Pn端口引脚)中的值,作一定的修改,然后再写入谚端口的锁存器。表1中晶后三条指令读-修改-写关系不够明显。实际上它们的执行过程序是:先将Pn的8位锁存器内容一起读人,再对指定位进行修改,然后又8位一起写入锁存器。 对于读-修改-写指令。直接读锁存器而不是读端口引脚,是因为从引脚上读出的数据不一定能真正反映锁存器的状态例如:若用Pn的某一位引脚直接驱动一个NPN三极管的基极,当向此端口写“1”时,三极管导通并把端口引脚的电平钳位约0.7V(对于硅管)这
3、时,CPU若从此引脚读取数据.会把该数据(应为1)错读为0;若直接从锁存器读取,则读出正确的数据。 理解了Pn的特殊性及读-修改-写指令后,就不难理解指令PUSHPn的含义了。它的执行过程是:读Pn引脚(非读Pn嫫?的值,然后将此数值压入堆栈以下是一段测试程序:ORG1000H100075A07FMOVP2,#7FH10037900 MOVR1,#00H100574FF MOVA,#0FFH1007COA0 PUSHP21009D0A0 POPP2100BF3 MOVX@R1,A100C22 RET 这段程
4、序原意是将FFH立即数存人外部RAM地址为7F00的单元中,但具体的运行结果与这段程序是在片内或片外被执行有密切关系。若在片内,结果与程序原意一致;若在片外,MCU执行这段片外程序后结果却把FFH错误地送到了外部RAM的1000H地址去。为什么会出错?因为在执行片外程序时,出现在P2端口引脚上的数据是PCH(程序指针的高8位,此时为10H),在执行PUSHP2指令时.读取P2引脚上的数据是10H.所以将10H压入堆栈,紧跟的POPP2指令是将当前栈顶数据10H弹出并写入P2锁存器,然后执行的MOVX@R1,A指令,将A中的数据写入[P2
5、R1](此时P2RI=1000H)地址中有兴趣的读者可以尝试一下。2可靠读取Pn锁存器中数据的方法 上述程序并无实际运行意义,在这里只是引出如何可靠地读取Pn锁存器中的数据问题。在MCS51指令系统中并没有一条指令可以让汇编程序员直接读取Pn锁存器的数据。在表1中只有JBCPn.Y,Label可以较快速地获取Pn锁存器第Y位的值。由于篇幅关系,本文只介绍P2锁存器的操作,其他锁存器的操作可参照P2写出下面是获取P2锁存器值的子程序。GetSfrP2:PUSHIE;保护中断允许寄存器CLREA;禁止所有中断MOVA.#0FFHJBCP
6、2.0,$+5;P2锁存器位0为1则清0并跳;转到$+5地址(JBCP2.1,$+5)CLRACC.0 ;否则ACC.0清为0JBCP2.1,$+5CLRACC.1JBCP2.2,$+5CLRACC2JBCP2.3,$+5CLRACC3JBCP2.4,$+5CLRACC4JBCP2.5,$+5CLRACC5JBCP2.6,$+5CLRACC.6JBCP2.7,$+5CLRACC.7MOVP2,A ;恢复P2锁存器原值POPIE ;恢复中断允许寄存器RET 另外也可在RAM中建立各Pn锁存器的映像.通过专用程序对Pn锁存器进行操作这
7、样就可以在不对引脚状态有任何影响的情况下,快速可靠地读取与Pn锁存器一致的数值。以在内部RAM中建立P2映像为例:EP2Data60H;P2锁存器映像WriteSfrP2:MOVEP2,A;将A写人P2锁存器映像MOVP2,A;将A写人P2锁存器RETReadSfrP2:MOVA,EP2;将P2锁存器映像写入ARET 如果确信读P2端口时的值都等于P2锁存器中的值,则可以用51单片机地址指针及其应用的操作方法,简单地PUSHP2和POPP2指令来保护和恢复现场程序段中使用的P2锁存器 以上三种读取Pn锁存器值的方法,第二种方法,
8、即在RAM中建立Pn锁存器映像的方法,存取速度较快,适台MCS-51的任何工作方式,在读过程中不会对Pn锁存器及端口引脚状态有任何干扰,是三种方法中最好的。