我有这个代码:
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 上进行强制转换,它按预期工作。