Декодирование сигналов мультиплексированного ЖКИ

u_nkn6n68u0jh0epgpnnh4moype.jpeg

В этой статье я расскажу о том, как работает жидкокристаллический индикатор (ЖКИ) с точки зрения сигналов, как эти сигналы декодировать и использовать для своих целей.

Иногда возникают вопросы, связанные с эксплуатацией ЖКИ. Например, потек экран устройства, а заменить не на что:

zrqezi27kz7bsxdjalerlt7zznm.jpeg

Или экран ЖКИ очень маленький, в темноте его не видно, и стоит задача преобразовать вывод вместо ЖКИ на светодиодный или другой дисплей.

Встречал еще такую проблему: имеется кондиционер, и для улучшения его эксплуатационных характеристик необходимо включать дополнительный вентилятор при появлении на экране символа «снежинка».

i4yzmymkjbnqtcd1orm7ibh9ce0.jpeg

Таких вопросов, думаю, придумать можно много, и стоит общая задача — научиться декодировать информацию, выводящуюся на ЖКИ, и использовать по своему назначению.

Жидкокристаллические индикаторы ввиду своих физических особенностей требуют выполнения двух главных требований:
1. Напряжение между электродами должно быть не менее трех вольт.
2. На электроды необходимо подавать переменное напряжение без какой-либо постоянной составляющей.

Если не выполнить первое требование и подать между общим и сегментным электродами напряжение меньше, чем 3 вольта, то сегмент просто не будет виден.

Если же не выполнить второе требование, то индикатор может довольно быстро деградировать (испортятся жидкие кристаллы). Индикаторы первых выпусков особенно сильно страдали от невыполнения второго требования, и вполне могла возникнуть ситуация, когда у пользователя на индикаторе навсегда оставалось время, когда в часах села батарейка.

tanoi3eg5n9ps_ffjqcfixxodki.jpeg

В жидкокристаллическом индикаторе используются общие и сегментные электроды. Сегментные электроды находятся с одной стороны ЖКИ, общие — с противоположной. Между ними расположены жидкие кристаллы. Если подать переменное напряжение, то жидкие кристаллы изменят свою плоскость поляризации и, с учетом поляризационных фильтров по сторонам индикатора, не будут пропускать сквозь себя свет, и сегмент будет отображаться черным цветом.

xqpu3vlr_mtlfyqzdim9zmsgjc4.png

Вот фотография индикатора калькулятора, где видны электроды.

jx3cpwsaty40mpgkuhgv8pmcl6e.jpeg

Как я говорил, между сегментным и общими электродами необходимо подавать переменное напряжение. Его частота должна быть более 30 герц. Вместо синусоиды подают либо сигналы специальной формы, либо меандр (меандр — это периодический сигнал прямоугольной формы, в котором длительности импульса и паузы равны), который тоже можно с некоторым допущением считать упрощенной синусоидой.
Самые простые ЖКИ имеют один общий электрод. Количество выводов в индикаторе равно количеству сегментов плюс общий вывод.
На общий вывод подается меандр. А на сегментные — тоже меандр. Отличие состоит в том, что если сегмент должен отображаться, то меняются местами импульс и интервал (фаза, относительно сигнала общего электрода). Если сегмент не должен отображаться, то фазы совпадают.

fynuuiy9wgvulfn1sgaji4etmvw.gif

С точки зрения индикатора, когда совпадают фазы, то между электродами напряжение всегда 0 вольт. А если фазы не совпадают, то между электродами напряжение всегда переменное и равно 3 вольтам.

Вывод на индикатор с одним общим электродом довольно прост, но если количество сегментов велико, то соответственно увеличиваются затраты как на разводку индикатора, так и на резервирование соответствующего количества выводных портов на контроллере.

Чтобы уменьшить количество сегментов используют два или более общих электродов. С одной стороны это в разы уменьшает количество сегментных выводов, но с другой стороны усложняет вывод с точки зрения генерации сигналов. Идея в мультиплексировании сигналов заключается в том, что один сегментный вывод отвечает за отображение двух и более сегментов.
Если в индикаторе с одним общим сигналом один сегмент управляется постоянно, то при мультиплексировании количество интервалов времени, когда управляется один сегмент, делится на количество общих сигналов. То есть сначала управляются (отображаются или гасятся) сегменты с общим сигналом COM1, в следующий интервал времени управляются сегменты, связанные с общим сигналом COM2 и т. д. по количеству общих сигналов.
Поскольку интервалы времени, когда управляется один сегмент, сокращается, то соответственно сокращается время его отображения, и чем больше общих сигналов, тем меньше контрастность изображения в целом.

