Pilot
Отмечучь и я, чисто в рекомендательном плане.
Уберите
goto в коде поста №31, оно там ни к чему вообще,
while(1) и так выполнится с первой строчки, если не сработает ни одно условие, при этом желательно в конце
while поставить небольшую задержку (~100мс), если планируете использовать какие-то дополнительные процедуры.
И я б, честно, подобные строки
if(PORTB3==1 && PORTB0==1 && PORTB1==1)
заменил бы на
if (PORTB==0b00001011)
Почему? Да потому что оператор
if выполнится всего один раз вместо 5

Ну или для полноты понимания, при помощи
define создайте варианты необходимых условий. Вы хоть код понимать будете ну и помочь будет легче вновь читающим.
К примеру
#define VAR0 0b00001011
if (PORTB==VAR0)...
или
if (PORTB & VAR0)...
что полностью заменяет
if(PORTB3==1 && PORTB0==1 && PORTB1==1) и облегчает чтение.
Этим разгрузите код и вероятно облегчите жизнь дебугеру.
Конечно, если так можно, а пятой точкой ощущаю, что можно наврняка.
Kino, к стати, правильно подсказывает, насчет отдельной процедуры, но по опыту работы с контроллерами, я б нестал использовать такие тяжелые формы как
case, от этого легче не станет, а код усложнит и займет на порядок больше тактов, описанный выше мною вариант более применим к контроллерам, со статическмими условиями регулятора.