1
МИКРОКОНТРОЛЛЕРЫ
I
П р е о б р а зо в а н и е ч и сел
Преобразование чисел используется в
случаях, когда необходимо вывести
число, например, на семисегментный
индикатор. Традиционно для решения
такой задачи используются специаль-
ные способы представления числа -
т.н. BCD-числа (Binary Coded Decimals
-двоично-кодированные десятичные).
В свою очередь зти числа делятся на
упакованные и неупакованные.
Неупакованное BCD-число пред-
ставляет собой группу байтов, в
каждом из которых может храниться
число в диапазоне от 0 до 9. Ника-
кие другие числа в неупакованном
BCD-формате хранить в байте недо-
пустимо. В свою очередь, упакован-
ное BCD-число отличается тем, что
в байте можно хранить два числа в
диапазоне от 0 до 9: одно - в млад-
шей, и одно - в старшей тетраде бай-
та. Фактически в формате BCD чис-
ло хранится как бы разобранным на
его десятичные цифры. Такое число
уже очень просто преобразовать в
пригодный для вывода формат, на-
пример, в код символа, выводимого
на индикатор. Разберем сначала пре-
образование числа из двоичного
представления в ВСО-формат.
Для чисел, не превышающих по
величине 99, существует простей-
ший способ преобразования - таб-
личный. Вот как это делается (пред-
полагаем, что преобразуемое число
находится в ячейке %а
2
, там же бу-
дет находиться и результат преобра-
зования):
mdal
%a0,table
r
Загрузить адрес таблицы перекодировки в BCD.
mdah
%al,table
add
%a0,%a2
; Сложить адрес с преобразуемым числом.
adc
%al
; Распространить перекос.
mtpr
#6,%a0
; Загрузить полученный адрес в IR1.
mtpr
#7,%al
mov
%a2,%d7
'*
Заменить двоичное число его BCD-представлением.
.byte
OOh, Olh, 02h, 03h, 04h, 05h, 06h, 07h, 08h, 09h
.byte
lOh, llh, 12h, 13h, 14h, 15h, 16h, 17h, 18h, 19h
.byte
90h, 91h, 92h, 93h, 94h, 95h, 96h, 97h, 98h, 99h
Как видите, мы просто выбираем из
таблицы готовые значения. Несмотря
на “игрушечность” этого программного
кода и большой расход памяти под таб-
лицу, во многих случаях его более чем
достаточно для работы (кстати, по ско-
рости преобразования числа этот код
- самый быстрый). Следующий, тоже
достаточно простой способ преобразо-
вания - последовательное вычитание
из преобразуемого числа степеней чис-
ла
10
(например,
10000
,
10 00
,
10 0
,
1 0
,
1). Этот код также бывает полезным во
многих случаях, особенно, если преоб-
разуемое число находится в диапазо-
не
0
.. 10000. Пример кода, в силу его
очевидности, не приводится.
“Полноценное” преобразование
двоичного числа в ВСО-формат выпол-
няется следующим образом. Преобра-
зуемое число бит за битом вдвигается
в ячейки, в которых формируется гото-
вый результат преобразования. Если в
каком-либо байте (для неупакованных
ВСО-чисел) или тетраде (для упакован-
ных ВСО-чисел) получилось число
больше допустимого диапазона (0.
.9),
оно приводится в формат допустимого
(как именно -
см. там же),
а в следую-
щий байт (тетраду) отправляется бит
“переноса”. В примерах приведен толь-
ко один вариант преобразования - для
неупакованных ВСО-чисел. Автортио-
тивируетзтотем, что ВСО-формат при-
меняется в подавляющем большинстве
случаев исключительно для немедлен-
ного преобразования его в 7-сегмент-
ный код либо для вывода на ЖКИ, по-
этому формировать упакованный ВСО-
формат (кстати, формируется он на-
много дольше и сложнее), а затем его
тут же распаковывать автору представ-
ляется, мягко говоря, неумным. Что же
касается перерасхода памяти под не-
упакованный формат, в данном случае
он составляет всего 5 байт, что, по мне-
нию автора, снимает всяческие моти-
вировки по ее экономии.
Обратное преобразование - из
ВСО-формата в двоичное представле-
ние, -требуется гораздо реже, но, тем
не менее, может иметь место. Для его
реализации можно применить, во-пер-
вых, тот же табличный метод, которым
мы пользовались при преобразовании
в ВСО-формат. “Полноценное” же пре-
образование в данном случае выпол-
няется вполне очевидным способом -
циклическим умножением формируе-
мого результата на
1 0
и сложением его
с очередной преобразуемой цифрой
(начиная со старшей). Пример такого
преобразования
см. там же.
И еще один частный случай преоб-
разования - преобразование числа в
семисегментный код, который часто
используется при работе с микроконт-
роллером. Такое преобразование
обычно выполняется в два этапа- вна-
чале число преобразуется в неупако-
ванный BCD-формат, а затем - в се-
мисегментый код. Последнее преобра-
зование выполняется вполне очевид-
ным образом - через таблицу, так же
как мы преобразовывали число в BCD-
формат. Более того - для чисел, не
превышающих по величине 99, преоб-
разование числа в 7-сегментный код
можно выполнить напрямую через таб-
лицу, минуя преобразование в BCD-
формат. Пример такого преобразова-
ния можно найти в статье автора ‘Трех-
цветный цифровой термометр” (жур-
нал “Радиолюбитель” №4 за 2005 г.).
Код программы (файл
example 1 zip)
вы можете загрузить с сайта нашего
журнала:
(раздел “Программы”)
---------------------------------- 1 41
Радиолюбитель - 0 3 /20 06 |
предыдущая страница 40 Радиолюбитель 2006-03 читать онлайн следующая страница 42 Радиолюбитель 2006-03 читать онлайн Домой Выключить/включить текст