Одна из проблем, в общем-то, неплохого индикатора TIC5234, связана с внутренней схемой подключения ЖК-сегментов к контроллеру. Не понятно чем руководствовались разработчики, подключая отдельные элементы для разных цифр в разном порядке, но каким-то образом работать с индикатором надо. Простые алгоритмы здесь уже не подойдут и соответственно необходимо создавать что-то более громоздкое. Один из вариантов, прошедший обкатку в железе описан далее.
Сразу хочется сказать, что не следует считать приведенную программу оптимальной. Тем не менее, она относительно проста и работает. Функции написаны для компилятора mikroC под STM32, поэтому имеют некоторые нестандартные решения. В частности используются встроенные процедуры настройки портов и работы с отдельными битами.
Основу программы составляет набор функций, главная из которых showdisplay(). В этой функции организован цикл, в котором производится последовательный перебор номеров сегментов от 1 до 49. В зависимости от типа сегмента вызывается либо его обработка (для цифры), либо сразу же определяется необходимость включения (для спецсимволов). В этом же цикле организовано включение линий порта ввода/вывода для загрузки сдвигового регистра индикатора.
Функции обработки отдельных цифровых сегментов идентичны по своей структуре. Входной информацией является целое число, представляющее собой цифру от 0 до 9, либо какие-то дополнительные символы. В частности в приведенном ниже примере реализованы шестнадцатеричная система счисления с цифрами в виде A,b,C,d,E,F, а также дополнительные символы P,Hи знак градуса. Соответственно значение входной переменной может лежать в диапазоне от 0 до 18. Если это значение выходит из указанного диапазона, сегмент не отображается. Это можно использовать для организации пустого знакоместа на индикаторе. Работа функций включения сегментов сводится к возврату 1, если данный сегмент не принадлежит какому-либо символу, в котором он не горит. Несколько сложно, но проще объяснить не получается, хотя можно сделать и наоборот: сегмент будет зажигаться, если он присутствует в полученной цифре. Выбор в пользу обратной логики был сделан по причине большей компактности функций.
Перед вызовом функции showdisplay() следует установить все значения отображаемых цифр в переменных dig1-dig5, а также наличие или отсутствие спецсимволов, путем записи 1 или 0 в соответствующие переменные.