;**********************ПРОГРАММА ДЛЯ ИЗУЧЕНИЯ LCD HD44780**************************
;Тактовая частота - 4МГц (int RC,start-up time 14CK+65mc) или 8 МГц - всё работает
;CKDIV-8 (да,нет -работает);SPIEN (да, не менять)
;программа выводит 8 символов "0"  на индикатор     WH-1601A-YYE-CTK ; 
;ИНТЕРФЕЙС - 4 ЛИНИИ;
.include"tn2313def.inc"
.def temp=r16; рабочий регистр
.def temp1=r17; рабочий регистр 1
.def prm1=r18;  передаваемый параметр 1
.def tim1=r19;  счетчик цикла 1
.def tim2=r20;  счетчик цикла 2
.equ E=PORTD2; назначаем линию PD2 для формирования сигнала E
.equ RW=PORTD3;назначаем линию PD3 для формирования сигнала RW: 0-запись, 1- чтение
.equ RS=PORTD4;назначаем линию PD4 для формирования сигнала RS
.equ BF=PORTB7;назначаем линию PB7 для чтения флага занятости BF
;******************************ПРЕРЫВАНИЯ********************************
rjmp INITIAL
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
;*************************ИНИЦИАЛИЗАЦИЯ***********************************
INITIAL:
ldi r31, low(ramend);инициализация указателя стека для AVR, имеющих 
out spl,r31; программный  стек, обязательно выполняется в начале программы
ldi temp, 0b00000000;программирование порта B: все линии -входы;*
out ddrb,temp; *
ldi temp, 0b1111111;программирование порта D: все линии - выходы*
out ddrd,temp; *
rcall InitLCD; инициализируем ЖК-модуль*
;-------------------------------------------------------------------------
;************************ ГЛАВНАЯ ПРОГРАММА ******************************
Haupt:
ldi prm1,$0C;Включаем табло, отключаем курсор, отключаем мерцание
rcall WaitBusy; ожидаем готовности ЖК-модуля к приему
rcall SendCom1_2Byte; отправка команды на ЖК-модуль полубайтом
ldi prm1,$01; Очищаем табло, курсор - в начало
rcall WaitBusy; ожидаем готовности ЖК-модуля к приему
rcall SendCom1_2Byte; отправка команды на ЖК-модуль полубайтом
rcall WaitBusy; ожидаем готовности ЖК-модуля к приему*********
rcall OutText1; выводим текст1
rcall WaitBusy; ожидаем готовности ЖК-модуля к приему
rcall OutText2; выводим текст2
rcall WaitBusy; ожидаем готовности ЖК-модуля к приему
rcall OutText3; выводим текст3
rcall WaitBusy; ожидаем готовности ЖК-модуля к приему
rcall OutText4; выводим текст4
rcall WaitBusy; ожидаем готовности ЖК-модуля к приему
rcall OutText5; выводим текст5
rcall WaitBusy; ожидаем готовности ЖК-модуля к приему
rcall OutText6; выводим текст6
rcall WaitBusy; ожидаем готовности ЖК-модуля к приему
rcall OutText7; выводим текст7
rcall WaitBusy; ожидаем готовности ЖК-модуля к приему
rcall OutText8; выводим текст8
nnn:
rjmp nnn
;****************************ИНИЦИАЛИЗАЦИЯ ЖК-МОДУЛЯ**********************
InitLCD:
rcall Wait38ms; *
rcall Wait38ms; 
rcall Wait38ms; **
rcall Wait38ms; *
rcall Wait38ms; 
rcall Wait38ms; **
ldi prm1,$30;установка функции 8 разрядов   1-й раз.....*
rcall SendCom1Byte; отправка команды на ЖК-модуль одним байтом!*
rcall Wait5ms; 
ldi prm1,$30;установка функции 8 разрядов   2-й раз.....*
rcall SendCom1Byte; отправка команды на ЖК-модуль одним байтом! *
rcall Wait150us; 
ldi prm1,$30;установка функции 8 разрядов   3-й раз.....*
rcall SendCom1Byte; отправка команды на ЖК-модуль одним байтом! *

