Двоично-десятичный код (BCD)
В двоично-десятичном коде число записывают не целиком в двоичной системе, а по цифрам: каждая десятичная цифра — в своей тетраде из четырёх бит. Так удобнее выводить число на индикатор и хранить время в часах реального времени.
Обновлено Редакция GAW
Двоично-десятичный код (binary-coded decimal, BCD) — способ записи десятичного числа, при котором каждая десятичная цифра кодируется отдельно четырьмя битами (тетрадой) с весами 8-4-2-1. Цифры 0–9 занимают коды 0000–1001; шесть кодов 1010–1111 в BCD не используются — по Kuphaldt, при работе с BCD они никогда не возникают.
Пример
Число 59 в двоичной системе — 0011 1011 (0x3B), а в BCD — 0101 1001 (0x59): тетрада «5» и тетрада «9». Запись в шестнадцатеричном виде совпадает с десятичной — поэтому BCD так легко читать в отладчике, но легко и перепутать с обычным числом.
| Цифра | BCD | Цифра | BCD |
|---|---|---|---|
| 0 | 0000 | 5 | 0101 |
| 1 | 0001 | 6 | 0110 |
| 2 | 0010 | 7 | 0111 |
| 3 | 0011 | 8 | 1000 |
| 4 | 0100 | 9 | 1001 |
Две цифры в одном байте — упакованный BCD; одна цифра на байт с нулями в старшей тетраде — неупакованный.
Где встречается
- Индикаторы. Дешифратор BCD в семь сегментов, например 74LS47, принимает тетраду и зажигает нужные сегменты семисегментного индикатора. Каждый разряд обрабатывается отдельно, без деления числа на 10.
- Часы реального времени. У DS3231 регистры времени и календаря хранятся в BCD: в регистре секунд биты 6–4 — десятки, биты 3–0 — единицы.
- Минимизация логики. Запрещённые коды 1010–1111 — классический пример безразличных наборов: дешифратор BCD может выдавать на них что угодно, и это упрощает его схему.
- Арифметика. Сумма двух BCD-цифр может выйти за 9 или дать перенос из младшей тетрады, и результат приходится корректировать. У AVR для этого есть флаг полупереноса H в регистре SREG: Microchip в даташите ATmega328P прямо пишет, что он полезен в BCD-арифметике.
Перевод между десятичной, двоичной и шестнадцатеричной записью делает конвертер систем счисления, а таблицы кодов для индикаторов — дешифратор семисегментного индикатора.
Частые вопросы
Как перевести число из BCD в двоичное?
Разобрать по тетрадам и собрать заново: старшая тетрада — десятки, младшая — единицы, значение = 10 · старшая + младшая. На C для одного байта: (b >> 4) * 10 + (b & 0x0F). Обратно: ((n / 10) << 4) | (n % 10). Так обрабатывают регистры часов реального времени.
Почему 0x59 в регистре секунд означает 59 секунд, а не 89?
Потому что регистр хранит упакованный BCD: старшая тетрада 5 — десятки, младшая 9 — единицы. У DS3231 по рис. 1 даташита биты 6–4 регистра 00h — десятки секунд, биты 3–0 — единицы, бит 7 всегда ноль, диапазон 00–59. Прочитав такой байт как обычное двоичное число, получишь 89.
Что будет, если подать на дешифратор BCD код больше 9?
Зависит от микросхемы. По таблице функций 74LS47 коды 10–14 выводят особые символы, а 15 гасит индикатор — производитель называет их символами для контроля входных условий. В общем случае эти коды запрещены, и при минимизации логики их считают безразличными наборами.
Источники
- Kuphaldt T. R. Lessons In Electric Circuits, Vol. IV — Digital, ch. 8 «Karnaugh Mapping», разд. «Don't care cells in the Karnaugh map» (CC BY) — BCD — четырёхбитные коды цифр 0–9; коды 1010, 1011, 1100, 1101, 1110, 1111 (Ah–Fh) не являются допустимыми кодами BCD и при работе с BCD никогда не возникают
- Texas Instruments. SN5446A, '47A, '48, SN54LS47, 'LS48, 'LS49 BCD-to-Seven-Segment Decoders/Drivers (SDLS111, March 1974, revised March 1988) — с. 3: дешифраторы BCD в семь сегментов, входы A, B, C, D; изображения для входов выше 9 — особые символы для контроля входных условий; таблица T1: коды 10–14 — особые символы, 15 — все сегменты погашены
- Maxim Integrated (Analog Devices). DS3231 Extremely Accurate I2C-Integrated RTC/TCXO/Crystal (19-5170, Rev 10, 3/15) — рис. 1: регистр 00h — бит 7 = 0, биты 6–4 — десятки секунд, биты 3–0 — секунды, диапазон 00–59; с. 12: содержимое регистров времени и календаря — в формате BCD
- Microchip. ATmega48A/PA/88A/PA/168A/PA/328/P Data Sheet Complete (DS40002061B, 2020), разд. 7.3.1 «SREG» — бит 5 — флаг полупереноса H: показывает полуперенос в некоторых арифметических операциях, полезен в BCD-арифметике
Нашли ошибку?
Смотрите также
- Шестнадцатеричная система (hex)Основание 16: одна цифра 0–F — четыре бита
- Безразличные наборы (don't care)Входные комбинации, для которых значение выхода не важно
- Семисегментный индикаторСемь сегментов a–g и точка: цифры 0–9 и коды для них
- DS3231 и DS1307Часы реального времени I²C: питание, точность, батарея, регистры
- Конвертер HEX, BIN, DECДополнительный код, float, байты и биты
- Коды семисегментного индикатораСегменты, hex-коды для анода и катода, массив на C, дешифраторы