попробуйте так:
Код: Выделить всё
volatile unsigned char KEY = 0; // глобальная переменная, содержащая код нажатой кнопки
void interrupt... {// дальше как там ваше прерывание зовется
static unsigned char oldkey = 0;
unsigned char tmp;
tmp = PIND; // здесь идет опрос порта
// лишние биты надо маскировать и инвертировать (для удобства)
tmp = ~(tmp & 0x07); // допустим, кнопки подключены к трем младшим разрядам
if(tmp){
// только если код нажатой кнопки не ноль (т.е. хоть что-то нажато
if(oldkey){
// если предыдущий код не ноль
if(oldkey == tmp){
// если предыдущее значение равно текущему - установим код кнопки
KEY = oldkey;
}
oldkey = key; // иначе запомним текущее значение
} else {
oldkey = 0;
KEY = 0;
}
}
в основном цикле время от времени проверяйте значение
KEY и, если оно не равно нулю, обрабатывайте ее значение, как код нажатых кнопок (каждая кнопка - бит)
P.S. Писал сгоряча, возможно, где-то напортачил. тем более что писать в форуме код очень неудобно. главная идея: в прерывании смотрим на пины кнопок. если обнаруживаем, что есть нажатие, то, смотрим в переменную
oldkey, которая хранит ПРЕДЫДУЩЕЕ нажатое состояние. если текущее состояние совпадает с предыдущим, значит как минимум 1/400 секунды кнопка нажата - можно вернуть этот код (так давим дребезг). если текущее не равно предыдущему - запоминаем текущее, как предыдущее, но при этом значение
KEY не меняем, считая, что еще не ясно - вдруг дребезг? если ничего не нажато - обнуляем
KEY.