;=======================================================
; Проект 24. Секундомер 00..99 с кнопкой «пуск/стоп»
; ATmega8, 8 МГц. Сегменты PB0..PB6, разряды PD0/PD1, кнопка PD2
;=======================================================
.include "m8def.inc"
.def    temp  = r16
.def    tens  = r17
.def    ones  = r18
.def    loops = r19
.def    run   = r20
.def    d1    = r21
.def    d2    = r22

.cseg
.org    0x0000
        rjmp    RESET

SEGTAB: .db 0b00111111, 0b00000110, 0b01011011, 0b01001111, 0b01100110
        .db 0b01101101, 0b01111101, 0b00000111, 0b01111111, 0b01101111

RESET:
        ldi     temp, low(RAMEND)
        out     SPL, temp
        ldi     temp, high(RAMEND)
        out     SPH, temp
        ldi     temp, 0x7F
        out     DDRB, temp
        ldi     temp, 0x03
        out     DDRD, temp              ; PD0,PD1 — разряды; PD2 — вход
        sbi     PORTD, PD2              ; подтяжка кнопки
        clr     tens
        clr     ones
        clr     run

MAIN:
        ldi     loops, 100              ; ~1 секунда
SHOW:
        rcall   DIGITS
        rcall   CHECK_KEY
        dec     loops
        brne    SHOW

        tst     run                     ; счёт разрешён?
        breq    MAIN
        inc     ones
        cpi     ones, 10
        brne    MAIN
        clr     ones
        inc     tens
        cpi     tens, 10
        brne    MAIN
        clr     tens
        rjmp    MAIN

DIGITS:
        cbi     PORTD, PD1
        mov     temp, tens
        rcall   SEG
        out     PORTB, temp
        sbi     PORTD, PD0
        rcall   DELAY5MS
        cbi     PORTD, PD0
        mov     temp, ones
        rcall   SEG
        out     PORTB, temp
        sbi     PORTD, PD1
        rcall   DELAY5MS
        ret

CHECK_KEY:
        sbic    PIND, PD2
        ret
        rcall   DELAY5MS
        sbic    PIND, PD2
        ret
        ldi     temp, 1
        eor     run, temp               ; пуск/стоп
K_REL:  sbis    PIND, PD2
        rjmp    K_REL
        ret

SEG:
        ldi     ZL, low(SEGTAB<<1)
        ldi     ZH, high(SEGTAB<<1)
        add     ZL, temp
        clr     temp
        adc     ZH, temp
        lpm     temp, Z
        ret

DELAY5MS:
        ldi     d2, 52
E2:     ldi     d1, 255
E1:     dec     d1
        brne    E1
        dec     d2
        brne    E2
        ret
