Так и делал, на 3 ножку подавал напряжение от 0,5 до 4,5 вольта, на индикаторе даже и следа нет что там есть строки. Молчит, гад, хоть убей!vitalik_1984 писал(а): Для начала просто подайте питание реостатом добейтесь отчетливого изображения первой строки, потом уже что то с кодом проверять можно.
Работа с ЖКИ на контроллере HD44780 и его аналогах
- Adagumer
- Поставщик валерьянки для Кота
- Сообщения: 2286
- Зарегистрирован: Чт ноя 15, 2012 20:47:59
- Откуда: Крымск
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
- Реклама
- Adagumer
- Поставщик валерьянки для Кота
- Сообщения: 2286
- Зарегистрирован: Чт ноя 15, 2012 20:47:59
- Откуда: Крымск
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Добил я проблему с зажиганием индикатора. Оказалось всё банально просто, напряжение контрастности должно быть в пределах от 0 до 0,5 вольта. При 0 полностью зачернённый экран, при 0,45 V видны кое где элементы выводимых символов, нормальная контрастность при 0,18 вольта. Даже тот дисплей который изначально думал шо спалил , перепутав полярность питания, жив.
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Прочитайте пару последних страниц, дело в том, что напряжение для кристаллов берется с плюса и пина контраста, но никак не с общего.Поэтому такие непонятки возникают.В даташите это все прекрасно описано.То есть если написано, что нормальное рабочее напряжение lcd 4,2 вольта, то при рабочем напряжении 3,3 в получается, что нужно подавать отрицательное напряжение на этот контакт 3,3-4,2=-1,1 вольт.
В случае 5ти вольт 5-4,2=0,8
все полученные результаты относительно общего провода- GND.
В случае 5ти вольт 5-4,2=0,8
все полученные результаты относительно общего провода- GND.
- Adagumer
- Поставщик валерьянки для Кота
- Сообщения: 2286
- Зарегистрирован: Чт ноя 15, 2012 20:47:59
- Откуда: Крымск
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Каюсь языками не владею. Спасибо за внятное разъяснение.vitalik_1984 писал(а):В даташите это все прекрасно описано.
-
tux
- Первый раз сказал Мяу!
- Сообщения: 36
- Зарегистрирован: Чт сен 20, 2012 11:57:28
- Откуда: Владивосток
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Не могли бы знатоки ткнуть носом где у меня ошибка?
Подключение 4-битное. На дисплей вроде как выводится что то, но те символы, что хочу вывести- постоянно мигают, и кроме того вылазит какой то мусор на дисплей.
Начал только осваивать avr, поэтому сильно не пинайте..
Спойлер
Код: Выделить всё
.include "m16def.inc" ; ATMega16
//--------------------------------
.DSEG
.def temp=R16
.equ LCD_PORT = PORTA
.equ LCD_DDR = DDRA
.equ LCD_PIN = PINA
.equ D4 = 0
.equ D5 = 1
.equ D6 = 2
.equ D7 = 3
.equ RS = 4
.equ EN = 5
//---------------------------------
//-----------------------------------------------
.CSEG
.ORG $0000
RJMP INIT
//Инициализация МК-------------------------------
INIT:
//Инициализация стека----------
ldi r16,low(RAMend)
out SPL,r16
ldi r16,high(RAMend)
out SPH,r16
//-----------------------------
//Инициализация дисплея
RCALL LCD_INIT
RCALL WAIT_20ms
OUT_LCD:
LDI temp, 'A'
RCALL WrData
RCALL WAIT_50us
LDI temp, '7'
RCALL WrData
RCALL WAIT_50us
//------------------------------------------------
//Подпрограммы------------------------------------
//---------------------------------
LCD_INIT:
sbi LCD_DDR, D4 ;Ножки порта на выход
sbi LCD_DDR, D5
sbi LCD_DDR, D6
sbi LCD_DDR, D7
sbi LCD_DDR, RS
sbi LCD_DDR, EN
cbi LCD_PORT, RS ;оистить значение RS, EN
cbi LCD_PORT, EN
RCALL WAIT_50us
RCALL MAIN_LCD_INIT ;Начальная инициализация
RCALL WAIT_1ms
RCALL MAIN_LCD_INIT ;вызывается
RCALL WAIT_1ms
RCALL MAIN_LCD_INIT ;три раза
RCALL WAIT_1ms
SBI LCD_PORT, EN ;начало строба
NOP
LDI temp, 0b00000010 ;установить разрядность интерфейса (4 бита)
OUT LCD_PORT, temp
CBI LCD_PORT, EN ;конец строба
RCALL WAIT_50us ;задержка
LDI temp, 0x28
RCALL WrCom
NOP
LDI temp, 0x01
RCALL WrCom
RCALL WAIT_1ms
NOP
LDI temp, 0x06
RCALL WrCom
NOP
RET
//----------------------------------
MAIN_LCD_INIT:
SBI LCD_PORT, EN ;начало строба
NOP
LDI temp, 0b00000011 ;установить разрядность интерфейса
OUT LCD_PORT, temp
NOP
CBI LCD_PORT, EN ;конец строба
RCALL WAIT_50us ;задержка
RET
//----------------------------------
WrCom: ;Запись команды
CBI LCD_PORT, RS
NOP
RJMP Wr
WrData: ;Запись данных
SBI LCD_PORT,RS
Wr: ;Записать в дисплей
PUSH R16
SWAP R16
SBI LCD_PORT, EN
NOP
OUT LCD_PORT, temp
CBI LCD_PORT, EN
RCALL WAIT_50us
POP R16
SBI LCD_PORT, EN
OUT LCD_PORT, temp
CBI LCD_PORT, EN
RCALL WAIT_50us
RET
//----------------------------------
WAIT_20ms: ;Расчет делался в программе
LDI R18,104 ;калькуляторе AVR DELAY LOOP
LDI R19,228
L1:
DEC R19
BRNE L1
DEC R18
BRNE L1
RET
//----------------------------------
WAIT_1ms: ;Расчет делался в программе
LDI R18,6 ;калькуляторе AVR DELAY LOOP
LDI R19,48
L3:
DEC R19
BRNE L1
DEC R18
BRNE L3
RET
//----------------------------------
WAIT_50us:
LDI R18,66
L2:
DEC R18
BRNE L2
NOP
RET
Начал только осваивать avr, поэтому сильно не пинайте..
- Реклама
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Неужели так и нужно?
Или всё таки вместо L1 нужно L3?
Код: Выделить всё
//----------------------------------
WAIT_1ms: ;Расчет делался в программе
LDI R18,6 ;калькуляторе AVR DELAY LOOP
LDI R19,48
L3:
DEC R19
BRNE L1
DEC R18
BRNE L3
RETЭтот пост оказался полезен? Не поленись, нажми
слева!

