3) void BUT_Init(void)
1. DDRX_BUTTON &= ~(MASK_BUTTONS);
тоже что и выражение DDRX_BUTTON =DDRX_BUTTON & (~(MASK_BUTTONS));
~ - побитная инверсия. Т.е. сначала инвертируем MASK_BUTTONS (а оно = 0b01110000). ~0b01110000 = 0b10001111
Проводим операцию ПОБИТОВОЕ И с DDRX_BUTTON и сохраняем результат в DDRX_BUTTON.
Т.е. DDRA = DDRA & 0b10001111. Здесь результат зависит от значения регистра DDRA
2.PORT_BUTTON |= MASK_BUTTONS;
тоже что и выражение PORT_BUTTON = PORT_BUTTON | MASK_BUTTONS;
Т.е. PORTA = PORTA | 0b10001111
Цитата(Nixon83 @ Oct 19 2011, 12:54)

Понятно а как дальше работает эта схема, для чего вообще нужна маска????
void BUT_Init(void) // что мы получаем здесь? Если можно тоже в двоичном коде???
{
DDRX_BUTTON &= ~(MASK_BUTTONS);
PORT_BUTTON |= MASK_BUTTONS;
}
с авр не работал, но по логике:
С помощью маски устанавливаешь в регистре DDRA 3 ножки PORTА (4,5,6) на вход для анализа состояния кнопок.
В регистре PORTA устанавливаешь соответствующие биты в 1.