Цитата(Nixon83 @ Oct 19 2011, 11:52)

#define MASK_BUTTONS ((1<<DOWN)|(1<<UP)|(1<<ENTER)) // обясните это выражение в двоичном коде
Не понимаю, что значит "объяснить в двоичном коде"...
Выражение вида (1<<X) в языке Си означает сдвиг единицы влево на Х разрядов. Т.е. получаем результат: единица в разряде Х, а остальные разряды - ноль.
Например, (1<<DOWN). Выше определено, что DOWN то же самое, что и 4. Т.е. это то же сомое, что (1 << 4), или единица сдвинутая влево на четыре разряда (00010000).
Аналогично с остальными частями выражения.
Все три части побитово складываются (побитовое ИЛИ), и получаем результат, где в разрядах 4,5 и 6 единицы, а в остальных - нули (01110000).
Цитата(Nixon83 @ Oct 19 2011, 11:52)

#define BitIsClear(reg, bit) ((reg & (1<<(bit))) == 0) // обясните это выражение в двоичном коде
Выше было объяснено (1 << (bit) ). Затем reg побитово умножается (побитовое И) на число с единицей в бите bit и остальными нулями, и получаем результат: в бите bit тот же бит, что был в reg, а остальные биты - нули. Это число сравнивается с нулём и получаем "истина/ложь". Таким образом BitIsClear(reg, bit) - истина, если бит bit числа reg равен нулю, и ложь в противном случае.
Цитата(Nixon83 @ Oct 19 2011, 11:52)

void BUT_Init(void) // что мы получаем здесь? Если можно тоже в двоичном коде???
{
DDRX_BUTTON &= ~(MASK_BUTTONS);
PORT_BUTTON |= MASK_BUTTONS;
}
Выражение типа A &= B, эквивалентно А= А & B. Операция & - побитовое И, ~ - побитовая инверсия (т.е. 0 -> 1, 1 -> 0). Первое выражение очищает (сбрасывает в ноль) все биты DDRX_BUTTON для которых в MASK_BUTTONS установлены единицы (т.е. биты 4,5,6), остальные биты DDRX_BUTTON остаются неизменными.
Второе выражение, напротив, в PORT_BUTTON устанавливает биты в единицу, для которых в MASK_BUTTONS установлены единицы (т.е. биты 4,5,6), остальные биты - остаются неизменными