Цитата(Shadovv13 @ Jun 21 2011, 20:55)

ВСЕ ЗАРАБОТАЛО!!!!!
Прошу прощения, проглядел SBRS/SBRC в подпрограммах e00-e11.
В Вашей программе обработка состояний энкодера выполняется за два хода, первый-второй. Номер хода(условно) хранится во флаге Т, а состояние первого хода сохраняется в виде адреса подпрограммы в ZH:ZL.
Энкодер для МК - очень медленное устройство, за время между изменениями состояния энкодера могут выполниться миллионы инструкций. Неужели ZH:ZL нигде более не используется в Вашей программе? Если используется, то приходится многократно сохранять/восстанавливать два регистра. Кстати, если забыли сохранить Z, то это причина переполнения стека, т.к. ICALL выполняется неизвестно куда.
Зачем? Ведь можно хранить всего лишь 2 бита - предыдущее состояние энкодера, не используя уникальную пару ZH:ZL.
И зачем обрабатывать изменения энкодера за два хода? ведь любой из двух сигналов с него может перескочить 1/0 или 0/1 и вернуться обратно (от помехи или если энкодер находится на границе переключения). Не нужно считать первый-второй, можно каждое изменение считать сразу "вторым ходом". Далее, считываем текущее значение, сопоставляем его с предыдущим, решаем что нужно сделать: +1,-1, или ничего. Затем текущее состояние энкодера переместить в "предыдущее" и ждать новых изменений.