.include "d:\avr\avrasm\appnotes\tn2313def.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,0b00000010   ;тактовый сигнал = CK/64
          out TCCR1B,Temp

          ldi Temp,0x3A         ;инициализация компаратора
          out OCR1AH,Temp
          ldi Temp,0x98
          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  0b01000000,0b00100000
.db  0b00010000,0b00001000
.db  0b00000100,0b00000010
.db  0b01000001,0b00100000
.db  0b00010000,0b01001000
.db  0b00100100,0b00010010
.db  0b01001001,0b00100100
.db  0b01010010,0b00101001
.db  0b01010100,0b00101010
.db  0b01010101,0b01101010
.db  0b01110101,0b01111010
.db  0b01111101,0b01111111
.db  0b00000000,0b01111111
.db  0b00000000,0b01111111
.db  0b00000000,0b01111111
.db  0b00000000,0b01000000
.db  0b00100000,0b00010000
.db  0b00001000,0b00000100
.db  0b00000010,0b00000001
.db  0b01000001,0b00100001
.db  0b00010001,0b00001001
.db  0b00000101,0b00000011
.db  0b01000011,0b00100011
.db  0b00010011,0b00001011
.db  0b00000111,0b01000111
.db  0b00100111,0b00010111
.db  0b00001111,0b01001111
.db  0b00101111,0b00011111
.db  0b01011111,0b00111111
.db  0b01111111,0b01111111
.db  0b01111110,0b01111101
.db  0b01111100,0b01111010
.db  0b01111001,0b01111000
.db  0b01110100,0b01110010
.db  0b01110001,0b01110000
.db  0b01101000,0b01100100
.db  0b01100010,0b01100001
.db  0b01100000,0b01010000
.db  0b01001000,0b01000100
.db  0b01000010,0b01000001
.db  0b01000000,0b00100000
.db  0b00010000,0b00001000
.db  0b00000100,0b00000010
.db  0b00000001,0b01000000
.db  0b00000011,0b01110000
.db  0b00001111,0b01111100
.db  0b00111111,0b01111111
.db  0b00000000,0b01111111
.db  0b00000000,0b01111111
.db  0b00000000,0b01111111
.db  0b00111110,0b00011100
.db  0b00001000,0b01111111
.db  0b01000001,0b00100010
.db  0b00010100,0b00001000
.db  0b00010100,0b00100010
.db  0b01000001,0b00000000
.db  0b00000001,0b00000011
.db  0b00000111,0b00001111
.db  0b00011111,0b00111111
.db  0b01111111,0b01111110
.db  0b01111100,0b01111000
.db  0b01110000,0b01100000
.db  0,0

Array1:
.db  0b00100010,0b00010100
.db  0,0

Array2:
.db  0b10000010,0b01000100
.db  0b00101000,0b00010000
.db  0b00101000,0b01000100
.db  0b10000010,0,0

Array3:
.db  0b01000000,0b00001000
.db  0b00100000,0b00000010
.db  0b00010000,0b00000100
.db  0b00001000,0b00000001
.db  0b00100000,0b00001000
.db  0b01000000,0b00000100
.db  0b00010000,0b00000010
.db  0b00001000,0b00000001
.db  0,0