.include "tn2313def.inc" ; Attiny2313, 1 MHz clock
.cseg
.org 0
rjmp reset
;********************************************************************
reset: 
ldi r16, low (RAMEND) ; Инициализация стека МК
out SPL, r16
rcall lcd_init ; Инициализация дисплея
;********************************************************************
lcd_init:
ldi r16, 0b10000000 ; PUD>>1
out MCUCR, r16
ldi r16, 0b11111111 ; Настройка порта B
out ddrb, r16
ldi r16, 0b00000111 ; Настройка порта D
out ddrd, r16
;********************************************************************
ldi r16, 0b00000000 ; Адресация IR
ldi r17, 0b00110000 ; Установка разрядности Data line
rcall delay_20000mks ; Пауза перед инициализацией lcd
rcall write_lcd ; Запись данных в lcd
rcall delay_40mks ; Задержка перед выполнением операций с lcd
rcall write_lcd ; Запись данных в lcd
rcall delay_40mks ; Задержка перед выполнением операций с lcd
rcall write_lcd ; Запись данных в lcd
rcall delay_40mks ; Задержка перед выполнением операций с lcd
ldi r17, 0b00111000 ; Установка параметров lcd 
rcall write_lcd ; Запись данных в lcd
rcall delay_40mks ; Задержка перед выполнением операций с lcd
ldi r17, 0b00001000 ; Выключение дисплея
rcall write_lcd ; Запись данных в lcd
rcall delay_40mks ; Задержка перед выполнением операций с lcd
ldi r17, 0b00000001 ; Очистка дисплея
rcall write_lcd ; Запись данных в lcd
rcall delay_1500mks ; Задержка перед выполнением операций с lcd
ldi r17, 0b00000110 ; Установка режима ввода данных
rcall write_lcd ; Запись данных в lcd
rcall delay_40mks ; Задержка перед выполнением операций с lcd
ret ; Выход из подпрограммы
;********************************************************************
delay_20000mks:
ldi r18, 0b10110010 ; Ввод переменной задержки
ldi r19, 0b00000101 ; Настройка предделителя
rjmp init_delay
delay_1500mks:
ldi r18, 0b11111010 ; Ввод переменной задержки
ldi r19, 0b00000101 ; Настройка предделителя
rjmp init_delay
delay_40mks:
ldi r18, 0b11011000 ; Ввод переменной задержки
ldi r19, 0b00000010 ; Настройка предделителя
init_delay:
out TCNT0, r18 ; Инициализация TCNT0
out TCCR0B, r19 ; Старт T0
test_TIFR:
in r18, TIFR ; Чтение TIFR
sbrs r18, 1 ; Переход, если "Переполнение T0"
rjmp test_TIFR ; Бесконечная проверка TOV0
ldi r20, 0b00000000 ; Остановка T0
out TCCR0B, r20
ldi r20, 0b00000010 ; Загрузка TOV0>>0
out TIFR, r21
ret ; Выход из подпрограммы
;********************************************************************
write_lcd:
out portd, r16 ; Установка значения линии RS
out portb, r17 ; Вывод байта данных DB0-DB7
nop ; Защита от шумов на линии стробирования
sbi portd, 2 ; E>>1
nop ; Защита от шумов на линии стробирования
cbi portd, 2 ; E>>0
nop ; Защита от шумов на линии стробирования
ret ; Выход из подпрограммы
;********************************************************************
user_write_IR:
ldi r16, 0b00000000 ; Адресация IR
rcall write_lcd ; Запись данных в lcd
rcall delay_40mks ; Задержка перед выполнением операций с lcd
ret ; Выход из подпрограммы
;********************************************************************
user_write_DR:
ldi r16, 0b00000001 ; Адресация DR
rcall write_lcd ; Запись данных в lcd
rcall delay_40mks ; Задержка перед выполнением операций с lcd
ret ; Выход из подпрограммы
;********************************************************************
lcd_clear:
ldi r16, 0b00000000 ; Адресация IR
ldi r17, 0b00000001 ; Очистка дисплея
rcall write_lcd ; Запись данных в lcd
rcall delay_1500mks ; Задержка перед выполнением операций с lcd
ret ; Выход из подпрограммы
;********************************************************************
