Тоже в свое время "многа думаль". Додумался вот до чего:
1. Структуры и объединения с битовыми полями

это не я додумался, конечно
Код
typedef struct
{
unsigned flag1:1;
unsigned flag2:1;
} flagset_t;
union Tflags
{
flagset_t bits;
uint8_t byte;
} flags;
// получается
flags.byte =0;
flags.bits.flag1 = 0;
Обратите внимание, что биты выделяются от младшего к старшему
2. Это все конечно хорошо, но до тех пор, пока у нас нет обращения к периферии. Поскольку работа с битовыми полями в описании потрохов МК не прижилась, нет смысла упорствовать, сочинять типы для "красоты текста" и для портов лучше применять _BV и иже с ними. Лично меня не плющит написАть (1<<bit_name)
ЗЫ (bit_mask << bit_mask_offset) тоже частенько встречаются.