;------------------------- Псевдокоманды управления

.include "tn2313def.inc"
.list					; Включение листинга
.equ    baudrate=0x33
.def	temp = r16		; Определение главного рабочего регистра
.def    sek = r17
.def    sek1 = r18

;------------------------- Начало программного кода

		.cseg 			; Выбор сегмента программного кода
		.org	0		; Установка текущего адреса на ноль

start:	rjmp	init	; Переход на начало программы
		reti			; Внешнее прерывание 0
		reti			; Внешнее прерывание 1
		reti			; Прерывание по захвату таймера T1
		reti        	; Прерывание по совпадению T1
		reti			; Прерывание по переполнению T1
		reti			; Прерывание по переполнению T0
		rjmp    gps 	; Прерывание UART прием завершен
		reti			; Прерывание UART регистр данных пуст
		reti			; Прерывание UART передача завершена
		reti			; Прерывание по компаратору
		reti			; Прерывание по изменению на любом контакте
		reti			; Таймер/счетчик 1. Совпадение B 
		reti			; Таймер/счетчик 0. Совпадение B 
		reti			; Таймер/счетчик 0. Совпадение A 
		reti			; USI Стартовая готовность
		reti			; USI Переполнение
		reti			; EEPROM Готовность
		reti			; Переполнение охранного таймера


; ------------------- Модуль инициализации
init:

;-------------------------- Инициализация стека
	
		ldi		temp, 0x7F	; Выбор адреса вершины стека 
		out		SPL, temp	; Запись его в регистр стека

;-------------------------- Инициализация Главного предделителя

		ldi		temp, 0x80  ; Записываем число $80 в регистр temp
		out		CLKPR, temp	; Записываем в регистр CLKPR
		ldi		temp, 0		; Записываем 0 в регистр temp
		out		CLKPR, temp	; Записываем этот ноль в CLKPR

;-------------------------- Инициализация портов ВВ
	
		ldi     temp, 0b11111111
		out     DDRB, temp
		ldi     temp, 0b01110000
		out     DDRD, temp
		
;--------------------------- Инициализация компаратора

		ldi 	temp, 0x80		; Выключение компаратора
		out		ACSR, temp

;--------------------------- Инициализация USART

        ldi     temp, high(baudrate)
		ldi     r19, low(baudrate)
		out     UBRRH, temp
		out     UBRRL, r19
        ldi     temp, 0b10010000
		out     UCSRB, temp
        ldi     temp, 0b00000110
        out     UCSRC, temp

;--------------------------- Инициализация LCD

;___Установка разрадности
    
        clr  temp
        out  PORTD, temp
        ldi  temp, 0b00111100
        out  PORTB, temp
        rcall impulse
        rcall ms4 
		
;___Установка типа курсора  

   		clr  temp
  	    out  PORTD, temp
 	    ldi  temp, 0b00001100
	    out  PORTB, temp
	    rcall impulse
		rcall ms4

;___Установка типа курсора 

	    clr  temp
	    out  PORTD, temp
	    ldi  temp, 0b00000110
  	    out  PORTB, temp
	    rcall impulse
  		rcall ms4

;___Очистка экрана

  		clr  temp
		out  PORTD, temp
	    ldi  temp, 0b00000001
	    out  PORTB, temp
	    rcall impulse
	    rcall ms4

        ldi   YL, 0x6C
   
;============ Программа ================  (Выводим на дисплей Ready)

   		ldi  temp, 0b00000000
   		out  PORTD, temp
   		ldi  temp, 0b00000001
   		out  PORTB, temp
   		rcall impulse
  		rcall ms16 
		        
		ldi  temp, 0b00010000
	    out  PORTD, temp
   		ldi  temp, 0b01010010
   		out  PORTB, temp
   		rcall impulse
  		rcall ms16 
   	
	    ldi  temp, 0b00010000
	    out  PORTD, temp
	  	ldi  temp, 0b01100101
   		out  PORTB, temp
   		rcall impulse
   		rcall ms16

   		ldi  temp, 0b00010000
   		out  PORTD, temp
   		ldi  temp, 0b01100001
  		out  PORTB, temp
   		rcall impulse
   		rcall ms16
   
   		ldi  temp, 0b00010000
   		out  PORTD, temp
   		ldi  temp, 0b01100100
   		out  PORTB, temp
  		rcall impulse
  		rcall ms16 
   
   		ldi  temp, 0b00010000
   		out  PORTD, temp
   		ldi  temp, 0b01111001
   		out  PORTB, temp
   		rcall impulse
  		rcall ms4 

   		sei
wait:   rjmp wait
:________________Обработка прерывания
gps:
  
        in   r21, UDR
   		st   Y+, r21
   		cpi  YL, 0x7C
   		brne  end
   		rjmp  endd
end:
   		reti

endd:
   		cli

   		ldi  temp, 0b00000000
   		out  PORTD, temp
   		ldi  temp, 0b00000001
   		out  PORTB, temp
		rcall impulse
   		rcall ms4

   		rcall impulse
   		rcall ms4
   
   		ldi  YL, 0x6C
nexxt:
   		ld   r21, Y
   		inc  YL
   		cpi  YL, 0x7C
   		breq  next

   		ldi  temp, 0b00010000
   		out  PORTD, temp
   		mov  temp, r21
   		out  PORTB, temp

   		rcall impulse
   		rcall ms4

   		rjmp  nexxt
next:  
        rcall ms16
		rcall ms16
		rcall ms16
		rcall ms16
		rcall ms16
		rcall ms16
		rcall ms16
		rcall ms16
		rcall ms16
		rcall ms16
		rcall ms16
		rcall ms16
		rcall ms16
		rcall ms16
		rcall ms16
   		ret



;============Формирование импульса =====

impulse:
   sbi  PORTD, 6
   nop
   nop
   nop
   cbi  PORTD, 6
   ret

;============Задержка 1 мс =============

ms1:
   ldi  sek, 0x07
zadergka1:  
   ldi  sek1, 0xC8 
metka1:
   dec  sek1
   brne metka1
   dec  sek
   brne zadergka1
   ret  

;============Задержка 4 мс =============

ms4:
   rcall ms1
   rcall ms1
   rcall ms1
   rcall ms1
   ret

;============Задержка 16 мс =============

ms16:
   rcall ms4   
   rcall ms4  
   rcall ms4  
   rcall ms4  
   ret

;============Задержка 64 мс =============
 
ms64:
   rcall ms16
   rcall ms16
   rcall ms16
   rcall ms16
   ret




