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

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Аватара пользователя
Ghost in shell
Держит паяльник хвостом
Сообщения: 936
Зарегистрирован: Пн июн 15, 2009 06:01:38
Откуда: USSR

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

Сообщение Ghost in shell »

Alexeyslav
какой отладчик?
Кот гуляет сам по себе, но вблизи холодильника.
Реклама
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

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

Сообщение Alexeyslav »

Программный конечно же. Напишите для начала программу тестовую, которая выводит символы во все позиции индикатора. Потом можно будет приступить к отладке вашего алгоритма, на каждом шаге проконтролировать содержимое переменных передаваемых в подпрограммы и т.д. и т.п. Возможно даже для этого проще задействовать UART и передавать в терминал данные, так вы увидите что и когда выполняется с какими параметрами так будет гораздо проще искать ошибку.
Надеюсь, проблема воспроизводится даже в протеусе? Если в железе то добавляется еще одна причина - сгоревший индикатор.
Реклама
Аватара пользователя
GARMIN
Держит паяльник хвостом
Сообщения: 954
Зарегистрирован: Вс дек 02, 2012 16:58:33
Откуда: от туда
Контактная информация:

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

Сообщение GARMIN »

Вопрос ламерский и с бородой, не сильно мяукайте по этому поводу.
Подключил дисплей 1601 в режиме 4-х бит. Выводит пол строки (8 символов).
Я знаю, что вторая половина дисплея адресуется как вторая строчка, но пока не знаю, как передать адрес для отображения всей строки символов.
Команды инициализации дисплея:
пауза 15 мс
0x30
пауза 5 мс
0x30
0x30
0x20
0x20 // (0x20 | LCD_NUM_LINES | LCD_FONT)
0x0C // (0x08 | LCD_DISPLAY_ON | LCD_CURSOR_ON | LCD_CURSOR_BLINK)
0x06 // (0x04 | LCD_INCREMENT | LCD_SHIFT)
0x01

во время вывода символов читаю адрес, и при достижении адреса 0x08 посылаю команду присвоения счётчика адреса 40
(0x80 | 0x40)
После чего продолжаю выводить символы, но на дисплее они не отображаются

