Работа с ЖКИ на контроллере HD44780 и его аналогах

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Аватара пользователя
Adagumer
Поставщик валерьянки для Кота
Сообщения: 2286
Зарегистрирован: Чт ноя 15, 2012 20:47:59
Откуда: Крымск

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах

Сообщение Adagumer »

vitalik_1984 писал(а): Для начала просто подайте питание реостатом добейтесь отчетливого изображения первой строки, потом уже что то с кодом проверять можно.
Так и делал, на 3 ножку подавал напряжение от 0,5 до 4,5 вольта, на индикаторе даже и следа нет что там есть строки. Молчит, гад, хоть убей!
Реклама
Аватара пользователя
Adagumer
Поставщик валерьянки для Кота
Сообщения: 2286
Зарегистрирован: Чт ноя 15, 2012 20:47:59
Откуда: Крымск

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах

Сообщение Adagumer »

Добил я проблему с зажиганием индикатора. Оказалось всё банально просто, напряжение контрастности должно быть в пределах от 0 до 0,5 вольта. При 0 полностью зачернённый экран, при 0,45 V видны кое где элементы выводимых символов, нормальная контрастность при 0,18 вольта. Даже тот дисплей который изначально думал шо спалил , перепутав полярность питания, жив.
Реклама
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах

Сообщение vitalik_1984 »

Прочитайте пару последних страниц, дело в том, что напряжение для кристаллов берется с плюса и пина контраста, но никак не с общего.Поэтому такие непонятки возникают.В даташите это все прекрасно описано.То есть если написано, что нормальное рабочее напряжение lcd 4,2 вольта, то при рабочем напряжении 3,3 в получается, что нужно подавать отрицательное напряжение на этот контакт 3,3-4,2=-1,1 вольт.
В случае 5ти вольт 5-4,2=0,8
все полученные результаты относительно общего провода- GND.
Аватара пользователя
Adagumer
Поставщик валерьянки для Кота
Сообщения: 2286
Зарегистрирован: Чт ноя 15, 2012 20:47:59
Откуда: Крымск

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах

Сообщение Adagumer »

vitalik_1984 писал(а):В даташите это все прекрасно описано.
Каюсь языками не владею. Спасибо за внятное разъяснение. :))
Реклама
Эиком - электронные компоненты и радиодетали
tux
Первый раз сказал Мяу!
Сообщения: 36
Зарегистрирован: Чт сен 20, 2012 11:57:28
Откуда: Владивосток
Контактная информация:

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах

Сообщение tux »

Не могли бы знатоки ткнуть носом где у меня ошибка?
Спойлер

Код: Выделить всё

.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
Подключение 4-битное. На дисплей вроде как выводится что то, но те символы, что хочу вывести- постоянно мигают, и кроме того вылазит какой то мусор на дисплей.
Начал только осваивать avr, поэтому сильно не пинайте..
Реклама
Аватара пользователя
*Trigger*
Друг Кота
Сообщения: 3059
Зарегистрирован: Пн май 11, 2009 14:15:00
Откуда: СПб

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах

Сообщение *Trigger* »

Неужели так и нужно?

Код: Выделить всё

//----------------------------------
WAIT_1ms:                        ;Расчет делался в программе 
   LDI R18,6                  ;калькуляторе AVR DELAY LOOP
   LDI R19,48
  L3:
   DEC R19
   BRNE L1
   DEC R18
   BRNE L3
   RET
Или всё таки вместо L1 нужно L3?
Этот пост оказался полезен? Не поленись, нажми Изображение слева!
:) :)) :)))
Куплю индикаторы ИТС-1А, ИТС-1Б, ИГВ1-8х5Л, ИГПС1-222/7, ИГПС1-111/7 и подобные.
Реклама
tux
Первый раз сказал Мяу!
Сообщения: 36
Зарегистрирован: Чт сен 20, 2012 11:57:28
Откуда: Владивосток
Контактная информация:

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах

Сообщение tux »

Да, спасибо, конечно опечатка. Попровил- не помогло. Также попробовал поменять как по даташиту сначала вывод данных, потом лишь стробирующий импульс (было НАЧАЛО СТРОБА -> ВЫВОД ДАННЫХ -> КОНЕЦ СТРОБА как подсмотрел в готовых библиотеках). Тоже не помогло. Стало в правом верхнем углу мигают три паралельных полоски, и хаотично мигают черные квадритики.
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах

Сообщение akl »

У Вас происходит срыв стека. Попробуйте

Код: Выделить всё

   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 и его аналогах

Сообщение tux »

Не помогло. Стала либо мигающий курсор показывать в начале строки, либо три паралельные палки, либо вопрос в конце. При этом, если сделать так:

Код: Выделить всё

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   
то во всех строчкаx начинают гореть "7t7t7t7t7t7t"
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах

Сообщение akl »

