.include "C:\avr\avrasm\appnotes\m16def.inc"
        .def      temp=R16  ;
        .def      temp1=r17 ;
        .def      temp2=r18 ;задержка
        .def      temp3=r19 ;задержка
        .def      temp4=r20 ;задержка
        .def      temp5=r21 ;
        .def      temp6=r22 ;
        .def      stroka=r23;
        .def      number=r24;
        .def      count=r25 ;
        .cseg
        .org 0
;**********-=set_intrrupt_vectors=-***********    ;прописываем в-ра прерываний
jmp RESET       ; Reset Handler
jmp EXT_INT0    ; IRQ0 Handler
jmp EXT_INT1    ; IRQ1 Handler
jmp TIM2_COMP   ; Timer2 Compare Handler
jmp TIM2_OVF    ; Timer2 Overflow Handler
jmp TIM1_CAPT   ; Timer1 Capture Handler
jmp TIM1_COMPA  ; Timer1 CompareA Handler
jmp TIM1_COMPB  ; Timer1 CompareB Handler
jmp TIM1_OVF    ; Timer1 Overflow Handler
jmp TIM0_OVF    ; Timer0 Overflow Handler
jmp SPI_STC     ; SPI Transfer Complete Handler
jmp USART_RXC   ; USART RX Complete Handler
jmp USART_UDRE  ; UDR Empty Handler
jmp USART_TXC   ; USART TX Complete Handler
jmp ADC1        ; ADC Conversion Complete Handler
jmp EE_RDY      ; EEPROM Ready Handler
jmp ANA_COMP    ; Analog Comparator Handler
jmp TWSI        ; Two-wire Serial Interface Handler
jmp EXT_INT2    ; IRQ2 Handler
jmp TIM0_COMP   ; Timer0 Compare Handler
jmp SPM1_RDY     ; Store Program Memory Ready Handler
;
;
;RESET:      ; Reset Handler
EXT_INT0:    ; IRQ0 Handler
EXT_INT1:    ; IRQ1 Handler
TIM2_COMP:   ; Timer2 Compare Handler
TIM2_OVF:    ; Timer2 Overflow Handler
TIM1_CAPT:   ; Timer1 Capture Handler
TIM1_COMPA:  ; Timer1 CompareA Handler
TIM1_COMPB:  ; Timer1 CompareB Handler
TIM1_OVF:    ; Timer1 Overflow Handler
TIM0_OVF:    ; Timer0 Overflow Handler
SPI_STC:     ; SPI Transfer Complete Handler
;USART_RXC:  ; USART RX Complete Handler
USART_UDRE:  ; UDR Empty Handler
USART_TXC:   ; USART TX Complete Handler
ADC1:        ; ADC Conversion Complete Handler
EE_RDY:      ; EEPROM Ready Handler
ANA_COMP:    ; Analog Comparator Handler
TWSI:        ; Two-wire Serial Interface Handler
EXT_INT2:    ; IRQ2 Handler
TIM0_COMP:   ; Timer0 Compare Handler
SPM1_RDY:    ; Store Program Memory Ready Handler
reti
;**********-=initialize=-************
reset:
        .macro ldiw               
        ldi @0H,high(@1)          ;инициализация стека
        ldi @0L, low(@1)          
        .endmacro                 
        ldiw    Y,RAMEND          
        out     SPL,YL            
        out     SPH,YH          
                
        ldi     temp,0x40         ;инициализация уарта 
        out     ubrrl,temp        ;9600бод, 1 стоп-бит,нет проверки чётности
                                  ;включён и приёмник и передатчик
        ldi     temp,0x00         ;кварц - 10мгц
        out     ucsrc,temp
        out     ucsra,temp
        
        ldi     temp,0x90
        out     ucsrb,temp
        
        ldi     temp,0x86
        out     ucsrc,temp
          
        
        ldi     temp,0xff         ;настройка направления портов
        out     ddrb,temp         
        out     ddrc,temp         
        ldi     temp,0x00
        out     ddra,temp
        out     ddrd,temp
        SEI
;**********-=main_part=-*************
        
        ldi     zl,low (bukv_1*2)
        ldi     zh,high (bukv_1*2)
        ldi     xl,low (0x61)
        ldi     xh,high (0x00)
        ldi     count,7           ;грузим массив с картинкой в ОЗУ
