В конструкции else-if последнее условие никогда не будет проверяться, поскольку первый тест PIND & (1<<PD2)
также будет истинным. Также неправильное использование &&
в третьем тесте.
Еще одна проблема заключается в том, что вы читаете PIND
несколько раз. Для обеспечения согласованности вы должны прочитать его один раз и проверить прочитанное значение.
Сначала вы можете проверить третье условие (обе кнопки), но на самом деле это не нужно. Вся конструкция может быть заменена на:
uint8_t buttons = PIND ;
flag = 0 ;
if( buttons & (1<<PD2) )
{
flag |= 1;
}
if( buttons & (1<<PD3) )
{
flag |= 2 ;
}
Или, возможно, более кратко:
flag = ( buttons & (1<<PD2) ) ? 1 : 0 ;
flag |= ( buttons & (1<<PD3) ) ? 2 : 0 ;
Тогда, когда оба будут нажаты, флаг будет 1 | 2
, что 3
.
Даже это, вероятно, не нужно; Вы можете просто использовать скрытое значение PIND непосредственно в коммутаторе. Это решение уже было опубликовано @ user58697.