.include "m16def.inc";Используем Мегу16

;======================================================
#define F_CPU (8000000)
;Здесь идёт определение тактовой частоты. Нужно для 
;библиотеки задержек,используемой в этой либе. 
;Частота в Герцах.
;======================================================

ldi r16,low(RAMend)
out SPL,r16
ldi r16,high(RAMend)
out SPH,r16
;Инициализация стека. Обязательно!!!
;------------------------------------------------------

rcall lcd_init;Инициализация дисплея.

;------------------------------------------------------

ldi r16, 'T'       ; Выводим на дисплей строчку
rcall LCD_WriteData; "Test hd44780"

ldi r16, 'e'
rcall LCD_WriteData

ldi r16, 's'
rcall LCD_WriteData


ldi r16, 't'
rcall LCD_WriteData

ldi r16, ' '
rcall LCD_WriteData

ldi r16, 'H'
rcall LCD_WriteData

ldi r16, 'D'
rcall LCD_WriteData

ldi r16, '4'
rcall LCD_WriteData

ldi r16, '4'
rcall LCD_WriteData

ldi r16, '7'
rcall LCD_WriteData

ldi r16, '8'
rcall LCD_WriteData

ldi r16, '0'
rcall LCD_WriteData


ldi r16,0b01010000
rcall LCD_WriteCommand
;Первые два байта 01 - код команды, а последующие - 
;Адрес в двоичке. К примеру, 000001 - означает 1.
;000010 - 2. В данном случае адрес = 16(2-й символ)
;Всего у нас 64 байта памяти.
;Каждый байт кодирует содержимое одной строки точек
;Размер символа у нас 5Х8, пожтому строчек 8, то есть, для того,
;Чтобы кодировать один символ нам понадобится 8 сток = 8 байт памяти.
;Старшие три бита каждой строки не используются.
;А всего в памяти может быть 8 символов(64/8).

;При записи в память символа нужно указывать адрес последней строчки 
;Символа(64-0), а при выводе  - адрес символа. Он может быть от 0 до 8
;Опять же - в двоичке.

;В данном случае адрес посл. строчки = 16, следовательно адрес символа = 2 

;После передачи команды нужно передать содержание строчек, вот оно:
;(Помним, что первые три бита не используются) 

ldi r16,0b00000001
rcall LCD_WriteData

ldi r16,0b00000010
rcall LCD_WriteData

ldi r16,0b00000100
rcall LCD_WriteData

ldi r16,0b00001000
rcall LCD_WriteData

ldi r16,0b00011111
rcall LCD_WriteData

ldi r16,0b00000010
rcall LCD_WriteData

ldi r16,0b00000100
rcall LCD_WriteData

ldi r16,0b01000000
rcall LCD_WriteData

;Всё, запись содержания строчек закончена. Далее посылаем команду
; Установки адреса в  DDRAM на 1 позицию.

ldi r16,0b10000000
rcall LCD_WriteCommand

ldi r16,14;Выводить символ будем на 14-ю позицию
rcall Lcd_SetAddressDD

ldi r16,0b00000010; А тут выводим символ на дисплей.
rcall LCD_WriteData

;Поскольку адрес конца строчек = 16, адрес символа  = 2(10 в двоичке);

;Переводить символы из двоички в десятучку можно при помощи инженерного 
;Калькулятора в Windows.


;------------------------------------------------------

ldi r16,0x40
rcall LCD_SetAddressDD
; Переходим ко второй строке, поэтому запись будем
; начинать с 40-го адреса

;------------------------------------------------------

ldi r16, 'R'        ;Выводим на дсплей строчку с 
rcall LCD_WriteData; адресом моего сайта :)))

ldi r16, 'a'
rcall LCD_WriteData

ldi r16, 'd'
rcall LCD_WriteData

ldi r16, 'i'
rcall LCD_WriteData

ldi r16, 'o'
rcall LCD_WriteData

ldi r16, 'e'
rcall LCD_WriteData

ldi r16, 'l'
rcall LCD_WriteData

ldi r16, 'e'
rcall LCD_WriteData

ldi r16, 'k'
rcall LCD_WriteData

ldi r16, 't'
rcall LCD_WriteData

ldi r16, 'r'
rcall LCD_WriteData

ldi r16, '.'
rcall LCD_WriteData

ldi r16, 'r'
rcall LCD_WriteData

ldi r16, 'u'
rcall LCD_WriteData

;------------------------------------------------------



main:


;В главном цикле мы ничего не делаем.

rjmp main


;------------------------------------------------------



.include "hd44780.asm"; Подключение библиотеки для
                      ; работы с дисплеем.
