Есть два стандартных способа опроса клавиатуры с устранением дребезга контактов.
1. Интервальный. Состояние кнопок опрашивается с интервалом заведомо превышающим время дребезга. Процедуру опроса удобно запускать в каком-нибудь таймерном прерывании с периодом 10-15 мс. Если состояние клавиатуры между двумя соседними вызовами процедуры одинаково, то оно считается устойчивым.
2. Счетчик состояния. При вызове процедуры подсчитывается (программно) количество совпадений одинакового состояния клавиши. Если до окончания счета состояние меняется, то счетчик сбрасывается и перезапускается. Состояние считается устойчивым, если счетчик совпадений досчитал до заранее определенного (алгоритмически, экспериментально или интуитивно

) числа (например, 15).
Поскольку в вашем случае процедура определения состояния кнопки запускается по прерыванию от этой конопки, то думаю вам подойдет второй алгоритм.
Попробуйте такой алгоритм.
Код
#define COUNT_END 10
#define COUNT_PERIOD 15
ISR(INT2_vect)
{
int i=0, j=0;
while (i<COUNT_END)
{ if ((PINB & 0x04)==0)
{ i++;
j=0;
}
else
{ i=0;
j++;
}
if (j>COUNT_PERIOD) break;
}
PORTA ^= 1;
}