.include "d:\avr\avrasm\appnotes\2313def.inc"

.def     Temp=R16
.def     Temp1=R17
.def     Temp2=R18
.def     Temp3=R19
.def     Temp4=R20
.def     ResCnt=R21

.cseg
.org 0



rjmp Reset            ;вектора прерываний
rjmp INT_0
rjmp INT_1
rjmp Timer1_capt1
rjmp Timer1_comp1
rjmp Timer1_OVF1
rjmp Timer0_OVF0
rjmp UART_RX
rjmp UART_UDRE
rjmp UART_TX
rjmp ANA_COMP




;Reset:
INT_0:
INT_1:
Timer1_capt1:
;Timer1_comp1:
Timer1_OVF1:
Timer0_OVF0:
UART_RX:
UART_UDRE:
UART_TX:
ANA_COMP:
          reti
;****************************************************
; ИНИЦИАЛИЗАЦИЯ
;****************************************************
Reset:
          ldi Temp1,0           ;задержка запуска после сброса
          ldi Temp2,0

l_res:
          dec Temp1
          brne l_res

          dec Temp2
          brne l_res

          inc ResCnt            ;инкремент счетчика сбросов

          ldi Temp,0b11111111   ;настройка портов
          out DDRB,Temp

          ldi Temp,0b01000000   ;разрешить прерывание компаратора
          out TIMSK,Temp

          ldi Temp,0b00000011   ;тактовый сигнал = CK/64
          out TCCR1B,Temp

          ldi Temp,0x4C         ;инициализация компаратора
          out OCR1AH,Temp
          ldi Temp,0x4B
          out OCR1AL,Temp

          ldi Temp,RamEnd       ;установка указателя стека
          out SPL,Temp

          ldi Temp1,0           ;инициализация индикатора

          ldi Temp,0            ;обнуление таймера
          out TCNT1H,Temp
          out TCNT1L,Temp

          sei                   ;разрешить прерывания


;****************************************************
; ОСНОВНОЙ ЦИКЛ
;****************************************************
Inf:	rjmp Inf              ;бесконечный цикл


;****************************************************
; ОБРАБОТЧИК ПРЕРЫВАНИЯ КОМПАРАТОРА
;****************************************************

Timer1_comp1:


         ldi Temp,0            ;обнуление таймера
         out TCNT1H,Temp
         out TCNT1L,Temp


SelectArray:                    ;выбор массива

         andi ResCnt,0b00000011  ;отсечка лишних разрядов сч. сбросов

         cpi ResCnt,0           ;сравнение счетчика сбросов с конст.
         brne Tst1              ;если не равно - след. проверка
         ldi ZH,High(Array0*2)  ;загрузка начального адреса массива
         ldi ZL,Low(Array0*2)
         rjmp ReadArray

Tst1:    cpi ResCnt,1
         brne Tst2
         ldi ZH,High(Array1*2)
         ldi ZL,Low(Array1*2)
         rjmp ReadArray

Tst2:    cpi ResCnt,2
         brne Tst3
         ldi ZH,High(Array2*2)
         ldi ZL,Low(Array2*2)
         rjmp ReadArray

Tst3:    ldi ZH,High(Array3*2)
         ldi ZL,Low(Array3*2)
         rjmp ReadArray


ReadArray:

         ldi Temp,0            ;прибавление относит. адреса
         add ZL,Temp1
         adc ZH,Temp

         lpm                   ;загрузка из ПЗУ

         mov Temp,R0           ;копирование в РОН
         cpi Temp,0            ;пороверка на нулевой элемент
         breq Init
         inc Temp1             ;увеличение относит адреса на 1

         rjmp Output           ;перейти на вывод в порт

Init:    ldi Temp1,0           ;загрузить нач. значение
         rjmp SelectArray

Output:  out PortB,Temp        ;вывод в порт

         reti                  ;выход из обработчика



Array0:
.db  0b10000000,0b01000000
.db  0b00100000,0b00010000
.db  0b00001000,0b00000100
.db  0b00000010,0b00000001
.db  0,0

Array1:
.db   0b01010101,0b00101010
.db   0b01010101,0b00101010
.db   0b01010101,0b00101010
.db   0b01010101,0b00101010
.db   0b01010101,0b00101010
.db   0b01111111,0b00001000
.db   0b01111111,0b00001000
.db  0,0

Array2:
.db   0b01110000,0b01110000
.db   0b00000111,0b00000111
.db   0b01110000,0b01110000
.db   0b00000111,0b00000111
.db   0b01110000,0b00111000
.db   0b00011100,0b00001110
.db  0,0

Array3:
.db   0b01110000,0b00111000
.db   0b00011100,0b00001110
.db   0b00000111,0b00000011
.db   0b00000001,0b00000000
.db  0,0