关于从寄存器 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(未设置)但返回非零结果(导致屏蔽位)。
我需要理解为什么我必须使用 &=(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(未设置)但返回非零结果(导致屏蔽位)。