Нажатие кнопки, что я делаю не так?
Добавлено: Пн июн 08, 2015 20:05:30
Доброго времени суток, играюсь с ПИКом, подключил к нему 3-х цифровой семисегментный индикатор(на порт B) и пару кнопок(порт А: RA0 и RA1).
Залил прошивку, циферка отображается, но не получается обработать нажатие кнопок. Предполагается, что при нажатию на одну кнопку, значение увеличивается, нажимая на другую - уменьшается. Но в реале, при нажатии, значение не увеличивается, а если и увеличивается то как-то через раз. Причём, на уменьшение работает, но уменьшает сразу в 0, а не на 1 как предполагается. Далее код, прошу посмотреть, всё ли в порядке в плане организации работы с кнопкой как таковой, а то может у меня код не правильный в принципе. Порт А от кнопок подтянул к плюсу через резисторы в 5кОм. Может из-за дребезга такое, может какую-нибудь задержку добавить перед проверкой значения порта?
P.S. Так же хочу сделать проверку на то, чтобы величина счётчика попадала в диапазон от 0 до 9(чтобы в обработчике не увеличивали счётчик больше необходимого). Погуглил на предмет примера кода, как организовать условие, но так ничего и не понял, xor, sublw - какие-то шаманства с вычитанием или ксором, объясните на пальцах, как организовываются сравнения? 
Залил прошивку, циферка отображается, но не получается обработать нажатие кнопок. Предполагается, что при нажатию на одну кнопку, значение увеличивается, нажимая на другую - уменьшается. Но в реале, при нажатии, значение не увеличивается, а если и увеличивается то как-то через раз. Причём, на уменьшение работает, но уменьшает сразу в 0, а не на 1 как предполагается. Далее код, прошу посмотреть, всё ли в порядке в плане организации работы с кнопкой как таковой, а то может у меня код не правильный в принципе. Порт А от кнопок подтянул к плюсу через резисторы в 5кОм. Может из-за дребезга такое, может какую-нибудь задержку добавить перед проверкой значения порта?
Код: Выделить всё
list p=16f84a
include "p16f84.inc"
__config _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC
COUNT_REG equ 0x0d ; регистр, в котором хранится отображаемое число
org 0x00
clrwdt
goto init
init:
bsf STATUS, RP0
; чтобы горели индикаторы, порт В ставим на выход,
; порт А - первые выводы на вход(для кнопок), остальное на выход
clrf TRISB
movlw b'00000011'
movwf TRISA
bcf STATUS, RP0
; изначально включим все разряды индикатора
movlw b'11111111'
movwf PORTB
; используется 3 разрядный индикатор, зажгем только первый разряд
movlw b'00011011'
movwf PORTA
; инициализируем значение счётного регистра
movlw 0x3
movwf COUNT_REG
main_loop:
; проверяем нажатие кнопок, увеличиваем/уменьшаем значение счётчика
btfss PORTA, 0
call inc_count
btfss PORTA, 1
call dec_count
; выводим значение счётчика на индикатор
movfw COUNT_REG
call load_digit
movwf PORTB
goto main_loop
inc_count:
; if COUNT_REG < 0x9 then increase
incf COUNT_REG, F
return
dec_count:
; if COUNT_REG > 0x0 then decrease
decf COUNT_REG, F
return
load_digit:
addwf PCL, F
retlw b'00111111' ; 0
retlw b'00000110' ; 1
retlw b'01011011' ; 2
retlw b'01001111' ; 3
retlw b'01100110' ; 4
retlw b'01101101' ; 5
retlw b'01111101' ; 6
retlw b'00000111' ; 7
retlw b'01111111' ; 8
retlw b'01101111' ; 9
retlw b'01000000' ; -
end