Пример 5. Кнопка в режиме переключателя. АнтидребезгВо многих устройствах требуется работа кнопки в режиме переключателя, т.е. одно нажатие приводит к одному устойчивому состоянию, а следующее нажатие к другому устойчивому состоянию. Сделаем постановку задачи: первым нажатием включить только верхний сегмент индикатора, следующим нажатием – только нижний сегмент.
Рассмотрим программу
LIST P=PIC16F84A
__CONFIG H3FF1
STATUS EQU H0003
PORTA EQU H0005
PORTB EQU H0006
TRISA EQU H0005
TRISB EQU H0006
Reg_1 EQU H000C
Reg_2 EQU H000D
Reg_3 EQU H000E
org 0 ; начало программы
; подготовительные моменты
bsf STATUS,5 ; переход в Банк 1
movlw b00011111
movwf TRISA
clrf TRISB
bcf STATUS,5 ; переход назад в Банк 0
clrf PORTB ; очистка порта
; отслеживание нажатия кнопки
m1 btfsc PORTA,2 ; бит-проверка ножки RA2
goto m1
m2 btfss PORTA,2 ; бит-проверка ножки RA2
goto m2 ; отслеживаем отжатие кнопки
movlw b01000000
movwf PORTB
call Pause
m3 btfsc PORTA,2 ; бит-проверка ножки RA2
goto m3
m4 btfss PORTA,2 ; бит-проверка ножки RA2
goto m4 ; отслеживаем отжатие кнопки
movlw b00000010
movwf PORTB
call Pause
goto m1
;delay = 250000 machine cycles
Pause movlw .169
movwf Reg_1
movlw .69
movwf Reg_2
movlw .2
movwf Reg_3
wr decfsz Reg_1, F
goto wr
decfsz Reg_2, F
goto wr
decfsz Reg_3, F
goto wr
return
end ; конец программы
Далее текст прошивки:
:020000040000FA
:1000000083161F3085008601831286010519062894
:10001000051D082840308600152005190D28051DEE
:100020000F280230860015200628A9308C004530A4
:100030008D0002308E008C0B1B288D0B1B288E0B25
:040040001B28080071
:02400E00F13F80
:00000001FF
Это наиболее простой подход к реализации кнопки в режиме переключателя. Однако, программа требует некоторых комментарий.
После нажатия кнопки осуществляется процедура проверки "отжатия" кнопки. Это нужно для того, чтобы "затормозить" ход выполнения программы. Каким бы быстрым и коротким не было наше нажатие на кнопку, программа в любом случае успеет сделать несколько циклов своей работы (1 млн. операций в секунду).
Кроме этого, мы видим вставку сегмента паузы. Пауза длительностью 0,25 сек позволяет нам избежать явление дребезга контактов, которое ведет к ложным срабатываниям. Не сложно предположить, что в секунду мы не сможем сделать больше четырех нажатий на кнопку, поэтому такая длительность оправдана.
Следует отметить, что проверка "отжатия" и наличие паузы для подавления дребезга определяется каждым конкретным случаем. Например, проверка "отжатия" не нужна, если требуется непрерывное увеличение (уменьшение) значения какого либо регистра (аналогия с кнопками громкости на пульте дистанционного управления). Что касается наличия паузы для подавления явления дребезга, то здесь нужно оценивать длительность времени для выполнения дальнейшего кода программы. В большинстве случаев такая пауза не нужна.
Для самостоятельного рассмотрения предлагаю модифицированный фрагмент программы.
; отслеживание нажатия кнопки
m1 btfsc PORTA,2 ; бит-проверка ножки RA2
goto m1
m2 btfss PORTA,2 ; бит-проверка ножки RA2
goto m2
btfsc PORTB,6
goto m3
goto m4
m3 movlw b00000010
movwf PORTB
call Pause
goto m1
m4 movlw b01000000
movwf PORTB
call Pause
goto m1
Принцип основан на проверке содержимого порта B, и дальнейшего выполнения программы по одному из двух сценариев. Здесь более интеллектуальный подход к работе в отличии от предыдущего примера, где задача решалась прямолинейно.
|