Залил прошивку, циферка отображается, но не получается обработать нажатие кнопок. Предполагается, что при нажатию на одну кнопку, значение увеличивается, нажимая на другую - уменьшается. Но в реале, при нажатии, значение не увеличивается, а если и увеличивается то как-то через раз. Причём, на уменьшение работает, но уменьшает сразу в 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


