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

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

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

Сообщение Adagumer »

vitalik_1984 писал(а): Для начала просто подайте питание реостатом добейтесь отчетливого изображения первой строки, потом уже что то с кодом проверять можно.

Так и делал, на 3 ножку подавал напряжение от 0,5 до 4,5 вольта, на индикаторе даже и следа нет что там есть строки. Молчит, гад, хоть убей!
Аватара пользователя
Adagumer
Поставщик валерьянки для Кота
Сообщения: 2283
Зарегистрирован: Чт ноя 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
Поставщик валерьянки для Кота
Сообщения: 2283
Зарегистрирован: Чт ноя 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 - всё работает.
Ткните носом в ошибку, пжл.
Ответить

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