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

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить
Друг Кота
Аватара пользователя
Сообщения: 4119
Зарегистрирован: Чт сен 12, 2013 00:54:12
Откуда: ЗаМКАДье. Там, где ЦУП

Сообщение Albert_V »

Какие проблемы с клавиатурой?
Я бы сделал так (вы можете делать как хотите):
1. (условие) не надо постоянно выводить информацию на индикатор. Согласны?
Если ДА - запрашивайте у подпрограммы вывода на индикатор вывод на индикатор (ACK + флаг "выполнение" с её стороны)
2. Если вывода на индикатор нет (флаг "выполнение" со стороны программы вывода на индикатор сброшен) - выставляете A0, E и R/W в "0" и опрашиваете клавиатуру (с использаванием DB4-DB7).
Поясните, пожалуйста, что такое МЭИН? Если это MAIN - это всё то, что выполняется не по прерываниям.
________________________
Если хотите - пишите в ЛС или создайте новую тему. Здесь это уже могут расценить как Off-Top.
С Уважением, Альберт (Albert_V).
Реклама
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

Тему другую создам позже, если возникнут вопросы по клавиатуре с дисплеем. )))
Как только переделаю программу на чтение флага занятости дисплея, выложу сюда результаты. Не нарьше, чем завтра...
Благодарю за помощь.
Уверен, что я на грани победы уже.
Станислав
Реклама
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Кстати, каков размер получившегося бинарника (ну, или hex-а)? Ассемблер ведь.
Контактная информация:
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

ну сейчас уже большеватый стал. Все зависит от того, сколько макросов в основной программе используется, т.е. чем больше букв выводим, тем больше код. И еще я не очень оптимально пишу ибо дилетант. :)))
А так на то сообщение, что на фотографии, компилируется в 370 Байт (4,5 %) памяти флеша у АТМеги8... :dont_know:

З.Ы. еще можно учесть, что теперь используется управление чтением/записью (правда не везде еще прописано). И подключать дисплей можно абсолютно к любым пинам любых портов контроллера.
Станислав
Реклама
Эиком - электронные компоненты и радиодетали
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 302
Зарегистрирован: Пн янв 07, 2008 16:56:28
Откуда: Минск

Сообщение levaclaus »

подскажите алгоритм записи своих символов в дисплей

выставляем адрес ячейки №0

01000000

RS=1

передаем код символа

теперь по адресу 0х00 будет наш символ.

как-то так?
Реклама
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

вы забыли еще после выставления в порт номера символа идет строб, а потом задержка (на проглатывание команды). Могу код выложить.
Станислав
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 302
Зарегистрирован: Пн янв 07, 2008 16:56:28
Откуда: Минск

Сообщение levaclaus »

давайте, може поможет
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

Вот там все. )))
Основной файл, где происходит уже использование макросов и вывод букв - LCD.asm
Файл с макросами на вывод букв и смену знакоместа в двух строках, инициализацией дисплея, задержками, стробами - LCD4_macro.inc
Файл с подпрограммами вывода данных, конфигурацией портов - LCD4.asm

Только предупреждаю, эта библиотечка не доделанная еще. Сейчас добавляю в нее чтение флага занятости. Но она работает, правда у меня с толкача..

Кажется я понял о чем вы просили... :oops:
Как вывести свой символ, а не тот что уже прошит в памяти дисплея? Если про это, тогды извиняйте, еще не реализовывал, мне пока не нужны были. А вообще, где-то несколько страниц назад про это было очень подробно расписано. ))))) :dont_know:
Там посмотрите, тоже доходчиво написано:
http://easyelectronics.ru/avr-uchebnyj- ... 44780.html
Вложения
LCD.rar
(22.01 КБ) 143 скачивания
Станислав
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Да, чтобы нарисовать один из семи своих символов - нужно подать команду с адресами
для 0-го - 0x01000000,
для 1-го - 0x01001000,
...
для 7-го - 0x01111000,
а потом 8 байт данных, рисующих этот символ.
Если нужно изменить что-то в символе, необязательно перерисовывать его весь. Можно сразу стать командой на нужную строку нужного символа, и перерисовать данными только её.

Символ будет потом доступен под номером, соотвественно, от 0 до 7.
Контактная информация:
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 302
Зарегистрирован: Пн янв 07, 2008 16:56:28
Откуда: Минск

Сообщение levaclaus »

а все оказалось проще, косяк в инициализации. У меня к примеру 16 пользовательских символов доступно для записи, но нет символа "пробел"
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

2 levaclaus:
Не может быть 16 пользовательских символов доступно. Если посмотрите на мой предыдущий пост, то видно, что для адресации пользовательских символов доступно всего лишь 8 групп по 8 адресов (0x01aaabbb).
Если всё же утверждаете, что их там 16 - как вы создаёте, допустим, символ 08 (девятый по счёту)?

2 СКАЗОЧНИК:
К слову о качестве современных компиляторов. Моя библиотека на C тоже позволяет независимую распиновку, а код, выводящий слово "test", занимает 358 байт. При этом есть функции позиционирования, вывода символа и строки.
Кстати, если хотите - скажите модель вашего контроллера и распиновку (pins.h в моих исходниках) дисплея - я могу собрать для Вас этот код, чисто для проверки работоспособности Вашего девайса. У меня всё работает - вот прямо сейчас.
Контактная информация:
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