Посмотрите комменты в коде и попробуйте, для начала, перенести RS и EN на другой порт или продублировать в temp бит EN

Код: Выделить всё

  SBI      LCD_PORT, EN            ;начало строба Этой командой Вы поднимаете EN
   NOP
   LDI    temp, 0b00000011         ;установить разрядность интерфейса
   OUT    LCD_PORT, temp          ; Этой командой Вы сбрасываете EN т.к. линии данных и управления совмещены
   NOP
   CBI    LCD_PORT, EN            ;конец строба
После того как был объявлен переход на 4-х разрядное управление из 8-ми разрядного нужно повторить процедуру установки, но уже из 4-х разрядного управления.
Нет маскирования младшей тетрады
Спойлер

Код: Выделить всё

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 и его аналогах

Сообщение tux »

продублировать в temp бит EN
. Так сделать неправильно? По описанию как я понял как раз так и нужно делать. Просто смотрел несколько рабочих библиотек для этого LCD- так там был мой первоначальный вариант стробирования.

Код: Выделить всё

LDI    temp, 0b00000011         ;установить разрядность интерфейса
   OUT    LCD_PORT, temp
   NOP  
   NOP
   SBI      LCD_PORT, EN
   NOP
   CBI    LCD_PORT, EN            ;конец строба
   RCALL    WAIT_50us          
Так вообще на дисплей ничего не выводится.
После того как был объявлен переход на 4-х разрядное управление из 8-ми разрядного нужно повторить процедуру установки, но уже из 4-х разрядного управления.
Не понял.. Это что нужно продублировать?
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах

Сообщение akl »

Вот картинка из DS HD44780. Вот так и надо дублировать
СпойлерИзображение
Вы уже подошли к тому, чтобы читать даташиты и самому! осознанно! инициализировать дисплей с учетом временных задержек дисплея, частоты тактирования контроллера и т.п.
tux
Первый раз сказал Мяу!
Сообщения: 36
Зарегистрирован: Чт сен 20, 2012 11:57:28
Откуда: Владивосток
Контактная информация:

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах

Сообщение tux »

Я читал это. И насколько я понял вторая инициализация и происходит по команде 0х28. Или я чего то не понял?
И задержки я вводил по этой картинке. Потом правда потихоньку увеличивал задержки
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах

Сообщение akl »

Посмотрите мое пред предыдущее сообщение.
tux писал(а):И насколько я понял вторая инициализация и происходит по команде 0х28.
Не совсем так.Изображение
HD44780.GIF
tux
Первый раз сказал Мяу!
Сообщения: 36
Зарегистрирован: Чт сен 20, 2012 11:57:28
Откуда: Владивосток
Контактная информация:

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах

Сообщение tux »

Переделал программку с учетом того как понял объяснения. Все равно не работает.
Спойлер

Код: Выделить всё

.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
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах

Сообщение akl »

Инициализация, вернее, ее коды введены неправильно
При записи данных бит 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 и его аналогах

Сообщение tux »

Инициализация, вернее, ее коды введены неправильно
А не могли бы Вы написать какие коды должны быть? Просто я смотрел другие примеры и везде вроде бы такие коды были. Потом сравнил с инициализацией из DS и на мой взгляд они совпали с теми, что я использовал.

Если я сделаю так

Код: Выделить всё


   NOP                           ;Записать в дисплей
   PUSH    R16
   SWAP    R16
   ANDI temp, 0b00001111
   OUT     LCD_PORT, temp   ; ЭТОЙ КОМАНДОЙ ПРОИСХОДИТ СБРОС БИТА RS
   SBI LCD_PORT, RS
то это будет правильнее?
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах

Сообщение akl »

Я же привёл в Вашем коде! Жаль, что не удосужились.
Вот, для примера; не эталон, конечно, но для начала сойдет.
tux
Первый раз сказал Мяу!
Сообщения: 36
Зарегистрирован: Чт сен 20, 2012 11:57:28
Откуда: Владивосток
Контактная информация:

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах

Сообщение tux »

Огромное спасибо за все Ваши разъяснения! Вроде заработало все стабильно. Для тех кому интересно выложу свой вариант работы с этим LCD. Если есть еще какие крупные косяки, то просьба сообщить.
Осталось только разобраться со знакогенераторм пользователя..
Вложения
lcd_proba2.asm
Вывод символов на LCD
(3.63 КБ) 366 скачиваний
Триод
Нашел транзистор. Понюхал.
Сообщения: 160
Зарегистрирован: Сб дек 08, 2012 16:40:40

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах

Сообщение Триод »

Вот и у меня возникли вопросы.
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);
	 
 } 
Эффект тот-же самый. Включаешь- на экране пусто. Нажимаешь reset - всё работает.
Ткните носом в ошибку, пжл.
Ответить

Вернуться в «Периферия»