load:   lpm     temp,z+
        st      X+,temp
        dec     count
        brne    load
        
cycle:  ldi     xl,low (0x61)     ;определяем начальный адрес ОЗУ
        ldi     xh,high (0x00)
        ldi     temp6,0x80        ;начальное положение столбца  (они начинаются с 0х40)
        ldi     temp5,7           ;количтество строк
cycle1: lsr     temp6
        out     portb,temp6       ;выводим в порт б сигнал включения следующего столбца
        ld      temp,x+           ;читаем из оперативки сегмент, увеличиваем адрес
        out     portc,temp        ;выводим в порт С строку
        rcall   delay             ;вызываем задержку
        dec     temp5             ;уменьшаем счётчик
        brne    cycle1            ;если не равен 0 (не всё изображение выведено) то повторяем
        rjmp    cycle             ;если вывелось всё изображение, то перегружаемся
;***********-=sdvigl=-***********
sdvigl: cli
        ldi     count,7           ;заводим счётчик
        ldi     xl,low (0x61)     ;определяем начальный адрес ОЗУ
        ldi     xh,high (0x00)
dvigl:  ld      stroka,x          ;копируем строку из ОЗУ, сдвигаем, инкремент адреса, и так 7 раз
        rol     stroka        
        st      x+,stroka
        dec     count
        brne    dvigl
        sei
        ret
;***********-=sdvigr=-***********
sdvigr: cli
        ldi     count,7           ;заводим счётчик
        ldi     xl,low (0x61)
        ldi     xh,high (0x00)
dvigr:  ld      stroka,x          ;копируем строку из ОЗУ, сдвигаем, инкремент адреса, и так 7 раз
        ror     stroka        
        st      x+,stroka
        dec     count             ;уменьшаем счётчик на 1
        brne    dvigr             ;пока не обнулился продолжаем сдвигать строки в озу
        sei
        ret
;***********-=Delay=-***********  ;задержка
delay:  ldi     temp2,1
loop:   ldi     temp3,10
loop2:  ldi     temp4,0
wait:   dec     temp4
        brne    wait
        dec     temp3
        brne    loop2
        dec     temp2
        brne    loop
        ret 
;***********-=USART_RXC=-*****************
USART_RXC:                        ;при получении пакета по уарту сравниваем его с 4 или 6
        in      temp,udr          ;и соответственно вызываем подпрограмму сдвига вправо или влево
        andi    temp,0x0f         ;вырезаем неинтересующие  нас биты
        cpi     temp,0x04
        brne    sravn2
        rcall   sdvigl
sravn2: cpi     temp,0x06
        brne    end
        rcall   sdvigr

end:    reti  
;***********-=massivi=-************
bukv_1: .db 0b00011000,0b00111000,0b01111000,0b00011000,0b00011000,0b00011000,0b00111100,0x00           ;соответствия цифр и изображений
bukv_2: .db 0b00111100,0b01100110,0b01100110,0b00001100,0b00011000,0b00111110,0b01111110,0x00
bukv_3: .db 0b00111100,0b01100110,0b01000110,0b00011100,0b01000110,0b01100110,0b00111100,0x00
bukv_4: .db 0b00011110,0b00110110,0b01100110,0b01111111,0b01111111,0b00000110,0b00000110,0x00
bukv_5: .db 0b01111110,0b01100010,0b01000000,0b01111110,0b00000010,0b01100110,0b00111100,0x00
bukv_6: .db 0b00111100,0b01100110,0b01100000,0b01111100,0b01100110,0b01100110,0b00111100,0x00
bukv_7: .db 0b01111110,0b01100110,0b01101100,0b00011000,0b00110000,0b00110000,0b00110000,0x00
bukv_8: .db 0b00111100,0b01100110,0b01100110,0b00111100,0b01100110,0b01100110,0b00111100,0x00
bukv_9: .db 0b00111100,0b01100110,0b01100110,0b00111110,0b00001100,0b00011000,0b00110000,0x00
bukv_0: .db 0b00111100,0b01111110,0b01100110,0b01100110,0b01100110,0b01111110,0b00111100,0x00
bukv_N: .db 0b00000000,0b00000000,0b01111110,0b11111111,0b01111110,0b00000000,0b00000000,0x00