你能告诉我 convertLedNumberToBit 和 LedDriver_TurnOn 是做什么的吗?我不明白 1 << (num - 1)|= 发生了什么

static uint16_t * ledsAddress;

static uint16_t convertLedNumberToBit(int ledNumber)
{
    return  1 << (ledNumber - 1);
}
void LedDriver_TurnOn(int ledNumber)
{
    *ledsAddress |= convertLedNumberToBit(ledNumber);
}

最佳答案

要在 I/O 端口 ledsAddress 处“打开”LED[ledNumber],必须将等效位设置为“1”。但是,在更改 I/O 端口值时,您必须保持所有其他 LED 的状态仍为“ON”。
convertLedNumberToBit(int ledNumber) 使用掩码 b0000000000000001(16 位)通过切换到 (ledNumber-1) 的左侧将 ledNumber 位设置为“1”{ledNumber 为 1 时不需要移位。

例如: (ledNumber = 4) => 返回值是 b0000000000001000 = 0x0008

然后调用 |= convertLedNumberToBit(ledNumber) 将仅将 ledNumber 位强制为“1”,而不会通过二进制或来更改其他位。

例如:(led1、led3 和 led7 为“ON”)
在 OR b0000000001000101 = 0x0045 之前。
LedDriver_TurnOn(4) => b0000000000001000 = 0x0008在 OR b0000000001001101 = 0x004D 之后。


void LedDriver_TurnOff(int ledNumber)
{
    *ledsAddress &= ~(convertLedNumberToBit(ledNumber));
}

关于C BitWise - "1 << (num - 1)"和 "|="有什么作用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40551598/

10-11 19:31