;=======================================================
; Проект 24. Секундомер 00..99 с кнопкой «пуск/стоп»
; PIC16F84A, 4 МГц
; Сегменты RB0..RB6, разряды RA0/RA1, кнопка RA2
;=======================================================
        LIST    p=16F84A
        #include <p16f84a.inc>
        __CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF

        cblock  0x0C
        d1, tens, ones, loops, run
        endc

        ORG     0x000
        goto    Start

Table
        addwf   PCL,f
        retlw   b'00111111'
        retlw   b'00000110'
        retlw   b'01011011'
        retlw   b'01001111'
        retlw   b'01100110'
        retlw   b'01101101'
        retlw   b'01111101'
        retlw   b'00000111'
        retlw   b'01111111'
        retlw   b'01101111'

Start
        bsf     STATUS,RP0
        clrf    TRISB
        movlw   b'00000100'     ; RA2 — вход (кнопка)
        movwf   TRISA
        bcf     STATUS,RP0
        clrf    tens
        clrf    ones
        clrf    run             ; 0 — стоп, 1 — счёт

Main
        movlw   .100            ; ~1 секунда индикации
        movwf   loops
Show
        call    Digits
        call    CheckKey
        decfsz  loops,f
        goto    Show

        movf    run,w           ; если стоим — не считаем
        btfsc   STATUS,Z
        goto    Main
        incf    ones,f
        movf    ones,w
        xorlw   .10
        btfss   STATUS,Z
        goto    Main
        clrf    ones
        incf    tens,f
        movf    tens,w
        xorlw   .10
        btfsc   STATUS,Z
        clrf    tens
        goto    Main

Digits
        bcf     PORTA,1
        movf    tens,w
        call    Table
        movwf   PORTB
        bsf     PORTA,0
        call    Delay5ms
        bcf     PORTA,0
        movf    ones,w
        call    Table
        movwf   PORTB
        bsf     PORTA,1
        call    Delay5ms
        return

CheckKey
        btfsc   PORTA,2
        return
        call    Delay5ms        ; антидребезг
        btfsc   PORTA,2
        return
        movlw   .1
        xorwf   run,f           ; пуск/стоп
WaitRel
        btfss   PORTA,2
        goto    WaitRel
        return

Delay5ms
        movlw   .250
        movwf   d1
D5      nop
        nop
        nop
        nop
        nop
        decfsz  d1,f
        goto    D5
        return

        END
