;=======================================================
; Проект 11. Статический 7-сегментный индикатор
; ATmega8, 8 МГц. Индикатор с ОБЩИМ КАТОДОМ на PB0..PB6
; Таблица сегментов хранится во flash, читается командой lpm
;=======================================================
.include "m8def.inc"
.def    temp = r16
.def    digit= r17
.def    d1   = r18
.def    d2   = r19
.def    d3   = r20

.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              ; PB0..PB6 — сегменты
        out     DDRB, temp
        clr     digit

MAIN:
        ldi     ZL, low(SEGTAB<<1)      ; адрес таблицы в байтах
        ldi     ZH, high(SEGTAB<<1)
        add     ZL, digit               ; смещение на нужную цифру
        clr     temp
        adc     ZH, temp
        lpm     temp, Z                 ; читаем код сегментов
        out     PORTB, temp
        rcall   DELAY1S
        inc     digit
        cpi     digit, 10
        brne    MAIN
        clr     digit
        rjmp    MAIN

DELAY1S:
        ldi     d3, 40
T3:     ldi     d2, 255
T2:     ldi     d1, 255
T1:     dec     d1
        brne    T1
        dec     d2
        brne    T2
        dec     d3
        brne    T3
        ret
