Цитата(_Артём_ @ Jul 25 2012, 15:53)

Потому что в правой части выражения две volatile-переменных: PIND и PINB.
Можете заменить:
Код
unsigned char pind=PIND, pinb=PINB;
unsigned short data = (unsigned short)( (pind & 0xF3) | ((pinb & 0x06)<<1) );
и предупреждение исчезнет.
+1 за этот вариант.
Зафиксируете состояние пинов в текущий момент и будуту владеть более-менее актуальной информацией о них в текущий момент.
Запрещать варнинги связанные с предупреждениями о доступе к volatile-переменным не стоит. Они для того и созданы чтобы программист задумался о том, что некоторые переменные могут изменится (напрю в прерывании или другим неизвестным компилятору образом), пока идёт обработка различных сложных условий, приведённых в первом посте. Вместо PINB/D запросто могут быть переменные, значение которых изменяется в прерываниях. И если забыть о том что могут быть изменения значений переменных подобного рода, то можна напороться на необъяснимые поведения программы.