Объясните этот код относительно настройки порта AVR - PullRequest
1 голос
/ 26 мая 2011

Что делает следующее?

PORTB = (PORTB & ~0xFC) | (b & 0xFC);
PORTD = (PORTD & ~0x30) | ((b << 4) & 0x30);

AFAIK, 0xFC - это шестнадцатеричное значение.Это в основном говорит 11111100, следовательно, PORTD0-PORTD1 являются выходами, а остальные являются входами.

Каким будет полное объяснение этого кода?

Ответы [ 2 ]

4 голосов
/ 26 мая 2011

PORTB = (PORTB & ~ 0xfc) |(b & 0xfc);

Разбивка:

PORTB = PORTB & ~0xFC

0xFC =  1111 1100
~0xFC = 0000 0011

PORTB = PORTB & 0000 0011

Выбирает два младших бита PORTB.

b & 0xFC

0xFC = 1111 1100

Выбирает верхний6 битов b.

ИЛИ их вместе, PORTB будет содержать шесть старших бит b и два младших бита PORTB.

PORTD = (PORTD &~ 0x30) |((b << 4) & 0x30); </p>

Разбивка:

PORTD = PORTD & ~0x30

0x30  = 0011 0000
~0x30 = 1100 1111

PORTD = PORTD & 11001111

Выбирает все, кроме 4-го и 5-го (считая от 0) битов PORTD

(b << 4) & 0x30

Рассмотрим b как поле битов:

b = b7 | b6 | b5 | b4 | b3 | b2 | b1 | b0

b << 4 = b3 b2 b1 b0 0 0 0 0

0x30 = 0011 0000

(b << 4) & 0x30 = 0 0 b0 b1 0 0 0 0

ИЛИ две части вместе, PORTD будет содержать 0-й и 1-й биты b в своих 4-м и 5-м битахи исходные значения PORTD в остальном.

0 голосов
/ 26 мая 2011

Первая строка фактически устанавливает состояние линий порта PB7-PB2.Текущее состояние PORTB сначала маскируется с использованием ~0xFC = 0x03, поэтому все биты, кроме 0 и 1, сбрасываются.

Вторым шагом является маскирование b с использованием 0xFC, поэтому биты 0 и 1 всегда равны 0. Затем значения объединяются в единицу ИЛИ.По сути, он устанавливает PB7-PB2 из b [7] .. b [2], сохраняя текущее состояние PB1 и PB0 нетронутым.

Обратите внимание, что биты регистра PORTB служат различным целям в зависимости от выводанаправление настроено через регистр DDRB.Для выходных контактов он просто контролирует состояние контактов.Для входных контактов PORTB управляет подтягивающим резистором контакта.Вы должны включить этот подтягивающий резистор, если, например, у вас есть кнопка, подключенная между контактом и землей - таким образом, входной контакт не плавает, когда переключатель разомкнут.

...