Каждый знак на семисегментном индикаторе — набор горящих сегментов. Если сегменты подключены к выводам одного порта, этот набор записывается одним байтом, и вывод цифры сводится к записи байта из таблицы. Калькулятор строит такую таблицу для любого подключения, для общего катода и общего анода, и сверяет начертания с таблицами четырёх дешифраторов.
Сегменты и биты
Сегменты обозначают буквами: a — верхний, дальше по часовой стрелке b, c, d (нижний), e, f, g — средний, dp — точка. В таблице кодов Microchip AN557 сегмент a стоит в бите 0, g — в бите 6, а бит 7 всегда равен нулю — калькулятор отдаёт его точке. В AN557 сегменты питает порт, а ток разрядов замыкают внешние транзисторы (рис. 1), поэтому мы читаем эти коды как коды для общего катода: при таком подключении код нуля — 0x3F (сегменты a–f).
При другом подключении меняется только порядок битов. Например, у драйвера MAX7219 в режиме без декодирования бит D7 управляет точкой, D6 — сегментом A, а D0 — сегментом G. Тот же ноль для него — 0x7E. Калькулятор принимает любой порядок: выберите готовый или задайте свой, перечислив сегменты от бита 0 до бита 7, — так удобно, если сегменты разведены на плате по выводам как получилось.
| Подключение | Ноль | Единица | Восьмёрка с точкой |
|---|---|---|---|
| a — бит 0 (AN557), общий катод | 0x3F | 0x06 | 0xFF |
| a — бит 0, общий анод | 0xC0 | 0xF9 | 0x00 |
| MAX7219 без декодирования | 0x7E | 0x30 | 0xFF |
Общий катод и общий анод
У индикатора с общим катодом сегмент горит при высоком уровне на его выводе, с общим анодом — при низком. Поэтому коды для общего анода — инверсия кодов для общего катода: 0x3F превращается в 0xC0. Дешифраторы тоже делятся на два вида: по данным TI, 74LS47 имеет выходы с активным низким уровнем и рассчитан на общий анод, а 74LS48 и CD4511B — на общий катод. Ток сегмента в любом случае ограничивают резистором — его номинал посчитает калькулятор резистора для светодиода.
Шестёрка, семёрка и девятка
Цифры 6, 7 и 9 бывают двух начертаний — с «хвостиком» и без:
| Таблица | 6 | 9 | 7 |
|---|---|---|---|
| CD4511B, 74LS47/48 | c d e f g — без a | a b c f g — без d | a b c |
| MAX7219, Code B | a c d e f g | a b c d f g | a b c |
| Microchip AN557 | a c d e f g | a b c f g — без d | a b c |
TI прямо пишет в даташите 74LS47, что 74LS247 и 74LS248 рисуют 6 и 9 с хвостиками и выпущены, чтобы у разработчика был выбор из двух начертаний. Если в одном приборе стоят индикаторы с дешифратором и с программным выводом, начертание лучше сделать одинаковым — переключатель «Начертание 6 и 9» подстроит таблицу под нужную микросхему. Семёрку все четыре таблицы рисуют сегментами a, b, c; вариант с сегментом f встречается в других шрифтах и включается отдельно.
Коды больше девяти
Дешифратор двоично-десятичного кода получает четыре бита, то есть ещё шесть кодов кроме 0–9, и разные микросхемы показывают на них разное. CD4511B на кодах 1010–1111 гасит индикатор (рис. 8 даташита). 74LS47/48 выводят на кодах 10–14 особые символы из сегментов d, e, g и других, а на 15 гасят индикатор. MAX7219 в режиме Code B выводит минус, E, H, L, P и пробел. Из букв шестнадцатеричных цифр в этих таблицах есть только E — у MAX7219 это код 1011; A, b, C, d и F ни один из трёх дешифраторов не рисует — их выводят программно, как в AN557.
Пример: четыре разряда на микроконтроллере
Для текста «12.34» на индикаторе с общим катодом и подключением «a — бит 0» калькулятор выдаёт массив 0x06, 0xDB, 0x4F, 0x66: у двойки добавлен бит 7, точка. В динамической индикации разряды включают по очереди, и в каждый момент на порт сегментов выводится один байт из такого массива; схема, частота обновления и токи — в статье «Семисегментные индикаторы». С дешифратором CD4511B таблица не нужна — он сам переводит двоично-десятичный код в сегменты, а MAX7219 умеет и то и другое: режим Code B для цифр и режим без декодирования для произвольных знаков.
Частые вопросы
Какой код у цифр 0–9 для семисегментного индикатора с общим катодом?
Если сегмент a подключён к биту 0, b — к биту 1 и так далее до g на бите 6 и точки на бите 7, коды по таблице Microchip AN557: 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x67. Девятка здесь без нижнего сегмента; с ним её код — 0x6F. При другом подключении сегментов к выводам коды другие — калькулятор пересчитает их под любой порядок.
Чем коды для общего анода отличаются от кодов для общего катода?
Все биты инвертированы. У индикатора с общим анодом общий вывод подключён к плюсу, и сегмент горит, когда на его выводе низкий уровень. Поэтому ноль для общего анода — 0xC0, а не 0x3F: это 0x3F, в котором каждый бит заменён на противоположный. Дешифраторы тоже бывают двух видов: у 74LS47 выходы с активным низким уровнем — для общего анода, у 74LS48 и CD4511B — с активным высоким, для общего катода.
Почему шестёрка и девятка выглядят по-разному на разных приборах?
Это разные начертания цифр. CD4511B и 74LS47/48 рисуют шестёрку без верхнего сегмента и девятку без нижнего. TI в том же даташите указывает, что 74LS247 и 74LS248 рисуют 6 и 9 с «хвостиками» и выпущены, чтобы дать выбор из двух шрифтов. MAX7219 в режиме Code B тоже рисует хвостики у обеих цифр, а таблица Microchip AN557 — только у шестёрки. Шестёрка без хвостика сегмент в сегмент совпадает с буквой b.
Можно ли вывести на семисегментный индикатор любые буквы?
Только те, что складываются из семи сегментов, и начертание у них условное. В таблицах дешифраторов есть немногие: AN557 даёт A, b, C, d, E, F для шестнадцатеричных цифр, MAX7219 в режиме Code B — минус, E, H, L и P. Остальные знаки рисуют сами, задав маску сегментов, — при этом буквы вроде M, W или X на семи сегментах не читаются.
Источники
- Texas Instruments. CD4511B Types: CMOS BCD-to-7-Segment Latch Decoder Drivers (SCHS072B, revised July 2003) — рис. 8, таблица истинности при LT = BL = 1, LE = 0: коды 0–9, шестёрка без сегмента a, девятка без сегмента d, коды 1010–1111 гасят индикатор; выходы отдают ток — для общего катода
- Texas Instruments. SN5446A, '47A, '48, SN54LS47, 'LS48, 'LS49 BCD-to-Seven-Segment Decoders/Drivers (SDLS111, March 1974, revised March 1988) — с. 3: '46A, '47A, 'LS47 — выходы с активным низким уровнем для общего анода, '48, 'LS48 — с активным высоким; '246, '247, 'LS247, 'LS248 рисуют 6 и 9 с «хвостиками» — выбор из двух начертаний; рис. «Numerical designations» и таблицы T1, T2: коды 10–14 — особые символы, 15 — гашение
- Maxim Integrated (Analog Devices). MAX7219/MAX7221 Serially Interfaced, 8-Digit LED Display Drivers (19-4452, Rev 6, 8/21) — табл. 5 «Code B Font»: 0–9, «-», E, H, L, P, пробел, шестёрка и девятка с хвостиками, точка — бит D7; табл. 6: в режиме без декодирования D7 — DP, D6 — A … D0 — G
- Microchip. AN557: Four-Channel Digital Voltmeter with Display and Keyboard (DS00557D) — таблица кодов в листинге: B'00111111' — 0 … B'01110001' — F, сегмент a в бите 0, бит 7 — 0; единица зажигает сегмент, то есть это коды для общего катода — наш вывод из рис. 1 и текста: сегменты питает PORTB, ток разрядов замыкают внешние транзисторы или ULN2003; шестёрка с сегментом a, девятка без сегмента d
Где пригодится
- Безразличные наборы (don't care)Входные комбинации, для которых значение выхода не важно
- Двоично-десятичный код (BCD)Каждая десятичная цифра — в своих четырёх битах
- Семисегментный индикаторСемь сегментов a–g и точка: цифры 0–9 и коды для них
- Общий анод и общий катодОбъединённые аноды или катоды светодиодов индикатора и что из этого следует
- Гашение незначащих нулей (ripple blanking)Цепочка RBI → RBO гасит ведущие нули многоразрядного индикатора
Встроить калькулятор на свой сайт
Скопируйте код и вставьте его в HTML страницы, статьи или вики. Виджет бесплатный, без рекламы, счётчиков и cookie. Условие одно — ссылка на GAW под рамкой остаётся на месте. Подробнее о виджетах
<iframe src="https://gaw.ru/embed/seven-segment-decoder/" title="Коды семисегментного индикатора" width="100%" height="640" style="border:1px solid #e3e5e9;border-radius:8px" loading="lazy" allow="clipboard-write"></iframe>
<p style="margin:6px 0 0;font-size:14px">Калькулятор: <a href="https://gaw.ru/tools/seven-segment-decoder/">Коды семисегментного индикатора</a> — GAW.ru</p>Автоподстройка высоты рамки
Если сайт разрешает скрипты, добавьте этот код один раз в любом месте страницы: рамка будет менять высоту вместе с результатом расчёта.
<script>window.addEventListener("message",function(e){if(e.origin!=="https://gaw.ru"||!e.data||e.data.type!=="gaw:embed-height")return;var f=document.querySelectorAll('iframe[src^="https://gaw.ru/embed/"]');for(var i=0;i<f.length;i++)if(f[i].contentWindow===e.source)f[i].style.height=e.data.height+"px"})</script>Обновлено .
Нашли ошибку в расчёте?