Как работает динамическая индикация

Опубликовано: 18.02.2014 Автор: Александр

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

Динамическая индикация основывается на свойстве нашего глаза, – инерционности, т.е. если выключить источник света, то глаз все еще будет видеть его в течении некоторого времени. Поэтому, если очень быстро включать и выключать эту лампочку, то нам будет казаться, что она светиться постоянно.

Теперь стоит поговорить о самом индикаторе. Вне зависимости от типа или формы, все сегменты разделяются на группы. В каждой группе должно быть одинаковое количество сегментов. Сегменты с одинаковым назначением в разных группах соединяются параллельно. В итоге получаем выводы на схему управления: n линий с сегментов и m линий общего проводника с каждой группы. Таким образом экономятся порты ввода-вывода в схеме управления.

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

А теперь напишем с пользой для дела небольшую простенькую библиотеку для работы с семисегментными индикаторами для контроллера STM32F4. Чуть позже добавлю и для F100 серии, ну и конечно, для МК семейства AVR. Подключим такой вот индикатор

indicator

scheme   segment

Собственно схема:

Схема подключений

Вот что получилось на макетке:

common

Ну а теперь приступим к написанию программы. Использую CooCox CoIDE, но думаю, труда не составит переделать под другие идеешки.

Для начала опишем структуру для хранения информации о индикаторе:

Здесь описываются параметры портов для каждого сегмента a..g и для общих проводников – common. Также будем хранить информацию для отображения для каждого разряда digits, позицию точки – dot. ну и внутренние параметры: index – номер текущего разряда, show – флаг для отображения данных или их скрытия.

Предусмотрим несколько полезных макросов

Причем, A_ON и A_OFF это для сегмента А, остальные сегменты управляются аналогично.

Перед использованием библиотеки необходимо отредактировать значение в di_lib.h

Это задает количество разрядов.

Алгоритм работы с библиотекой следующий. Сперва необходимо включить тактирование портов, где у нас выводы на индикатор. Потом заполняется структура, где указывает порт и номер вывода для каждого сегмента и для общих проводников. Эту структуру передаем по ссылке в API функцию DI_Init():

Чтобы не мешать выполнению основной программы, работа индикации должна быть основана на таймере. Таймер настраивается на определенную частоту и в обработчике прерываний необходимо вызывать функцию DI_TimerHandler() с передачей ей указателя на структуру типа DI_TypeDef. В примере я использовал системный таймер SysTick, его настройка выглядит так:

а обработчик прерываний так:

Теперь, чтобы отобразить число на индикаторе достаточно вызвать функцию API DI_Display():

Счет разрядов справа налево.

Чтобы очистить индикатор и убрать значение есть функция DI_Clear():

Вот и все. Для более полного понимания алгоритма, посмотрите исходники, там все просто и понятно.

work1

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

Архив проекта в кокосе
Видео работы на YouTube

В рубриках: Электроника
Метки: , ,
Поделиться записью: