单片机的P0中是集电集开路输出,也叫OC门(真对TTL型逻辑),或者是OD门,源级开路(真对MOS芯片)。所以要在P0口加上一个上拉电阻,这样P0口才会有高电平输出。P0口的低电平驱动能力要比其他口大,最大的可以达到几十个毫安。这是把这个口单独当成普通IO口使用时要注意的。
P0口和P2口在当成地址总线时,这两个口是用来一起进行外部存储器寻址用的。这个时候P0口是低八位地址,P2口是高八地址。加起来一共是16位地址。也就是可以寻址64KB的存储器空间。当你用汇编语言指令MOVX访问外部数据存储器的时候就是这种情况。这个地址在这个时候是存在DPTR的这个16位寄存器里的。而数据是对P0口分时复用的,数据是走P0口的。
当你要访问程序存储器的时候,用MOVC指令,同样要先设置DPTR寄存器才能访问,这个时候如果是读芯片外的程序空间,同样也是P0口是低八位,P2口是高八位。
如果你用到了MOVC或者MOVX这两个指令来给LCD写数据或者CC1100写数据,并且设置了DPTR寄存器(这个寄存器可以高八位用DPTRH读写,低八位可以用DPTRL读写),可能就会因为不知道具体的地址设置情况而出错。
另外说一下,P0口设计成集电极开路输出是有原因的。因为这样P0口就可以同时接两个芯片了。而这两个芯片也同样都是OC门,一起接在同一个上拉电阻上,就形成了一种线“与”逻辑,接在线上的芯片因为只能高为低电平或者高阻态而可以互相不影响的分时使用总线了,但每次只能有一个芯片使用这条总线,这就是分时复用。