В твоем варианте программа зациклена не правильно - выполняется рекурсивно функция port() поэтому и ломается.
Должно быть примерно так:
...........
.........
// эта штука называется основной цикл.
// алгоритм программы живет именно здесь.
// все остальные функции служат для реализации частных задач.
// именно по этому он называется MAIN - главный.
void main(void)
{
init(); // ну, понятно, инициализация
for(;;) // крутимся тут всегда
{
port(); // собственно задача, ради которой все и затевалось

}
}
void port(void)
{
temp=PINA; // читаем кнопки
switch (temp)
{
case 0xFE : PORTB=0x01; delay_ms(20); break; // кнопка 1
case 0xFD : PORTB=0x02; delay_ms(20); break; // кнопка 2
case 0xFB : PORTB=0x04; delay_ms(20); break; // кнопка 3
case 0xF7 : PORTB=0x08; delay_ms(20); break; // кнопка 4
case 0xFF:PORTB=0x00; delay_ms(20); break; // если не нажато ни
//одной тушим лампочки
default: break; // неизвестная или не нужная комбинация
//кнопок - ничего не делаем
}
}
void init(void)
{
PORTA=0x00; //подтягивается внешне к +
DDRA=0x00; // на ввод
PORTB=0x00; // выключаем - лампочки.
DDRB=0xFF; //
}