我有这段代码:
void GPIO_InitPortPin(uint8* PortControl, uint8 Pin, uint8 PinDir){
*PortControl &= (~(1U << Pin));
*PortControl |= (PinDir << Pin);
}
如果PortControl
寄存器为11111111
,则第一行应清除相应Pin
的位,但意外地清除所有寄存器。
我的客户端功能是:GPIO_InitPortPin(&TRISB, GPIO_PIN_0, GPIO_IN);
GPIO_PIN_0
和GPIO_IN
的宏定义如下:
#define GPIO_PIN_0 (0)
#define GPIO_PIN_1 (1)
...
#define GPIO_PIN_7 (7)
#define GPIO_OUT (0)
#define GPIO_IN (1)
所以,我尝试将Pin转换为sint8
:*PortControl &= (~(1U << (sint8) Pin));
它有效。此外,我尝试将Pin硬编码为1
,它运行正常。我知道问题是Pin
是uint8
或具体是unsigned
,因为
*PortControl &= (~(1U << 1));
也工作得很好。
我的问题是:为什么右操作数类型会影响换档操作,虽然之前我已经红了(RHS不会影响操作)?
我使用SDCC编译器。
编辑:我已经测试了该函数而没有在gcc上进行投射,并且它按预期工作。