运用单片机时肯定会用到单片机的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,再读引脚的值。