WiseLord писал(а):При этом есть функции позиционирования, вывода символа и строки.
Это которая координатами задет положение следующего символа? типа (х,у)?
У меня она тоже есть. )))) Написана. Да и вывел я два слова на две строки.

А вот для проверки ХЕКС можно было бы залить.
А вот мои выводы:

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

/* KS0066 Data port*/
#define KS0066_D4           C
#define KS0066_D4_LINE      (1<<0)
#define KS0066_D5           C
#define KS0066_D5_LINE      (1<<1)
#define KS0066_D6           C
#define KS0066_D6_LINE      (1<<2)
#define KS0066_D7          C
#define KS0066_D7_LINE      (1<<3)
/* KS0066 control port*/
#define KS0066_RS           C
#define KS0066_RS_LINE      (1<<5)
#define KS0066_RW           B
#define KS0066_RW_LINE      (1<<0)
#define KS0066_E            C
#define KS0066_E_LINE       (1<<4)
/* Backlight port */
#define KS0066_BCKL         D
#define KS0066_BCKL_LINE    (1<<4)
Что такое BCKL_LINE не знаю. Подсветка что ли? Подсветка просто припаяна. :dont_know:

На всякий случай повторю:
DB7 - PortC.3
DB6 - PortC.2
DB5 - PortC.1
DB4 - PortC.0

E - PortC.4
RS - PortC.5
R/W - PortB.0
Станислав
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

ОК.
Поскольку названия модели МК я так и не дождался, вот hex-ы под эту разводку для нескольких сразу.
Контактная информация:
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

WiseLord писал(а):Поскольку названия модели МК я так и не дождался
Блин. Извините. Я писал название... Куда делось не понимаю... :dont_know: :shock:
А вообще АТМега8

Че то у меня в железе.... :facepalm: Не запустилась и ваша... :kill: Точнее, также с толкача пытается показать слово test.... если отверткой прикасаться к выводам кварца..

Причем подозреваю, что это такой совсем китайский дисплей все таки... Т.к. если МК перевести от внутреннего тактирования на 8 МГц, то по идее дисплей должен запуститься. Кварц не влияет, т.к. частота внутренняя, да еще и ниже, значит задержки стали в два раза больше. Но дисплей молчит...

Вот название дисплея... На него нашел только похожие даташиты, но никакого полного соответвтия.
LCM1602K-NSW-BBW-R

Производитель RoHS
Станислав
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Ээээ... стоять... кварц запускается с толкача? Да это кварц коцнутый, менять его надо. Может он стартует на овертоне а не фундаментальной частоте. Подключив частотомер можно ничего и не увидеть - емкость щупа может вернуть всё на свои места. Сделайте прошивку простую мигалку, убедитесь что с расчетным периодом в 1000мС светодиод мигает ровно с той же частотой.
Контактная информация:
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

Да ЕПРСТ... :kill: :facepalm:

Работает! Светодиод мигает. Одну секунду горит, одну нет. Могу видео заснять... Запустился без проблем сразу. Вот с таким тупым кодом:
Спойлер

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

	Start:

			

			ldi temp, 0xff
			out PORTD, temp

		ldi R16, 255			; Задержка ~1024 mсек 
		ldi R17, 255	
		ldi	R18, 50		
	
		LoopW: 	subi R16, 1		
				sbci R17, 0
				sbci R18, 0
				brcc LoopW	

				ldi temp, 0x00
				out PORTD, temp

		ldi R16, 255			; Задержка ~1024 mсек 
		ldi R17, 255	
		ldi	R18, 50		
	
		LoopE: 	subi R16, 1		
				sbci R17, 0
				sbci R18, 0
				brcc LoopE	


	rjmp Start	; Конец программы, переход на начало
Ребята, я уже психовать на него начинаю... :))) :oops:

Может я еще где туплю? Может порты как-то не так настраиваю? ну это же не 16 и старше Меги, где всяки ДЖИТАГи.
Замерил то при мигающем светодиоде (разобрался) показывает 20 мА.
Станислав
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

После подачи питания на индикатор и началом инициализации точно 20мс проходит? проверено осциллографом?
Контактная информация:
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

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

Вот сейчас поймал этот импульс добавив команды строба по обе стороны задержки... Флешку не нашел, пришлось фотографировать...
Изображение
Изображение

Еще понял одну хреновину... Мне надо разобраться, когда должны быть стробы подняты или опущены между отправками команд....
Собственно, он и вопрос. )))
Последний раз редактировалось СКАЗОЧНИК Сб янв 10, 2015 16:37:26, всего редактировалось 1 раз.
Станислав
Друг Кота
Аватара пользователя
Сообщения: 4119
Зарегистрирован: Чт сен 12, 2013 00:54:12
Откуда: ЗаМКАДье. Там, где ЦУП

Сообщение Albert_V »

Для проверки портов - отключите Watchdog и индикатор и попробуйте "искусственно зацикливать" куски программы что бы можно было осциллографом увидеть ожидаемый сигнал.
Иногда бывает полезно с отдельного выхода контроллера "создать сигнал синхронизации" для осциллографа и смотреть сигналы в ждущем режиме.
Я не знаю, какие средства отладки у Вас есть в наличии, поэтому мне сложно что-то ещё посоветовать.
С Уважением, Альберт (Albert_V).
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

Заказал еще логический анализатор... Но он пока придет... :(

Между посылками команд (или данных) где должны быть линии RS, E?
Станислав
Ответить

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