;rcall WaitBusy; ожидаем готовности ЖК-модуля к приему
ldi prm1,$20;установка функции 4 разрядов   * 
rcall SendCom1Byte; отправка команды на ЖК-модуль одним байтом!*

rcall WaitBusy; ожидаем готовности ЖК-модуля к приему*
ldi prm1,$20;установка функции 4 разрядов*
rcall SendCom1_2Byte; отправка команды на ЖК-модуль*

rcall WaitBusy; ожидаем готовности ЖК-модуля к приему*
ldi prm1,$20;шина -4 разряда, 1 строчное табло,матрица 5х8*******
rcall SendCom1_2Byte; отправка команды на ЖК-модуль полубайтом*

rcall WaitBusy; ожидаем готовности ЖК-модуля к приему*
ldi prm1,0b00001000;отключение табло,курсора, мерцания*
rcall SendCom1_2Byte; отправка команды на ЖК-модуль полубайтом*

rcall WaitBusy; ожидаем готовности ЖК-модуля к приему*
ldi prm1,0b00000001; очищаем табло*
rcall SendCom1_2Byte; отправка команды на ЖК-модуль полубайтом*

rcall WaitBusy; ожидаем готовности ЖК-модуля к приему*
ldi prm1,0b00000110;режим инкремента адреса,без сдвига*
rcall SendCom1_2Byte; отправка команды на ЖК-модуль полубайтом*

ret
;--------------------------------------------------------------------------

;********** ПОДПРОГРАММА ОЖИДАНИЯ ГОТОВНОСТИ ЖК-МОДУЛЯ  *******************
WaitBusy:
ldi temp, 0b00000000;программирование порта B: все линии - входы
out ddrb,temp; 
cbi PORTD,RS; устанавливаем RS=0 (команда);
sbi PORTD,RW;Направление - чтение из ЖК-модуля
WB1:
sbi PORTD,E;подаём импульс разрешения
nop; небольшая
nop;           задержка
in temp1,PINB; считываем ст. полубайт в temp1 (в D7 содержится флаг BF)
nop; небольшая
nop;           задержка
cbi PORTD,E;снимаем импульс разрешения
nop; небольшая
nop;           задержка
sbi PORTD,E; подаём импульс разрешения
nop; небольшая
nop;           задержка
in r0,PINB; считываем младший полубайт в некий своободный регистр (r0),
;т.к. состояние этого полубайта нам не важно
nop; небольшая
nop;           задержка
cbi PORTD,E;снимаем импульс разрешения
nop; небольшая
nop;           задержка
sbrc temp1,BF;пропускаем следующую команду, если ЖК-модуль готов (BF=0)
rjmp WB1
cbi PORTD,RW; Направление записи - в ЖК-модуль
nop; небольшая
nop;           задержка
ldi temp, 0b11111111;программирование порта B:все линии -выходы
out ddrb,temp;
ret
;--------------------------------------------------------------------------

;--------------------------------------------------------------------------
;****************** ПОДПРОГРАММА ПЕРЕДАЧИ КОМАНДЫ В ЖК-МОДУЛЬ *************
SendCom1_2Byte:
ldi temp, 0b11110000;программирование порта B:PB0-PB3-входы; PB4-PB7-выходы
out ddrb,temp;
cbi PORTD,RS; устанавливаем RS=0 (команда);
cbi PORTD,RW;Направление - запись в ЖК-модуль
rcall Ausgabe1_2Byte
ret
;--------------------------------------------------------------------------

;--------------------------------------------------------------------------
;****************** ПОДПРОГРАММА ПЕРЕДАЧИ КОМАНДЫ В ЖК-МОДУЛЬ *************
SendCom1Byte:
ldi temp, 0b11110000;программирование порта B:PB0-PB3-входы; PB4-PB7-выходы
out ddrb,temp;
cbi PORTD,RS; устанавливаем RS=0 (команда);
cbi PORTD,RW;Направление - запись в ЖК-модуль
rcall Ausgabe1Byte
ret
;--------------------------------------------------------------------------

