;подпрограмма предварительной обработки значений от кнопок inpkey: in r16,_pind ;читаем порт bst r16,7 clc rol r16 bld r16,0 ldi r17,$0f and r16,r17 ;выделяем нужные разряды eor r16,r17 ;инвертируем выделенные разряды ret ;подпрограмма опроса кнопок key: sbic _gpior0,6 ;проверяем признак нажатия на кнопку rjmp keyotp ;если уже была нажата - на ож отпускания ;секция нажатия ldi r16,5 ;время определения нажатия mov r10,r16 ;в счетчик прерываний key1: rcall inpkey ;ввод состояния cpi r16,0 ;ничего не нажато - выход breq keyex or r10,r10 ;время закончилось? brne key1 ;нет -назад ;кнопка нажата key3: sbi _gpior0,6 ;устанавливаем признак нажатия ret ;секция выхода из пп при отпущенной кнопке keyex: cbi _gpior0,6 ;сбрасыв признак нажатия cbi _gpior0,7 ;сбрасыв признак автоповтора clr r16 ret ;секция отпускания keyotp: sbic _gpior0,7 ;проверка признака автоповтора rjmp autop ;переход на автоповтор ldi r16,30 ;время до автоповтора mov r10,r16 ;в счетчик прерываний key2: rcall inpkey ;опрос cpi r16,0 ;уже отпустили - выход breq keyex or r10,r10 ;счетчик досчитал? brne key2 ;нет - назад ;секция авоповтора autop: ldi r16,3 ;частота автоповтора mov r10,r16 ;в счетчик key4: rcall inpkey ;опрос cpi r16,0 ;отпустили? breq keyex ;нет - выход or r10,r10 ;проверяем счетчик? brne key4 ;не досчитал- назад key5: sbi _gpior0,7 ;устанавливаем признак rjmp key3