Вместо простого меандра при нескольких общих сигналов необходимо подавать сигналы специальной формы с промежуточными напряжениями. Промежуточные напряжения нужны для того, чтобы выполнялись те два требования, которые я описал выше.

Я снял небольшое видео, где можно на осциллографе посмотреть осциллограммы с реальных часов с одним общим электродом и калькулятора с тремя общими.

4nbwz8kdlpzjvaqg2isx8hms5d4.jpeg

Это часть схемы микрокалькулятора «Электроника МК-62». В индикаторе используются три общих электрода. На схеме видна разводка общих и сегментных электродов.

Полная схема доступна по ссылке: habrastorage.org/webt/bq/2g/gz/bq2ggzcgik-bhsr5p-hfkgndnfe.jpeg

8unmahpothc_o-ozyu_2acve4rs.png

Для удобства я расцветил область ответственности общих электродов. На схеме общие электроды обозначены как О1, О2 и О3.

Сегментные я тоже раскрасил, чтобы было удобно видеть, за какие сегменты отвечают сегментные выводы.

latvp12kszoyhpsix3cwpkoi7r8.jpeg

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

plrdqlrfzobvmk9t_aamvlhh9ls.png

Первые три эпюры соответствуют общим электродам. Я их расцветил соответственно рисунку индикатора на схеме.

jr448mccwcpsynohkz0jlgqizl8.png

Нас будут интересовать только раскрашенные «полочки» сигналов, уровни которых находятся на вершинах осциллограмм. Это те моменты, когда управляются (отображаются или гаснут) сегментные выводы.
В этих эпюрах видно, что сначала внизу «работает» общий О2, затем полочка у О1, потом у О3. После этого полочки так же (только наверху) сначала у О2, затем у О1 и дальше — О3. Так они и чередуются, соблюдая условие переменного напряжения.

x3i6htkapa7omcxuuuyiijbbpq8.png

Теперь, когда «расшифрованы» эпюры общих сигналов, можно посмотреть на эпюры сегментных сигналов, которые я тоже раскрасил. Эти эпюры от реального отображения на индикаторе цифры 0. (с точкой) в первом знакоместе.
Форма импульсов сегментных и общих сигналов выбрана с расчетом выполнения первого требования — напряжение между электродами должно быть равно трем вольтам. Жидкие кристаллы и поляризационные фильтры проектируются с таким расчетом, чтобы отображаться только при трех вольтах, а если напряжение ниже, то сегменты не будут видны.
Вы можете самостоятельно разобраться, какие конкретно сегменты будут показываться или гаснуть при приходе соответствующих им общих сигналов.

Теперь — после того, как мы разобрались с принципом отображения сегментов, можно сделать довольно простой декодер.

Когда я писал, что между электродами необходимо подавать переменное напряжение, это верно и правильно, но только с точки зрения электродов. Воспользуемся открытием великого Эйнштейна, которое гласит: «все относительно», и привяжемся к одному из полюсу сигналов (отрицательному). Все остальные уровни автоматически станут положительными.
На показанной выше схеме разработчики уже ушли от разнополярного напряжения и сделали сигналы с уровнями 0 и -3 вольта.
Поскольку логика нашего устройства — положительная, то будем считать, что напряжение, показанное в схеме как -3 вольта, в нашей схеме будет равно нулю, а напряжение 0 вольт — плюс три вольта.
В нашей схеме, когда приходит нижняя полочка, то это будет 0 вольт (сигнал GND — земля). Когда приходит верхняя полочка — это +3 вольта. А остальные напряжения сделаны для формирования синусоиды, и мы будем их игнорировать.

9l4wkgpqnh2kkr0-7hexhzpgisq.png

Нам необходимо применить два компаратора. Компаратор работает просто: у него есть два входа (положительный и отрицательный) и один выход. Когда напряжение на положительном входе больше, чем на отрицательном, на выходе появляется единица, и наоборот — когда на положительном выходе напряжение меньше, чем на отрицательном, то на выходе — ноль.

Первый компаратор (зеленая линия) будет отслеживать приход верхней полочки общего сигнала. Второй компаратор (красная линия) будет отслеживать приход сегментного сигнала. Уровень зеленой линии подается на отрицательный вход первого компаратора, а уровень красной линии — на отрицательный вход второго компаратора. На положительные же входы компараторов подаются соответственно общий сигнал и сегментный сигнал. Уровень общего сигнала выбран наверху, а сегментного — в нижней части — для того, чтобы «поймать» момент, когда сегмент отображается (те самые 3 вольта). В других случаях он не отображается. Обратите внимание на самую нижнюю эпюру в схеме калькулятора — те моменты, когда остальные сегменты не горят — там сигналы не доходят ни до верхнего, ни до нижнего уровня.

В результате в момент желтой вертикальной линии на выходах компараторов мы поймаем три вольта разницы между сигналами, когда сегмент горит, и 0 вольт, когда не горит.

Итак, мы поймали момент, когда нужный сегмент отображается (или гасится). Теперь этот момент надо зафиксировать. Для фиксирования этого момента будем использовать регистр с защелкой типа 74HC374. На вход регистра подадим сигнал от компаратора № 2, где отследили сегментный сигнал, а на тактовый вход защелки — выход с компаратора № 1, где начнется логическая единица в момент прихода нужного нам общего сигнала.
После того, как регистр защелкнется по положительному скачку входа CLK, на его выходе сигнал не будет изменяться до нового прихода положительной полочки нужного нам общего сигнала.

Для отслеживания одного сегмента (пусть это символ снежинки) схема будет выглядеть так:
ykrzuvkpqmusqgk0lbdeq1l34ec.gif

Здесь на схеме компаратор U1 отслеживает нижнюю полочку сегментного сигнала, у которого уровень будет ниже, чем установлено на переменном резисторе RP1, и ставит ноль на его выходе. Второй компаратор отслеживает приход верхней полочки общего сигнала и положительным фронтом защелкивает регистр.

Конденсатор C1 необходим, чтобы немного задержать детектирование общего уровня и сместить момент фиксации не в самом начале общего уровня (в это время сегментный может запоздать или будут какие-то переходные процессы), а немного спустя (на рисунке — желтая линия в середине полочки). На выходе регистра будет логический ноль, когда сегмент отображается, и логическая единица, когда сегмент не отображается.

Такая схема нужна для детектирования каждого сегмента. Основная сложность такой схемы — для каждого сегментного и общего сигнала необходим отдельный компаратор, и количество выходов регистров равно количеству сегментов. Но с другой стороны все эти компараторы и регистры сейчас стоят копейки.
Чтобы упростить работу и проверить работоспособность всего, что я написал, я смастерил небольшую платку, на которой развел несколько компараторов и регистров.

ukcjphxv71j90r77jjt7rqa9uve.jpeg

zytx84c9alzfjvde3rtmhcgpx8c.jpeg

Схема: habrastorage.org/webt/wk/1i/kg/wk1ikgqdavyjnxcqsqlr2174jke.jpeg

Описание схемы такое же, как и для одного сегмента, только умноженное на 16 сегментных и один-два общих сигнала (количество выбирается перемычкой).
В плате предусмотрены транзитные входы-выходы питания и уровней компараторов, чтобы сэкономить на деталях и настройке.

Вот еще одно видео, где описывается работа этой платы и показывается, как работает детектирование:

Детектирование калькулятора интересно только в академических целях, а для себя на базе этих плат сделал реальное устройство — светодиодные часы на базе советских часов «Электроника 55».

17xci63clk-p3yge_dtlqntdbr8.jpeg

ed4j6q6el4s48byybjvzcu3oqxs.jpeg

o9vyuzvnrv7lzrhgto67f7qxgp4.jpeg

В часах довольно много сегментов, и пришлось использовать четыре платы.

Эти платы также позволяют мультиплексировать выходы регистров. То есть выходы каждого регистра можно объединить в одну 8-битовую шину. В платах предусмотрено отключение выходов (нога 1 у каждого регистра). Для отключения на каждый регистр подается логическая единица (например, с микросхемы-мультиплексора типа 74HC137), а на тот регистр, с которого надо снимать данные — логический ноль. Тогда, поочередно выбирая нужный регистр, можно считывать данные с шины ЖКИ, например, другим микроконтроллером, и дальше обрабатывать по своему усмотрению. Причем выборку можно производить асинхронно от схемы декодирования с любой скоростью.

Вот таким образом можно считывать информацию с LCD и использовать в своих целях. Спасибо за внимание.

© Habrahabr.ru