Операции с числами в формате BCD
О двоично‑десятичных числах или числах в формате BCD было подробно рассказано в главе 14. Как ясно из сказанного там, упакованные BCD‑числа удобны для хранения данных, но неудобны для отображения и для выполнения арифметических операций с ними. Поэтому перед отображением упакованные BCD‑числа распаковывают, перемещая старший разряд в отдельный байт и заменяя в обоих байтах старшие полубайты нулями. А перед проведением арифметических действий их переводят в обычный формат, после чего опять преобразуют в упакованный формат BCD. Вот этими операциями мы и займемся. Следует отметить, что в системе команд процессора 8051 (а также и знаменитого 8086) есть специальные команды десятичной коррекции, но в AVR их нет, и придется изобретать им замену самостоятельно.
В области двоично‑десятичных преобразований (BCD‑преобразований) есть три основные задачи:
□ преобразование двоичного/шестнадцатеричного числа в упакованный BCD‑формат;
□ распаковка упакованного BCD‑формата для непосредственного представления десятичных чисел с целью их вывода на дисплей;
□ обратное преобразование упакованного BCD‑формата в двоичный/шестнадцатеричный с целью, например, произведения арифметических действий над ним.
Некоторые процедуры для преобразования в BCD‑формат содержатся в фирменной Application notes 204 . Приведем здесь вариант такой процедуры, более экономичный в части использования регистров. Исходное hex‑число находится в регистре temp , распакованный результат – в tempi: temp . Процедура довольно короткая:
Заодно приведем одно из решений обратной задачи – преобразование упакованного BCD в hex‑число, после чего с ним можно производить арифметические действия (хотя в программе далее это нам не понадобится). По сравнению с «фирменной» BCD2bin8 эта процедура хоть и немного длиннее, но понятнее и более предсказуема по времени выполнения:
Более громоздкая задача – преобразование многоразрядных чисел. Преобразовывать BCD‑числа, состоящие более чем из одного байта, обратно в hex‑формат приходится крайне редко, зато задача прямого преобразования возникает на каждом шагу. В программе далее нам понадобится преобразование 16‑разрядного hex‑числа в упакованный BCD. Реализацию этой задачи нет смысла рассматривать подробно – она во всем аналогична рассмотренному случаю, с готовой процедурой bin2BCD16 вы можете ознакомиться в исходном тексте программы TPjmeter (см. далее).
Дата добавления: 2016-05-11; просмотров: 1907;