69 страниц не осилил, подскажите, в каком посте есть ссылка на библиотеку, или что я не так делаю.
Прошу ткнуть кошачьим носом :(
Аватара пользователя
Ghost in shell
Держит паяльник хвостом
Сообщения: 936
Зарегистрирован: Пн июн 15, 2009 06:01:38
Откуда: USSR

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

Сообщение Ghost in shell »

Alexeyslav
Если выводить по одному-два, символы выводятся по всей длинне первой строки. Так что врядли что-то с индикатором. Я подозреваю нестыковку библиотек, MPLAB IDE 8.3 и компилятора HI-TECH 9.60.
Вообще-то это и есть тестовая программа: выводится несколько символов. И все. Куда уж проще?
Протеусом не пользуюсь: небыло необходимости. Автор библиотек, уважаемый Alex использует несколько другой софт. Может, в этом все дело?
Кот гуляет сам по себе, но вблизи холодильника.
Реклама
Эиком - электронные компоненты и радиодетали
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

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

Сообщение Alexeyslav »

Тогда конечно же надо ковырять библиотеки. Раз такое простое не проходит, значит либо библиотеки бажные либо вы неправильно ими пользуетесь. Примеры с библиотеками шли? Если нет то в топку.

или что я не так делаю.
У вас есть команда переключение в 4-битный режим, но потом должна следовать команда 0x28 для дополнительных опций, т.к. в 8-битном режиме эта команда невозможна при 4-битном подключении к индикатору поэтому используют 0x20.
Потом, скачайте все-таки даташит на ваш индикатор и посмотрите как все же адресуются символы в строках. По-разному ведь бывает. Если нет придется тогда методом тыка - пробуйте выводить во все адреса. В первую половину - адрес, во вторую какой-нибудь символ по указанному адресу, если менять адрес раз в секунду то за 2-3 минуты точно узнаете какой адрес второй половины.
Реклама
Аватара пользователя
GARMIN
Держит паяльник хвостом
Сообщения: 954
Зарегистрирован: Вс дек 02, 2012 16:58:33
Откуда: от туда
Контактная информация:

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

Сообщение GARMIN »

При инициализации индикатора 0x28 он не запускается, так как бит 0x08 определяет двухстрочный дисплей.
С 0x20 всё проходит и дисплей высвечивает курсор.
Методом тыка можно попробовать, я привык разбираться с даташитами.
Напомните, в каком посте есть ссылка на библиотеку?
Может, поможет точное название дисплея? SC1601ASLB.
Реклама
akl
Друг Кота
Сообщения: 4445
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

По мне, нарушена процедура инициализации драйвера KS0066 (стр.27), который во многом схож с HD44780 (стр.46), но имеет отличия.
Также, дисплей 3-х вольтовый.
Аватара пользователя
GARMIN
Держит паяльник хвостом
Сообщения: 954
Зарегистрирован: Вс дек 02, 2012 16:58:33
Откуда: от туда
Контактная информация:

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

Сообщение GARMIN »

Проверил процедуру инициализации. При использовании кода для KS0066 получаются еле видимые не контрастные символы:

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

// для KS0066
	vTaskDelay(30);
	ResetLCD_RS;
	ResetLCD_RW;
	DataToPort (0x20); 			//4 bit mode 1
	DataToPort (0x20);
	DataToPort (0x40);
	DataToPort (0x00);
	DataToPort (0xE0);
	DataToPort (0x00);
	DataToPort (0x10);
	vTaskDelay (2);
	DataToPort (0x00);
	DataToPort (0x60);
Дисплей инициализируется только как однострочный HD44780 вот такой последовательностью (здесь применяются байтовые команды)

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

	// для HD44780
	vTaskDelay(15);
	ResetLCD_RS;
	ResetLCD_RW;
	DataToPort (0x30); 			//4 bit mode 1
	vTaskDelay(5);
	DataToPort (0x30); 			//4 bit mode 2
	DataToPort (0x30); 			//4 bit mode 3
	DataToPort (0x20); 			//4 bit command
	LCDsendCommand (0x20 | LCD_NUM_LINES | LCD_FONT);
	LCDsendCommand (0x08 | LCD_DISPLAY_ON | LCD_CURSOR_ON | LCD_CURSOR_BLINK);
	LCDsendCommand (0x04 | LCD_INCREMENT | LCD_SHIFT);
	LCDsendCommand (0x01);								// очисить дисплей
Перебор адресов записи от 0 до 128 простой программой не дал результатов.
Вторая половина индикатора пуста

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

for (i = 0; i < 0x80; i++)
{
	vTaskDelay (1000);
	itoa (i, addr);
	LCDsendCommand (1 << LCD_DDRAM);
	LCDstring (addr, 4);                              // вывод адреса в первую позицию LCD
	LCDsendCommand (1 << LCD_DDRAM | i);
	LCDstring ("*", 1);                               // запись звёздочки в память LCD по адресу
}
Что - то не так с инициализацией. Никак не прокатывает инициализация как двухстрочный дисплей.
Аватара пользователя
GARMIN
Держит паяльник хвостом
Сообщения: 954
Зарегистрирован: Вс дек 02, 2012 16:58:33
Откуда: от туда
Контактная информация:

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

Сообщение GARMIN »

Сегодня съездил и купил двухстрочный дисплей WH1602.
С ним проблем не возникло. Первый пациент скорее мёртв чем жив.
Аватара пользователя
GARMIN
Держит паяльник хвостом
Сообщения: 954
Зарегистрирован: Вс дек 02, 2012 16:58:33
Откуда: от туда
Контактная информация:

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

Сообщение GARMIN »

Хм, оказывается даташиты врут.
Первый пациент не работал из-за питания его от дискаверивских 3-х вольт. Переключил на пяти вольтовое питание - заработал.
А в инструкции написано, что контроллер работает от 2,7 вольт. Вот и верь после этого людям :)) :)) :)) .
Вадиматоричик
Грызет канифоль
Сообщения: 299
Зарегистрирован: Пн май 16, 2011 10:54:32
Откуда: Красноярск

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