;****************** ПОДПРОГРАММА ПЕРЕДАЧИ ДАННЫХ В ЖК-МОДУЛЬ *************
SendDat:
ldi temp, 0b11110000;программирование порта B:PB0-PB3-входы; PB4-PB7-выходы
out ddrb,temp; 
sbi PORTD,RS; устанавливаем RS=1 (данные);
cbi PORTD,RW;Направление - запись в ЖК-модуль
rcall Ausgabe1_2Byte
ret
;--------------------------------------------------------------------------
;********************** ПОДПРОГРАММА Ausgabe1_2Byte ***********************
Ausgabe1_2Byte:
out PORTB,prm1;выдача команды/данных в порт B
nop; небольшая
nop;           задержка

sbi PORTD,E;подаем импульс разрешения
nop; небольшая
nop;           задержка
cbi PORTD,E;снимаем импульс разрешения
swap prm1
nop; небольшая
nop;           задержка

out PORTB,prm1;выдача команды/данных в порт B
sbi PORTD,E;подаем импульс разрешения
nop; небольшая
nop;           задержка
cbi PORTD,E;снимаем импульс разрешения
nop; небольшая
nop;           задержка

clr prm1;*******
ldi temp, 0b00000000;программирование порта B: все линии - входы
out ddrb,temp; 

ret
;--------------------------------------------------------------------------

;--------------------------------------------------------------------------
;********************** ПОДПРОГРАММА Ausgabe1Byte *************************
Ausgabe1Byte:
out PORTB,prm1;выдача команды/данных в порт B
nop; небольшая
nop;           задержка

sbi PORTD,E;подаем импульс разрешения
nop; небольшая
nop;           задержка
cbi PORTD,E;снимаем импульс разрешения
clr prm1
nop; небольшая
nop;           задержка
ret
;--------------------------------------------------------------------------

;********************** ПОДПРОГРАММА ВЫВОДА 1 СИМВОЛА *********************
OutText1:
ldi prm1,$30; вывод "0"
rcall WaitBusy; ожидаем готовности ЖК-модуля к приему
rcall SendDat; Передаем символ
ret
OutText2:
ldi prm1,$30; вывод "0"
rcall WaitBusy; ожидаем готовности ЖК-модуля к приему
rcall SendDat; Передаем символ
ret
OutText3:
ldi prm1,$30; вывод "0"
rcall WaitBusy; ожидаем готовности ЖК-модуля к приему
rcall SendDat; Передаем символ
ret
OutText4:
ldi prm1,$30; вывод "0"
rcall WaitBusy; ожидаем готовности ЖК-модуля к приему
rcall SendDat; Передаем символ
ret
OutText5:
ldi prm1,$30; вывод "0"
rcall WaitBusy; ожидаем готовности ЖК-модуля к приему
rcall SendDat; Передаем символ
ret
OutText6:
ldi prm1,$30; вывод "0"
rcall WaitBusy; ожидаем готовности ЖК-модуля к приему
rcall SendDat; Передаем символ
ret
OutText7:
ldi prm1,$30; вывод "0"
rcall WaitBusy; ожидаем готовности ЖК-модуля к приему
rcall SendDat; Передаем символ
ret
OutText8:
ldi prm1,$30; вывод "0"
rcall WaitBusy; ожидаем готовности ЖК-модуля к приему
rcall SendDat; Передаем символ
ret
;--------------------------------------------------------------------------

;********************** ПОДПРОГРАММЫ ЗАДЕРЖКИ *****************************
Wait50us: ; задержка 50мкс
ldi tim1,65; загрузка счетчика
Wait51:
dec tim1
brne Wait51
ret
Wait150us: ; задержка 150мкс
rcall Wait50us
rcall Wait50us
rcall Wait50us
ret

Wait5ms: ; задержка 5мс
ldi tim2,100; загрузка счетчика
Wait501:
rcall Wait50us
dec tim2
brne Wait501
ret

Wait38ms: ; задержка 38мс
ldi tim2,0; загрузка счетчика
Wait381:
rcall Wait150us
dec tim2
brne Wait381
ret

