关于从寄存器 GPIODATA 读取引脚

about reading pin from register GPIODATA

我需要理解为什么我必须使用 &=(and) 而不是 |=(or).

我尝试绘制并使用它但没有成功。

      char readPin(char port,char pinNum){
       switch(port){
          case'A' :
              return ((portA &=(1<<pinNum))>>pinNum);
          case'B' :
              return ((portB &=(1<<pinNum))>>pinNum);
           case'C' :
              return ((portC &=(1<<pinNum))>>pinNum);
           case'D' :
              return ((portD &=(1<<pinNum))>>pinNum);
           case'E' :
              return ((portE &=(1<<pinNum))>>pinNum);
           case'F' :
              return ((portF &=(1<<pinNum))>>pinNum);

    }
}

我想知道为什么使用 and 而不是 or

 portA &=(1<<pinNum)

return在移动到的位置有一个'1'。

例如:PinNum = 4,端口 A.4 设置/高,端口 A.1 设置/高

PortA                           -    0001 0010
(1<<pinNum)                     -    0001 0000 &  // use bitwise and

portA &=(1<<pinNum)             -    0001 0000    // Result (bit 1 is discarded due to and operation)
((portA &=(1<<pinNum))>>pinNum) -    0000 0001    // Result is shifted back to position 0

returned 值为 1。

如果您要使用按位或类似的方式:

portA |= (1<<pinNum)

在所有情况下,您都会 return 一个非 0 值。

例如:PinNum = 4,所有端口 A 位都为低。

PortA                           -    0000 0000
(1<<pinNum)                     -    0001 0000 |  // use bitwise or

portA |=(1<<pinNum)             -    0001 0000    // Result (bit 4 is set)
((portA |=(1<<pinNum))>>pinNum) -    0000 0001    // Result is shifted back to position 0

returned 值为 1。

如您所见,您尝试检查 Pin 4(未设置)但返回非零结果(导致屏蔽位)。