Сообщение Вадиматоричик »

Всех с наступившим новым годом!
Маленькая предыстория: Около года назад купил себе дисплей на этом контроллере (HD44780). Подключил по 8-ми битной шине, поигрался, и успокоился. Схему подключения нашел в help-е для mikroPascal (Случайно.).
LCD.jpg
(89.28 КБ) 649 скачиваний
Помучился недельку с 4-х битной шиной и забыл о ней на год (Не смог "уломать".). Но вот совершенно недавно столкнулся с потребностью в использовании данного дисплея (А он у меня бело-синий 16*2.) по 4-х битной шине. Не нашел готовых "библиотек" под ассемблер (Часть либо сильно перегружена лишним для меня мусором, либо СИ... Но СИ мне не по душе.). И вот таки решился "домучить" передачу по 6 проводам (D4..D7, RS, E). Заодно и написал небольшую библиотечку. Т.к. мне нужно выводить "не стабильную информацию" (Вывести статический текст и менять его параметры. Например часы.) то я не делал возможность выдачи строк. Изучив кучу материала и разобравшись с косяками, я решил ее выложить.
Пояснения. Моя библиотека может: проводить автоматическую инициализацию на 4-х битную шину, отправлять команды/данные по ней. Можно настроить каждый пин (Для каждой ножки отдельный порт и пин), задержку между командами/данными тоже можно регулировать. Файл "LCDDraver.asm" "выдает" команду/данные содержащиеся в регистре "Temp" (Его нужно обязательно указать в заголовочном файле). Подпрограмма задержки использует Temp, Temp1 (Но восстанавливает их после окончания работы).
"LCD_Init.asm" - подключаете в том месте, где планируете проинициализировать экран. Это просто заранее прописные команды инициализации.
Настройка:
Спойлер;Описание портов LCD.---------------------------------------------------------------------------
.equ PAUZA_LCD = 1 ;Длительность паузы при подаче на LCD.
.equ PAUZA_LCD1= 1
.equ PRS = PORTC ;Порт RS.
.equ RS = 2 ;Номер пина RS.
.equ PEE = PORTC ;Порт E.
.equ E = 3 ;Номер пина E.
.equ PL_D3 = PORTD ;Порт пина 4.
.equ PL_D2 = PORTD ;Порт пина 3.
.equ PL_D1 = PORTD ;Порт пина 2.
.equ PL_D0 = PORTD ;Порт пина 1.
.equ D3 = 3 ;№ Пина D7 в порту.
.equ D2 = 2 ;№ Пина D6 в порту.
.equ D1 = 1 ;№ Пина D5 в порту.
.equ D0 = 0 ;№ Пина D4 в порту.
Мое устройство работает на часовом кварце. И, в принципе, задержку я выставляю 1, 1. Но без нее все же нельзя. Сделал 2-х регистровую задержку, т.к. возможно понадобится работать на большей частоте, а контроллер (LCD) чувствителен к задержкам.
Пример использования библиотеки:
Спойлер

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

.include "m8def.inc"
.def Temp = R16
.def Temp1= R17
.def Max  = R29                         ;Храним 0xFF.

;Описание портов LCD.---------------------------------------------------------------------------
.equ PAUZA_LCD = 1                      ;Длительность паузы при подаче на LCD.
.equ PAUZA_LCD1= 1
.equ PRS       = PORTC                  ;Порт RS.
.equ RS        = 2                      ;Номер пина RS.
.equ PEE       = PORTC                  ;Порт E.
.equ E         = 3                      ;Номер пина E.
.equ PL_D3     = PORTD                  ;Порт пина 4 (D7).
.equ PL_D2     = PORTD                  ;Порт пина 3.(D6).
.equ PL_D1     = PORTD                  ;Порт пина 2.(D5).
.equ PL_D0     = PORTD                  ;Порт пина 1.(D4)
.equ D3        = 3                      ;№ Пина D7 (4) в порту.
.equ D2        = 2                      ;№ Пина D6 (3) в порту.
.equ D1        = 1                      ;№ Пина D5 (2) в порту.
.equ D0        = 0                      ;№ Пина D4 (1) в порту.

