Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование на ассемблере для PIC2.doc
Скачиваний:
16
Добавлен:
01.05.2025
Размер:
1.27 Mб
Скачать

Пример 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, и дальнейшего выполнения программы по одному из двух сценариев. Здесь более интеллектуальный подход к работе в отличии от предыдущего примера, где задача решалась прямолинейно.