Переставил местами 169 и 170, откомпилировал с ключем -0s
Код
void SCAN_KEY(void) { //опрос кнопок
161:
162: uint8_t PORT_READ; //временыый регистр для считанного из порта
163:
164: //настройка направлений портов
165: SETBIT( DDR_KN1, KN1 ); //переводим выводы опроса
\ 01d6 BB9A sbi 55-0x20,3
166: SETBIT( DDR_KN2, KN2 ); //кнопок на выход
\ 01d8 BC9A sbi 55-0x20,4
167: SETBIT( PORT_KN2, KN2 ); //включение
\ 01da C49A sbi 56-0x20,4
168: CLEARBIT( PORT_KN1, KN1 ); //первого вывода
\ 01dc C398 cbi 56-0x20,3
169: NOP( 1 );
\ 01de 81E0 ldi r24,lo8(1)
\ 01e0 0E94 0000 call NOP
170: DATA_LCD_IO = 0;
\ 01e4 1ABA out 58-0x20,__zero_reg__
171: SETBIT( PORT_KN2, KN2 ); //включение
\ 01e6 C49A sbi 56-0x20,4
172: CLEARBIT( PORT_KN1, KN1 ); //первого вывода
\ 01e8 C398 cbi 56-0x20,3
173: PORT_READ = READ_LCD; //считывание порта
\ 01ea 89B3 in r24,57-0x20
174: if ( PORT_READ != 0xFF )
\ 01ec 8F3F cpi r24,lo8(-1)
\ 01ee B1F1 breq .L49
Вот критичное место :
Код
172: CLEARBIT( PORT_KN1, KN1 ); //первого вывода
\ 01e8 C398 cbi 56-0x20,3
173: PORT_READ = READ_LCD; //считывание порта
\ 01ea 89B3 in r24,57-0x20
Однако, Вы утверждаете, что здесь все ОК, а влияет строка 169. Есть только одно предположение - сигналы у Вас вне микроконтроллера устанавливаются медленно,
и считываете вы значения, установленные в строках 167 и 168. Тогда 169 будет влиять, поскольку время установки сигналов будет определяться задержкой NOP.
Берите в руки осциллограф, пишите тестовую программу, например переключайте ножку в 1
и 0 поочередно и смотрите прохождение сигнала.
И объявите KEY так : volatile uint8_t KEY;
С уважением.