51单片机的4个I/O端口P0~P3的位结构如图所示:
每个端口在读数据之前都应该先对端口写1,以P1口为例说明如下:
假设初始时内部总线为低电平,则Q非端为高电平,此时VT管导通,引脚接地,被钳位为0,此时读到的数据恒为0。当执行MOV P1,#0FFH后,内部总线为高电平,Q非端为低电平,VT管截止,此时如果引脚电平为高电平,当执行读指令时(如MOV A,P1),读引脚打开三态缓冲器,引脚信号送至内部总线,由于内部总线也为高电平,则内部总线和引脚输入的电平一样,这是我们希望的;如果引脚电平变为低电平,当执行读指令时(如MOV A,P1),读引脚打开三态缓冲器,引脚信号输送至内部总线使内部总线由高电平变为低电平,此时Q非端为高电平,VT管导通,接地与引脚低电平契合,这也是我们希望的,达到了和谐。
P0端口在作I/O口使用时必须外接上拉电阻,如下图所示:
在矩阵键盘中有如下电路:
假设开关闭合之前,P1.0=0,P1.4=1。现在闭合开关S,则由于P1.4一开始为1,使得VT截止,当引脚电平变为0后,由于这仅仅是引脚外部变化,CPU并未执行读端口指令,故读引脚未使能,三态缓冲器断开,内部总线不受影响,依然为1。所以当S闭合后,P1.0和P1.4都为低电平。当S再断开,P1.0仍为低电平,而P1.4因为受上拉电阻影响会变为高电平。注意整个开关S合上断开过程内部总线未受影响,因为CPU未执行任何读写端口指令。