ldi Max, 0xFF                  
out DDRC, Max
out DDRD, Max
out DDRB, Max

;Cтек.------------------------------------------------------------------------------------------
  	    ldi      Temp,      Low(RAMEND)
		out      SPL,       Temp
		ldi      Temp,      High(RAMEND)
		out      SPH,       Temp


.include "LCD_Init.asm"                 ;Подключаем экран.

ldi Temp, 't'
rcall LCD_OUT_D
ldi Temp, '='
rcall LCD_OUT_D
ldi Temp, '2'
rcall LCD_OUT_D
ldi Temp, '6'
rcall LCD_OUT_D

ldi Temp, ' '
rcall LCD_OUT_D

ldi Temp, 'O'
rcall LCD_OUT_D
ldi Temp, 'S'
rcall LCD_OUT_D
ldi Temp, ':'
rcall LCD_OUT_D
ldi Temp, '2'
rcall LCD_OUT_D
ldi Temp, '1'
rcall LCD_OUT_D
ldi Temp, '0'
rcall LCD_OUT_D

ldi Temp, ' '
rcall LCD_OUT_D

ldi Temp, 'L'
rcall LCD_OUT_D
ldi Temp, '='
rcall LCD_OUT_D
ldi Temp, '2'
rcall LCD_OUT_D

ldi   Temp,   0b10000000|0x40 ;Вывод команды (переносим адрес на новую строчку).
rcall LCD_OUT_Com

ldi Temp, '1'
rcall LCD_OUT_D
ldi Temp, '6'
rcall LCD_OUT_D
ldi Temp, ':'
rcall LCD_OUT_D
ldi Temp, '4'
rcall LCD_OUT_D
ldi Temp, '5'
rcall LCD_OUT_D
ldi Temp, ':'
rcall LCD_OUT_D
ldi Temp, '1'
rcall LCD_OUT_D
ldi Temp, '9'
rcall LCD_OUT_D

main: 
rjmp main

.include "LCDDraver.asm"                ;Библиотека общения с LCD по 4-м проводам (пинам).
Схема к коду:
111.jpg
(131.76 КБ) 564 скачивания
Вложения
LCDDraver.asm
(2.87 КБ) 491 скачивание
LCD_Init.asm
(588 байт) 552 скачивания
Все можно сделать, было бы желание!
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

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

Сообщение Alexeyslav »

Странно. Тоже ковыряю такой же алгоритм.

несколько у вас сложно все...

вместо

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

 sbrc   Temp,  3             
 sbi   PL_D3, D3   
 sbrs   Temp,  3       
 cbi   PL_D3, D3
Для каждого отправляемого бита, которые каждый раз дергают порт я сделал так:
данные для передачи порции из 4-х бит находятся в старших 4 битах регистра ACCUM.
tempi - временный регистр из старшей половины R16-R31

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


; Индикатор
#define	lcd_data_port	PORTB
#define	lcd_enable		PB7 
#define	lcd_rs			PB6
#define	lcd_light			PB4
#define	LCD_data_D7		PB3
#define	LCD_data_D6		PB2
#define	LCD_data_D5		PB1
#define	LCD_data_D4		PB0

.EQU LCD_data_mask		= (1<<LCD_data_D7)|(1<<LCD_data_D6)|(1<<LCD_data_D5)|(1<<LCD_data_D4)

....

 IN		tempi, lcd_data_port
 CBR	tempi, LCD_data_mask ; обнуляем биты порта где должны быть данные.
 
