51单片机读端口与读引脚

时间:2021-03-07 19:49:04

原文网址:http://blog.sina.com.cn/s/blog_3e8a48bf0100cm2g.html

(1)引脚的结构图清楚吗?

 51单片机读端口与读引脚

以上是P0口一位的结构。以上结构说明:读引脚之前一定要对端口先置1,使mosfet V2截止,以免信号被拉低而读错,这一点很容易理解。

(2)什么指令读端口?什么指令读引脚?

一般的教科书上都会强调:读端口的指令为端口内容取反这样的“读-修改-写”指令。而读引脚之前,先置1,然后用Mov A,Px之类的指令即可。 以下是从web(http://www.dzsc.com/dzbbs/20061112/200765184756359377.html)上搜集的资料:

资料称: 这样的指令才有 Read-Modify-Write 功效

ANL (logical AND, e.G., ANL P1,A)
ORL (logical OR, e.g., ORL P2,A)
XRL (logical EX-OR, e.g., XRL P3,A)
JBC (jump if bit = 1 and clear bit, e.g., JBC P1.1, LABEL)
CPL (complement bit, e.g., CPL P3.0)
INC (increment, e.g., INC P2)
DEC (decrement, e.g., DEC P2)
DJNZ (decrement and jump if not zero, e.g., DJNZ P3, LABEL)
MOV PX.Y,C(move carry bit to bit Y of
 PORT X)
CLR PX.Y(clear bit Y of
 PORT X)
SETB PX.Y(set bit Y of
 PORT X)

(3)有没有读端口的指令(而不修改端口)?

可以说,没有直接的读端口的指令。无论之前是否置1,以下指令

MOV A, P1
MOV 20H, P1
MOV R0, P1
MOV @R0, P1

读的都是引脚,尽管不一定读准确。

要想知道端口内容,可以采用的方法是(以下代码来源于网络):

51端口锁存器是能读取!!仿真机才会用到
READ_PORT_P1_REG2ACC:
     CLR A ; MOV A, #0FFH
     CPL A

     JB P1.0, L_11 ; $+11 ; pin 为“1”时,锁存器肯定为“1”
       JBC P1.0, L_06; $+ 6 ; 用JBC
 TEST 锁存器, 为“1”时,跳    
          JBC ACC.0, L_05; $ + 5 ; == clr acc.0   / sjmp L_05
                                  用2周期/3bytes, 代替 3周期/4bytes
L_06:       SETB P1.0       ; 恢复 锁存器 为“1”
L_05:
L_11:

     JB P1.1, $+11  
     JBC P1.1, $+ 6
         JBC ACC.1, $ + 5
       SETB P1.1

     JB P1.2, $+11
     JBC P1.2, $+ 6
         JBC ACC.2, $ + 5
       SETB P1.2

     JB P1.3, $+11
     JBC P1.3, $+ 6
         JBC ACC.3, $ + 5
       SETB P1.3

     JB P1.4, $+11
     JBC P1.4, $+ 6
         JBC ACC.4, $ + 5
       SETB P1.4

     JB P1.5, $+11
     JBC P1.5, $+ 6
         JBC ACC.5, $ + 5
       SETB P1.5

     JB P1.6, $+11
     JBC P1.6, $+ 6
         JBC ACC.6, $ + 5
       SETB P1.6

     JB P1.7, $+11
     JBC P1.7, $+ 6
         JBC ACC.7, $ + 5