2

我有这个代码:

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 上进行强制转换,它按预期工作。

4

0 回答 0