Выбор подпрограммы с помощью кнопки
Программа обработки нажатия кнопки
Данная статья предназначена для радиолюбителей, еще только делающих первые шаги в программировании микроконтроллеров PIC. И является ответом на пожелание подробнее осветить алгоритм переключения двух подпрограмм одной кнопкой в зависимости от времени ее нажатия/отпускания.
Бывают ситуации, когда для достижения определенных опций устройств на микроконтроллерах не хватает свободных выводов портов ввода/вывода. И тогда приходится на одну кнопку возлагать выполнение нескольких функций. Данная подпрограмма обработки состояния кнопки в зависимости от времени ее нажатия, взята из программы микроконтроллера PIC16F676, который применен в устройстве амперметра – «Амперметр цифровой c коррекцией показаний на INA226 ». На рисунке ниже показан участок схемы с кнопкой.
В данной схеме кнопка подключена к RA4.
Внизу дан исполняемый код обработки состояния кнопки, с помощью которого осуществляется переход в подпрограмму Minus или Plus.
;---------------------------------------;
Knopka btfsc KEY1 ;
goto Dalee ;
call mS_25
btfss KEY1
goto $-2
;---------------------------------------;
; Обработка времени нажатия кнопки
; В программу задержки внедрена проверка
; состояния кнопки
select_time call mS_25
btfsc KEY1 ; Ждем нажатия кнопки
goto $-2
;----------------
pauza Movlw .173
movwf Reg_1
movlw .19
movwf Reg_2
movlw .6
movwf Reg_3
;------------------
decfsz Reg_1,F
goto $-1
btfsc KEY1 ; Проверка кнопки
GOTO Plus ; Кнопку отпустили - идем на Плюс
decfsz Reg_2,F ;
goto $-5
decfsz Reg_3,F
goto $-7
;---------------------------------------;
Minus ... ; Уменьшение
Plus ... ; Увеличение
Подпрограмма начинается с метки Knopka. Активной функцией кнопки в данном случае является ее отпускание. Это сделано для предотвращения ложных срабатываний из-за шумов и помех, наводимых на элементы схемы. Выполняя инструкцию btfsc, программа проверяет логический уровень на входе. Если на входе логическая единица, то в соответствии с этой инструкцией программа исполняет команду goto Dalee и уходит далее по своим делам. Если на входе ноль, то активная область программы игнорирует последующую команду и переходит к исполнению инструкции call – задержки на 25мс. Т.е. если кнопку не отпускать, то программа после паузы, и выполнения инструкции btfss будет переходить на goto и далее вернется опять на паузу. Как только кнопка будет отпущена, программа проигнорирует goto $-2 и перейдет на метку select_time. И так кнопка отпущена, на входе KEY1 присутствует логическая единица — программа вошла в подпрограмму селекции работы по времени. Далее идет блок из трех команд называемый – ждем нажатия кнопки. Как только в очередной раз будет нажата кнопка, программа перейдет на метку pauza.
С этой метки начинается подпрограмма задержки величиной равной примерно одной секунде. В код подпрограммы задержки внедрены инструкции: btfsc KEY1 и GOTO Plus — проверки состояния кнопки и перехода на подпрограмму Plus. Таким образом, если мы нажмем на кнопку позже одной секунды, то активная область программы начнет выполнение подпрограммы Minus. Если кнопка будет нажата в течение выполнения инструкций подпрограммы задержки, то по команде GOTO программа перейдет на выполнение подпрограммы Plus.
На этом все, ниже можно скачать файл подпрограммы в формате asm.