你能告诉我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);
}
答案 0 :(得分:3)
<<
向左移位。二进制uint16_t
的{{1}}为1
,因此当您向左移动数量0b0000000000000001
时,结果为ledNumber-1
,其中包含一位数到uint16_t
指定的位置。
从变量名ledNumber
开始,我猜这个函数设置了一个特定的LED来处理。
ledNumber
对传递的两个操作数执行按位OR。
例如,
|
如果查看byte b = 0x0A | 0x50;
和0x0A
的基础位,它们分别为0x50
和0b00001010
。与OR运算符结合使用时,0b01010000
中的结果为b
,或十六进制为0b01011010
。
0x5A
是一个按位OR赋值。 |=
类似于|=
和+=
之类的运算符,因为它将对两个操作数执行按位OR,然后将结果存储在左运算符中。
-=
答案 1 :(得分:2)
cppreference - Arithmetic operators救援
按位移位运算符表达式具有形式
lhs&lt;&lt; rhs(1)
lhs&gt;&gt; rhs(2)
1)由rhs位左移lhs 2)通过rhs位右移lhs
因此1 << (ledNumber - 1)
将最低有效位向左移动,例如如果ledNumber = 5
0x0001 << (5 - 1)
将成为
0x0010
另外cppreference - Assignment operators
|=
是(按位OR)赋值运算符,其中
*ledsAddress |= convertLedNumberToBit(ledNumber);
相当于
*ledsAddress = *ledsAddress | convertLedNumberToBit(ledNumber);
答案 2 :(得分:2)
要在I / O端口ledsAddress
处切换“LED”LED [ledNumber],必须将等效位设置为“1”。但是,在更改I / O端口值时,您必须保持所有其他LED的状态仍为“ON”。
convertLedNumberToBit(int ledNumber)
使用掩码b0000000000000001
(16位)通过切换到(ledNumber-1)的左侧将ledNumber位设置为'1'{当ledNumber为1时不需要移位< / p>
Ex:(ledNumber = 4)=&gt;返回值为b0000000000001000
= 0x0008
。
然后调用|= convertLedNumberToBit(ledNumber)
将仅强制将ledNumber位置为'1'而不用二进制OR来改变其他位。
例如:(led1,led3&amp; led7为'ON')
在OR b0000000001000101
= 0x0045
之前。
LedDriver_TurnOn(4)=&gt; b0000000000001000
= 0x0008
在OR之后b0000000001001101
= 0x004D
。
要将相同的LED切换为“OFF”,您只需通过NOT掩码的AND功能替换OR功能。
void LedDriver_TurnOff(int ledNumber)
{
*ledsAddress &= ~(convertLedNumberToBit(ledNumber));
}