利用单片机时肯定会用到单片机的IO引脚。以51单片机P1口为例。内部构造如图所示
当单片机进行写操作时,引脚锁存器(D触发器)CLK端吸收有效电平,然后内部总线上须要写的数据就会通过D触发器传输到Q'。当写1时Q'为0,使MOSFET截止,因此外部引脚电平为1.当写0时Q'为1,MOSFET饱和导通,此时引脚可以算作接地,以是引脚为0。

如果对单片机IO口进行读操作。由图可以看出读操作包括读寄存器和读引脚。以前知道有这两种差异,但是从来没仔细区分过。从图中可以看出读寄存器时读寄存器上的三态缓冲器打开,Q真个值直接传到了内部总线上,而下面的读引脚三台缓冲器是高阻态,读引脚时则相反。
汇编措辞中对读寄存器和读引脚做了一定的差异,但说实话我在看汇编代码时还是区分不清两者的差异。现在大家对单片机编程该当大部分采取的都是C措辞,在我看来,C措辞中已经极大的淡化了读寄存器还是读引脚的差异。
有些人说a=P1是读引脚(a是某个字符变量),P1=P1|0x00是读寄存器(可能因此为这里P1进行了一次逻辑运算,只有寄存器中的值才能进行逻辑运算),但我在用C措辞时觉得用P1=P1|0x00也是读的引脚。也有些人说看经由编译器编译后的汇编代码才能分辩出两者的差异,不知道这里大家怎么看读引脚和读寄存器?
在读引脚时须要先向引脚锁存器中写1。由于如果引脚寄存器中是0的话会导通MOSFET,使外部端口一贯是低电平,纵然表面接的是高电平在读引脚的时候也读的是0。以前知道须要这样做,但读引脚的时候一贯没写过1,创造读的也对,现在我以为这样写不符合规范。
一样平常来说单片机在上电复位后默认引脚寄存器的值是1,这样一来关断了MOSFET,而我们在利用单片机的时候如果这个引脚作为输入,也不会让它变成一下子输出一下子输入,使得能够准确的读出外部端口的值。现在我在写程序时如果端口做为输入引脚,我会在初始化里对其写一次1。当然,往后就不用写了,由于写了一次1后没有其他的写操作,引脚锁存器中会一贯保持这个值不变。当然,如果某个单片机引脚同时作为输出和输入引脚复用时,则必须在输出完成后变成输入前先向其写1,再读引脚的值。










