DDRD |= (1<<PD7); Это означает "поставить в "1" ТОЛЬКО тот бит DDRD, который отвечает за ногу PD7 (т.е. настроить PORTD.7 на выход), а конфигурацию остальных ног порта D оставить без изменений.
PORTD &= ~(1<<PD7); А это означает "сбросить в "0" только ногу PD7, не трогая остальные ноги порта D".
В обоих примерах используются логические операции ("ИЛИ" = "|" в первом, "И" = "&" и "НЕ" = "~" во втором) вместо более очевидных операций присваивания - например, DDRD = (1<<PD7);. Такая операция тоже выставит нужный бит в "1", но зато сбросит остальные 7 бит в "0", а этого в данной ситуации как раз и не нужно.
ВЫРАЖЕНИЕ (1<<PD7) тождественно константе 0x80, т.к. символу PD7 в соответствующем .h-файле присвоено значение 7 (т.е. 1 << 7 = 0x80). Так "громоздко" пишут, во-первых, для того, чтобы не заморачиваться с запоминанием-упоминанием численных значений, а во-вторых, для того, чтобы получить требуемый результат вне зависимости от величины этого численного значения. Такая запись означает "константа, у которой в "1" установлен(ы) тот(те) бит(ы), номер(а) которого(ых) стоят справа от "<<""
|