Куплю индикаторы ИТС-1А, ИТС-1Б, ИГВ1-8х5Л, ИГПС1-222/7, ИГПС1-111/7 и подобные.
слева!Куплю индикаторы ИТС-1А, ИТС-1Б, ИГВ1-8х5Л, ИГПС1-222/7, ИГПС1-111/7 и подобные.
-
tux
- Первый раз сказал Мяу!
- Сообщения: 36
- Зарегистрирован: Чт сен 20, 2012 11:57:28
- Откуда: Владивосток
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Да, спасибо, конечно опечатка. Попровил- не помогло. Также попробовал поменять как по даташиту сначала вывод данных, потом лишь стробирующий импульс (было НАЧАЛО СТРОБА -> ВЫВОД ДАННЫХ -> КОНЕЦ СТРОБА как подсмотрел в готовых библиотеках). Тоже не помогло. Стало в правом верхнем углу мигают три паралельных полоски, и хаотично мигают черные квадритики.
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
У Вас происходит срыв стека. Попробуйте
Нет времени для установления на линиях данных и защёлкиванием их в индикаторе
Код: Выделить всё
LDI temp, '7'
RCALL WrData
RCALL WAIT_50us
STOP:
RJMP STOP
//------------------------------------------------
//Подпрограммы------------------------------------
//---------------------------------
LCD_INIT:
Код: Выделить всё
OUT LCD_PORT, temp
NOP
NOP
NOP
CBI LCD_PORT, EN ;конец строба-
tux
- Первый раз сказал Мяу!
- Сообщения: 36
- Зарегистрирован: Чт сен 20, 2012 11:57:28
- Откуда: Владивосток
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Не помогло. Стала либо мигающий курсор показывать в начале строки, либо три паралельные палки, либо вопрос в конце. При этом, если сделать так:
то во всех строчкаx начинают гореть "7t7t7t7t7t7t"
Код: Выделить всё
OUT_LCD:
LDI temp, 'A'
RCALL WrData
RCALL WAIT_50us
LDI temp, '7'
RCALL WrData
RCALL WAIT_50us
RJMP OUT_LCD
//------------------------------------------------
//Подпрограммы------------------------------------
//---------------------------------
LCD_INIT:
RCALL WAIT_20ms
sbi LCD_DDR, D4 Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Посмотрите комменты в коде и попробуйте, для начала, перенести RS и EN на другой порт или продублировать в temp бит EN
После того как был объявлен переход на 4-х разрядное управление из 8-ми разрядного нужно повторить процедуру установки, но уже из 4-х разрядного управления.
Нет маскирования младшей тетрады
Код: Выделить всё
SBI LCD_PORT, EN ;начало строба Этой командой Вы поднимаете EN
NOP
LDI temp, 0b00000011 ;установить разрядность интерфейса
OUT LCD_PORT, temp ; Этой командой Вы сбрасываете EN т.к. линии данных и управления совмещены
NOP
CBI LCD_PORT, EN ;конец стробаНет маскирования младшей тетрады
Спойлер
Код: Выделить всё
MAIN_LCD_INIT:
CLR R17
SBR R17,0b00100000 ; и/или RS
LDI temp, 0b00000011 ;установить разрядность интерфейса
ANDI TEMP, 0b00001111
OR temp, R17
OUT LCD_PORT, temp
NOP
NOP
NOP
; SBI LCD_PORT, EN ;начало строба
; NOP
; LDI temp, 0b00000011 ;установить разрядность интерфейса
; OUT LCD_PORT, temp
; NOP
CBI LCD_PORT, EN ;конец строба
RCALL WAIT_50us ;задержка
RET
Последний раз редактировалось akl Вт дек 11, 2012 12:04:28, всего редактировалось 1 раз.
-
tux
- Первый раз сказал Мяу!
- Сообщения: 36
- Зарегистрирован: Чт сен 20, 2012 11:57:28
- Откуда: Владивосток
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
. Так сделать неправильно? По описанию как я понял как раз так и нужно делать. Просто смотрел несколько рабочих библиотек для этого LCD- так там был мой первоначальный вариант стробирования.продублировать в temp бит EN
Код: Выделить всё
LDI temp, 0b00000011 ;установить разрядность интерфейса
OUT LCD_PORT, temp
NOP
NOP
SBI LCD_PORT, EN
NOP
CBI LCD_PORT, EN ;конец строба
RCALL WAIT_50us Не понял.. Это что нужно продублировать?После того как был объявлен переход на 4-х разрядное управление из 8-ми разрядного нужно повторить процедуру установки, но уже из 4-х разрядного управления.
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Вот картинка из DS HD44780. Вот так и надо дублировать
Вы уже подошли к тому, чтобы читать даташиты и самому! осознанно! инициализировать дисплей с учетом временных задержек дисплея, частоты тактирования контроллера и т.п.
Спойлер
-
tux
- Первый раз сказал Мяу!
- Сообщения: 36
- Зарегистрирован: Чт сен 20, 2012 11:57:28
- Откуда: Владивосток
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Я читал это. И насколько я понял вторая инициализация и происходит по команде 0х28. Или я чего то не понял?
И задержки я вводил по этой картинке. Потом правда потихоньку увеличивал задержки
И задержки я вводил по этой картинке. Потом правда потихоньку увеличивал задержки
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Посмотрите мое пред предыдущее сообщение.
Не совсем так.tux писал(а):И насколько я понял вторая инициализация и происходит по команде 0х28.
-
tux
- Первый раз сказал Мяу!
- Сообщения: 36
- Зарегистрирован: Чт сен 20, 2012 11:57:28
- Откуда: Владивосток
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Переделал программку с учетом того как понял объяснения. Все равно не работает.
Что я непровильно понял/сделал?
Большой код прячьте в спойлер
Gudd-Head
Спойлер
Код: Выделить всё
.include "m16def.inc" ; ATMega16
//--------------------------------
.DSEG
.def temp=R16
.equ LCD_PORT = PORTA
.equ LCD_DDR = DDRA
.equ LCD_PIN = PINA
.equ D4 = 0
.equ D5 = 1
.equ D6 = 2
.equ D7 = 3
.equ RS = 4
.equ EN = 5
//---------------------------------
//-----------------------------------------------
.CSEG
.ORG $0000
RJMP INIT
//Инициализация МК-------------------------------
INIT:
//Инициализация стека----------
ldi r16,low(RAMend)
out SPL,r16
ldi r16,high(RAMend)
out SPH,r16
//-----------------------------
//Инициализация дисплея
RCALL LCD_INIT
RCALL WAIT_100us
OUT_LCD:
LDI temp, 'A'
RCALL WrData
RCALL WAIT_100us
LDI temp, '7'
RCALL WrData
RCALL WAIT_100us
STOP:
NOP
RJMP STOP
//------------------------------------------------
//Подпрограммы------------------------------------
//---------------------------------
LCD_INIT:
RCALL WAIT_20ms
sbi LCD_DDR, D4 ;Ножки порта на выход
sbi LCD_DDR, D5
sbi LCD_DDR, D6
sbi LCD_DDR, D7
sbi LCD_DDR, RS
sbi LCD_DDR, EN
cbi LCD_PORT, RS ;оистить значение RS, EN
cbi LCD_PORT, EN
RCALL WAIT_100us
LDI temp, 0b00000011
RCALL One ;Начальная инициализация
RCALL WAIT_5ms
LDI temp, 0b00000011
RCALL One ;вызывается
RCALL WAIT_100us
LDI temp, 0b00000011
RCALL One ;три раза
RCALL WAIT_100us
LDI temp, 0b00000010 ;установить разрядность интерфейса (4 бита)
RCALL One
RCALL WAIT_100us
//--------------------------
LDI temp, 0x28
RCALL One
RCALL WAIT_100us
LDI temp, 0x08 ;установить разрядность интерфейса (4 бита)
RCALL Two ;2 строки 5х7
RCALL WAIT_100us
LDI temp, 0x01 ;дисплей вкл, курсор выкл.
RCALL Two
RCALL WAIT_100us
LDI temp, 0x06 ;очистить LCD
RCALL Two
RCALL WAIT_100us
RET
//----------------------------------
WrData:
SBI LCD_PORT, RS
Two:
NOP ;Записать в дисплей
PUSH R16
SWAP R16
ANDI temp, 0b00001111
OUT LCD_PORT, temp
NOP
NOP
NOP
SBI LCD_PORT, EN
NOP
NOP
CBI LCD_PORT, EN
RCALL WAIT_100us
NOP
POP R16
ANDI temp, 0b00001111
One:
OUT LCD_PORT, temp
NOP
NOP
NOP
SBI LCD_PORT, EN
NOP
NOP
NOP
CBI LCD_PORT, EN
RCALL WAIT_100us
RET
//----------------------------------
WAIT_20ms: ;Расчет делался в программе
LDI R18,104 ;калькуляторе AVR DELAY LOOP
LDI R19,228
L1:
DEC R19
BRNE L1
DEC R18
BRNE L1
RET
//----------------------------------
WAIT_5ms: ;Расчет делался в программе
LDI R18,26 ;калькуляторе AVR DELAY LOOP
LDI R19,248
L3:
DEC R19
BRNE L3
DEC R18
BRNE L3
RET
//----------------------------------
WAIT_100us:
LDI R18,133
L2:
DEC R18
BRNE L2
NOP
RET
Большой код прячьте в спойлер
Gudd-Head
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Инициализация, вернее, ее коды введены неправильно
При записи данных бит RS-обращения в регистр данных сбрасывается командой
При записи данных бит RS-обращения в регистр данных сбрасывается командой
Код: Выделить всё
OUT LCD_PORT, tempСпойлер
Код: Выделить всё
.include "m16def.inc" ; ATMega16
//--------------------------------
.DSEG
.def temp=R16
.equ LCD_PORT = PORTA
.equ LCD_DDR = DDRA
.equ LCD_PIN = PINA
.equ D4 = 0
.equ D5 = 1
.equ D6 = 2
.equ D7 = 3
.equ RS = 4
.equ EN = 5
//---------------------------------
//-----------------------------------------------
.CSEG
.ORG $0000
RJMP INIT
//Инициализация МК-------------------------------
;INIT:
//Инициализация стека----------
ldi r16,low(RAMend)
out SPL,r16
ldi r16,high(RAMend)
out SPH,r16
//-----------------------------
//Инициализация дисплея
RCALL LCD_INIT
RCALL WAIT_100us
OUT_LCD:
LDI temp, 'A'
RCALL WrData
RCALL WAIT_100us
LDI temp, '7'
RCALL WrData
RCALL WAIT_100us
STOP:
NOP
RJMP STOP
//------------------------------------------------
//Подпрограммы------------------------------------
//---------------------------------
LCD_INIT:
RCALL WAIT_20ms
sbi LCD_DDR, D4 ;Ножки порта на выход
sbi LCD_DDR, D5
sbi LCD_DDR, D6
sbi LCD_DDR, D7
sbi LCD_DDR, RS
sbi LCD_DDR, EN
cbi LCD_PORT, RS ;оистить значение RS, EN
cbi LCD_PORT, EN
RCALL WAIT_100us
LDI temp, 0b00000011
RCALL One ;Начальная инициализация
RCALL WAIT_5ms
LDI temp, 0b00000011
RCALL One ;вызывается
RCALL WAIT_100us
LDI temp, 0b00000011
RCALL One ;три раза
RCALL WAIT_100us
LDI temp, 0b00000010 ;установить разрядность интерфейса (4 бита)
RCALL One
RCALL WAIT_100us
//--------------------------
LDI temp, 0x28
RCALL Two ;2 строки 5х7
; RCALL One
RCALL WAIT_100us
;***********************************************************************
LDI temp, 0x06 ; автоинкремент счетчика DDRAM
RCALL Two
RCALL WAIT_100us
LDI temp, 0x0C ;дисплей вкл, курсор выкл.
RCALL Two
RCALL WAIT_100us
LDI temp, 0x01 ;очистить LCD
RCALL Two
RCALL WAIT_5ms ; КОМАНДА ОЧИСТКИ ДИСПЛЕЯ ДЛИТСЯ 1,5МС
; RCALL WAIT_100us
RET
;***********************************************************************
; LDI temp, 0x08 ;установить разрядность интерфейса (4 бита)
; RCALL Two ;2 строки 5х7
; RCALL WAIT_100us
; LDI temp, 0x01 ;дисплей вкл, курсор выкл.
; RCALL Two
; RCALL WAIT_100us
; LDI temp, 0x06 ;очистить LCD
; RCALL Two
; RCALL WAIT_100us
; RET
;***********************************************************************
//----------------------------------
WrData:
SBI LCD_PORT, RS
Two:
NOP ;Записать в дисплей
PUSH R16
SWAP R16
ANDI temp, 0b00001111
OUT LCD_PORT, temp ; ЭТОЙ КОМАНДОЙ ПРОИСХОДИТ СБРОС БИТА RS
NOP
NOP
NOP
SBI LCD_PORT, EN
NOP
NOP
NOP
NOP
NOP
CBI LCD_PORT, EN
; RCALL WAIT_100us
NOP
POP R16
ANDI temp, 0b00001111
One:
OUT LCD_PORT, temp
NOP
NOP
NOP
SBI LCD_PORT, EN
NOP
NOP
NOP
CBI LCD_PORT, EN
; RCALL WAIT_100us
RET
//----------------------------------
WAIT_20ms: ;Расчет делался в программе
LDI R18,104 ;калькуляторе AVR DELAY LOOP
LDI R19,228
L1:
DEC R19
BRNE L1
DEC R18
BRNE L1
RET
//----------------------------------
WAIT_5ms: ;Расчет делался в программе
LDI R18,26 ;калькуляторе AVR DELAY LOOP
LDI R19,248
L3:
DEC R19
BRNE L3
DEC R18
BRNE L3
RET
//----------------------------------
WAIT_100us:
LDI R18,133
L2:
DEC R18
BRNE L2
NOP
RET
-
tux
- Первый раз сказал Мяу!
- Сообщения: 36
- Зарегистрирован: Чт сен 20, 2012 11:57:28
- Откуда: Владивосток
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
А не могли бы Вы написать какие коды должны быть? Просто я смотрел другие примеры и везде вроде бы такие коды были. Потом сравнил с инициализацией из DS и на мой взгляд они совпали с теми, что я использовал.Инициализация, вернее, ее коды введены неправильно
Если я сделаю так
Код: Выделить всё
NOP ;Записать в дисплей
PUSH R16
SWAP R16
ANDI temp, 0b00001111
OUT LCD_PORT, temp ; ЭТОЙ КОМАНДОЙ ПРОИСХОДИТ СБРОС БИТА RS
SBI LCD_PORT, RS
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Я же привёл в Вашем коде! Жаль, что не удосужились.
Вот, для примера; не эталон, конечно, но для начала сойдет.
Вот, для примера; не эталон, конечно, но для начала сойдет.
-
tux
- Первый раз сказал Мяу!
- Сообщения: 36
- Зарегистрирован: Чт сен 20, 2012 11:57:28
- Откуда: Владивосток
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Огромное спасибо за все Ваши разъяснения! Вроде заработало все стабильно. Для тех кому интересно выложу свой вариант работы с этим LCD. Если есть еще какие крупные косяки, то просьба сообщить.
Осталось только разобраться со знакогенераторм пользователя..
Осталось только разобраться со знакогенераторм пользователя..
- Вложения
-
- lcd_proba2.asm
- Вывод символов на LCD
- (3.63 КБ) 366 скачиваний
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Вот и у меня возникли вопросы.
LCD Winstar WH1602D-YGH-CTK, 4-х битный режим.
Инициализация происходит, но не при включении, а после нажатия на reset.
Понять не могу почему.
Сначала сделал такой код:
Потом переписал инициализацию на такую:
Эффект тот-же самый. Включаешь- на экране пусто. Нажимаешь reset - всё работает.
Ткните носом в ошибку, пжл.
LCD Winstar WH1602D-YGH-CTK, 4-х битный режим.
Инициализация происходит, но не при включении, а после нажатия на reset.
Понять не могу почему.
Сначала сделал такой код:
Спойлер
Код: Выделить всё
#ifndef F_CPU
# define F_CPU 16000000 /* 16 MHz */
#endif
#include <avr/io.h>
#include <avr/delay.h>
//Комманды управления дисплеем
#define LCD_CLEAR 0x01
#define LCD_HOME 0x02
#define LCD_ON 0x0C
#define LCD_OFF 0x08
#define LCDPORT PORTD
#define LCDDDR DDRD
#define LCD_PIN_RS PORTD2
#define LCD_PIN_E PORTD3
#define LCD_PIN_D4 PORTD4
#define LCD_PIN_D5 PORTD5
#define LCD_PIN_D6 PORTD6
#define LCD_PIN_D7 PORTD7
#define LCD_STRING_ADR(adr) (0x80|adr) //Позиция вывода символа
#define COMMAND 0
#define DATA 1
#define sbi(sfr, bit) (sfr|=(1<<bit))
#define cbi(sfr, bit) (sfr&=~(1<<bit))
//Тактирование LCD
void lcd_clk()
{
sbi(LCDPORT,LCD_PIN_E);
_delay_ms(1);
cbi(LCDPORT,LCD_PIN_E);
_delay_ms(1);
}
//отправка байта в LCD
void lcd_send(unsigned char type, unsigned char c)
{
if (type==COMMAND)
{cbi(LCDPORT,LCD_PIN_RS);}//RS=0 - комманда
else
{sbi(LCDPORT,LCD_PIN_RS);}
//Передача старшего полубайта
if (bit_is_set(c,7))
{ sbi(LCDPORT,LCD_PIN_D7);}
else
{cbi(LCDPORT,LCD_PIN_D7);}
if (bit_is_set(c,6))
{ sbi(LCDPORT,LCD_PIN_D6);}
else
{cbi(LCDPORT,LCD_PIN_D6);}
if (bit_is_set(c,5))
{ sbi(LCDPORT,LCD_PIN_D5);}
else
{cbi(LCDPORT,LCD_PIN_D5);}
if (bit_is_set(c,4))
{ sbi(LCDPORT,LCD_PIN_D4);}
else
{cbi(LCDPORT,LCD_PIN_D4);}
lcd_clk();
//Передача младшего полубайта
if (bit_is_set(c,3))
{ sbi(LCDPORT,LCD_PIN_D7);}
else
{cbi(LCDPORT,LCD_PIN_D7);}
if (bit_is_set(c,2))
{ sbi(LCDPORT,LCD_PIN_D6);}
else
{cbi(LCDPORT,LCD_PIN_D6);}
if (bit_is_set(c,1))
{ sbi(LCDPORT,LCD_PIN_D5);}
else
{cbi(LCDPORT,LCD_PIN_D5);}
if (bit_is_set(c,0))
{ sbi(LCDPORT,LCD_PIN_D4);}
else
{cbi(LCDPORT,LCD_PIN_D4);}
lcd_clk();
_delay_ms(5);
}
void lcd_write(char*t) //Отображение строки символов
{
unsigned char i;
for (i=0;i<255;i++)
{
if (t[i]==0)
{
return;
}
else
{
lcd_send(DATA, t[i]);
}
}
}
void lcd_init() //Инициализация LCD
{
LCDPORT=0x00;
LCDDDR=0xff;
_delay_ms(500);
//Конфигурирование 4-хбитного режима
sbi(LCDPORT,LCD_PIN_D5);
sbi(LCDPORT,LCD_PIN_D4);
lcd_clk();
_delay_ms(50);
lcd_send(COMMAND, 0x28);
lcd_send(COMMAND, LCD_OFF);
lcd_send(COMMAND, LCD_CLEAR);
lcd_send(COMMAND, 0x06);
lcd_send(COMMAND, LCD_ON);
}
int main(void)
{
lcd_init();
lcd_write("Start");
_delay_ms(2000);
while(1)
{
lcd_send(COMMAND,LCD_CLEAR);
lcd_send(COMMAND,LCD_STRING_ADR(0x42));
lcd_write("Hello2");
_delay_ms(1000);
lcd_send(COMMAND,LCD_CLEAR);
lcd_send(COMMAND,LCD_STRING_ADR(0x03));
lcd_write("Hello1");
_delay_ms(1000);
}
}
Спойлер
Код: Выделить всё
void lcd_init() //Инициализация LCD
{
LCDPORT=0x00;
LCDDDR=0xff;
_delay_ms(500);
//Конфигурирование 4-хбитного режима
//0
sbi(LCDPORT,LCD_PIN_D5);
sbi(LCDPORT,LCD_PIN_D4);
lcd_clk();
_delay_ms(50);
//1
cbi(LCDPORT,LCD_PIN_D4);
lcd_clk();
sbi(LCDPORT,LCD_PIN_D7);
lcd_clk();
_delay_ms(50);
//2
cbi(LCDPORT,LCD_PIN_D7);
lcd_clk();
sbi(LCDPORT,LCD_PIN_D7);
lcd_clk();
_delay_ms(50);
//3
cbi(LCDPORT,LCD_PIN_D7);
cbi(LCDPORT,LCD_PIN_D5);
lcd_clk();
sbi(LCDPORT,LCD_PIN_D7);
sbi(LCDPORT,LCD_PIN_D6);
lcd_clk();
_delay_ms(50);
//4
cbi(LCDPORT,LCD_PIN_D7);
cbi(LCDPORT,LCD_PIN_D6);
lcd_clk();
sbi(LCDPORT,LCD_PIN_D4);
lcd_clk();
_delay_ms(50);
//5
cbi(LCDPORT,LCD_PIN_D4);
lcd_clk();
sbi(LCDPORT,LCD_PIN_D5);
sbi(LCDPORT,LCD_PIN_D4);
lcd_clk();
_delay_ms(50);
} Ткните носом в ошибку, пжл.


