Биты из отдельных регистров могут быть объединены любым необходимым способом с использованием побитовых операторов:
& – Bitwise AND
| – Bitwise OR
~ – Bitwise NOT
^ – Bitwise XOR
<< – Left Shift
>> – Right Shift
Несколько расплывчатая запись " PD7..PD0PB0 " предполагает, что PB0 - это LSB или значение веса. В этом случае, учитывая:
PORTD DDDDDDDD
PORTB xxxxxxxB
, то:
uint16_t weight = ((uint16_t)PORTD << 1u) | (PORTB & 0x01) ;
приведет к значению weight
, составленному из битов:
0000000DDDDDDDDB
Подвыражение ((uint16_t)PORTD << 1u)
сдвигает значение PORTD влево на 1 бит:
0000000DDDDDDDD0
(PORTB & 0x01)
все нули, кроме бита-0, оставляя бит-0 без изменений:
0000000B
Затем два подвыражения разбиваются на биты ИЛИ:
0000000DDDDDDDD0
OR 0000000B
----------------
= 0000000DDDDDDDDB
Обратите внимание, что можно (с точки зрения безопасности) упростить задачу, используя только 8-битное значение в PORTD и уменьшая вдвое предельные значения. В настоящее время у вас есть: "выше 5, но ниже 70" , если вы просто прочитаете PORTD, пределы будут 3> = PORTD <35 </em>. На самом деле это может быть безопаснее - при чтении одного значения из двух отдельных регистров необходимо быть уверенным, что у вас есть значения для одного и того же образца, и что значение в первом считанном регистре не изменилось до того, как вы прочитали второй. Если в регистре PORTB будет только один младший бит, это окажет незначительное влияние, но также сделает его ограниченным по значению, если только данные не зафиксированы во время чтения.