Библиотека HD44780 с управлением прерываниями для Arduino
У меня есть ЖК-экран HD44780, и я использую библиотеку LiquidCrystal, поставляемую с пакетом разработки Arduino. Однако это ненадежно. Я заметил некоторые проблемы с ним, и вместо того, чтобы быть управляемым прерыванием, он просто спит столько, сколько разработчик считает, что чип должен выполнить операцию.
На листах спецификации флаг занят будет установлен во время выполнения, что означает возможность прерывания.
Кто-нибудь знает о библиотеке это действительно так, и требуется ли для подключения всех 8 битов или я могу держать его на 4 контактах?
3 ответа:
Я не думаю, что вам нужно прерывать это. Глядя на Жидкокристалл.cpp в дистрибутиве Arduino вам просто нужно изменить
LiquidCrystal::write4bits
,LiquidCrystal::write8bits
, иLiquidCrystal::pulseEnable
код. Первые два метода должны начинаться с мониторинга занятой линии (BD7) перед записью данных, а последний будет изменен, чтобы удалить паузу 100us.Я думаю, что причина, по которой это не было сделано в коде по умолчанию, заключается в том, что многие пользователи этих ЖК-дисплеев просто привязывают R/W к Земле, поэтому дисплей всегда находится в режиме записи, что делает невозможным чтение сигнала занятости. Однако это передается в библиотеку, устанавливая значение _rw_pin равным -1, поэтому код импульса и записи может условно использовать вывод r/w как способ обнаружения занятости в качестве оптимизации скорости.
Можно использовать 8 бит на трех выводах; вам просто нужен регистр сдвига. Я использую HEF4094BP от mouser.com (доставка будет стоить больше, чем сам чип)
Электрическая схема и кодовые модификации для регистра сдвига приведены здесь: http://www.arduino.cc/playground/Code/LCD3wires
Некоторое время назад я модифицировал lib LiquidCrystal для поддержки флага busy. Обратите внимание, что реальная операция прерывания Не возможна - для каждого чтения вам нужно дважды переключить строку
E
nable. Поэтому вам нужно будет опросить флаг занято.Затем я сделал некоторые тесты и обнаружил, что опрос флага занятости медленнее, чем просто ожидание большинства команд. (Исключение составляют команды "очистить" и "домой"). Причина заключалась в том, что переключение между режимами чтения и режим записи требует дополнительных шагов, таких как 8 дополнительных вызовов к
digitaWrite
и 8 дополнительных вызовов кpinMode
. Даже с 16 МГц Arduinos это медленнее, чем просто ждать 100 МКС.После этого я написал библиотеку, которая управляет пин-регистрами напрямую и в массовом режиме-все 8 пин-кодов с одним доступом к регистру. После этого я был на стадионе, чтобы получить некоторую выгоду от голосования.