// Перенос кода команды на выводы порта 
 SBRC ACCUM, 7
  ORI tempi, 1<<LCD_data_D7
 SBRC ACCUM, 6
  ORI tempi, 1<<LCD_data_D6
 SBRC ACCUM, 5
  ORI tempi, 1<<LCD_data_D5
 SBRC ACCUM, 4
  ORI tempi, 1<<LCD_data_D4
  
 OUT	lcd_data_port, tempi

Да, такое расположение выводов было удобно при разводке ATMEGA48A в TQFP-корпусе.
Вадиматоричик
Грызет канифоль
Сообщения: 299
Зарегистрирован: Пн май 16, 2011 10:54:32
Откуда: Красноярск

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

Сообщение Вадиматоричик »

Ваш вариант мне знаком (когда-то делал так же). Отказался от него из-за того, что при разводке иногда легче развести ножки по разным портам, еже ли мучиться с 2-х сторонней развязкой. Пусть мой вариант выполняется немного дольше (Но из-за того, что все равно следует выжидать задержку - это незаметно), зато можно подключить LCD к разным пинам разных портов, а это для меня было главное.
Все можно сделать, было бы желание!
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

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

Сообщение HHIMERA »

Вадиматоричик писал(а):библиотека может: проводить автоматическую инициализацию на 4-х битную шину, отправлять команды/данные по ней.
И что же тут "автоматического"??? :))
Если взять STM8L или STM32... то там да, автоматически... раз пнул таймер - прошла инициализация, второй раз пнул - две строки на дисплее... Привязался к SysTick или к таймеру - бегущая строка обеспечена!!!
"Я не даю готовых решений, я заставляю думать!"(С)
Аватара пользователя
WishMasterMax
Потрогал лапой паяльник
Сообщения: 389
Зарегистрирован: Пн июл 09, 2012 11:07:59
Откуда: Ukraine
Контактная информация:

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

Сообщение WishMasterMax »

Подскажите, основаны ли эти дисплеи на на контроллере 44780 - http://radio-market.com.ua/catalog/?SEC ... T_ID=19779 и http://radio-market.com.ua/catalog/?SEC ... T_ID=19781? А то я что-то внятного описания не нашел, а неизвестно что брать не хочу. Заранее спасибо за ответ.
In me the WishMaster...
Изображение
Изображение
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

Сообщение Gudd-Head »

В гугле забанили, что ли? :) http://teidec-west.co.jp/RC1602D.pdf
Built- in controller (KS 0066 or Equivalent)
http://ru.wikipedia.org/wiki/HD44780
Контроллер HD44780 (а также совместимый с ним KS0066) ...
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
WishMasterMax
Потрогал лапой паяльник
Сообщения: 389
Зарегистрирован: Пн июл 09, 2012 11:07:59
Откуда: Ukraine
Контактная информация:

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

Сообщение WishMasterMax »

Gudd-Head, не поверите и такое было :))
О, я когда первый раз тот документ видел не заметил KS0066, а он вроде как совместим) Спасибо :))
In me the WishMaster...
Изображение
Изображение
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

Сообщение Gudd-Head »

WishMasterMax писал(а):а он вроде как совместим
Вроде различия только в расположении пинов питания.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
WishMasterMax
Потрогал лапой паяльник
Сообщения: 389
Зарегистрирован: Пн июл 09, 2012 11:07:59
Откуда: Ukraine
Контактная информация:

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

Сообщение WishMasterMax »

думаю найду что и куда :)) :solder:
In me the WishMaster...
Изображение
Изображение
Аватара пользователя
Ghost in shell
Держит паяльник хвостом
Сообщения: 936
Зарегистрирован: Пн июн 15, 2009 06:01:38
Откуда: USSR

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

Сообщение Ghost in shell »

У кого-нибудь заработал LCD с PIC16 используя библиотеки HI-TECH, Alex или Catcatcat?
Кот гуляет сам по себе, но вблизи холодильника.
Ответить

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