Установите один бит в 8-битном ПИН-коде, не меняя другие биты - PullRequest
1 голос
/ 01 ноября 2010

Использование winAVR для следующего кода.

Я получил 8-битный PIN-код, который мне нужен, ИЛИ с помощью 00000010 или 0x02, чтобы установить 7-й бит.

Теперь, что у менясделать следующее:

  • Установить бит B порта 7
  • Ожидать 1 мс
  • Очистить бит B порта 7
  • ждать 19 мс

НО, я не должен менять другие биты на этих шагах.

Так что я должен:

  • Считать порт B
  • Установить необходимый бит
  • записать измененное значение обратно в порт
  • Очистить биты
  • Записать обратно в порт B

Итак, мой тестовый код:

B=PINB|0x02
Loop delay for 1ms
BP=PINB&0x00
Loop for 19ms

Но я думаю, что другие биты будут изменены в этом процессе, мой вопрос: КАК я должен манипулировать одним битом 8-битного порта без изменения других битов?

Большое спасибо !!

Ответы [ 3 ]

4 голосов
/ 01 ноября 2010

Вам нужно BP=PINB & ~0x02 Оператор ~ является логическим НЕ. Оператор and сохраняет только биты , отличные от , отличные от 2.

1 голос
/ 01 ноября 2010

Вы используете побитовое отрицание маски настройки, и AND, что:

B = PINB & ~0x02

Для выбранного бита побитовое отрицание устанавливает этот бит в ноль; все остальные едины. Те, которые не изменяют значение в PINB, когда ANDed.

0 голосов
/ 01 ноября 2010

Эта страница содержит краткое изложение нескольких приемов с побитовыми операторами.http://www.catonmat.net/blog/low-level-bit-hacks-you-absolutely-must-know

...