Преобразование кодов из одной системы счисления в другую

 

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

Преобразование двоичного числа в двоично-десятичное в этом случае должно осуществляться делением исходного числа на 10. Причем, деление должно осуществляться по правилам двоичной арифметики. Для этого необходимо исходный двоичный n - разрядный код числа разделить на двоичный код числа 10 (1010).

Пусть необходимо выполнить преобразование 10-ти разрядного двоичного числа, хранящегося в памяти данных микроконтроллера, в двоично-десятичное.

Так как регистры общего назначения памяти данных ОМК PIC 16/17 восьмиразрядные, то для хранения исходного числа необходимо будет использовать два регистра, содержащие, например, переменные START и ENDSTART. Предположим, что восемь старших разрядов исходного числа будут находится в переменной START, а младшие два разряда в битах 0 и 1 переменной ENDSTART.

При преобразовании двоичного числа в двоично-десятичное обычно требуется выполнить максимум два шага деления. Причем, на первом шаге необходимо будет проделать шесть вычитаний числа 1010 из делимого (если исходное число, например, восьмиразрядное). Но, так как в нашем случае число 10-разрядное, то потребуется восемь вычитаний. При этом, уже после 2-го вычитания можно будет сдвинуть делимое (START) на два разряда влево и записать в младшую часть делимого содержимое 0-го и 1-го битов переменной ENDSTART (младшие два разряда исходного числа). После этого необходимо продолжить алгоритм деления.

Для упрощения примера программы в данном случае принято, что исходное двоичное число, заданное в переменных START и ENDSTART, не превышает его десятичного эквивалента 999. В таком случае, результат преобразования состоит из 12 бит и представляет собой три 4-х разрядных двоичных числа (3-и декады). Таким образом, для хранения результата преобразования понадобится три переменные: DEC1 - первая декада (единицы, представляют собой остаток от деления исходного числа на 10); DEC2 - вторая декада (десятки, представляют собой остаток от деления на 10 полученного частного); REZ - третья декада(сотни, являются частным от второго деления). Причем, переменная REZ будет использована также для хранения промежуточных результатов деления.

Для подсчета количества вычитаний потребуется переменная TIME, которая будет использоваться в качестве программируемого счетчика. При этом, константа, предварительно загружаемая в этот счетчик, определяется разрядностью исходного двоичного числа (делимого).

Очевидно, что деление на 1010 (переменная TEN) целесообразно представить в виде процедуры (DIV10), так как данную операцию во время преобразования придется повторять многократно. Количество повторений опять таки определяется разрядностью исходного двоичного кода. Так, если это число находиться в пределах от 0 до 99, то достаточно одного вызова процедуры DIV10. В этом случае результат преобразования будет находиться в переменных START и REZ. Если разрядность исходного числа будет больше, то потребуется несколько вызовов этой процедуры. Причем, в промежутках между вызовами процедуры DIV10 необходимо, очевидно, будет настраивать переменную TIME. В нашем случае к процедуре DIV10 придется обращаться трижды.

Текст программы преобразования десятиразрядного двоичного числа в двоично-десятичное (BIN-DEC1), написанный на основании приведенных выше рассуждений, приведен ниже:

 

; Текст процедуры BIN-DEC1

LIST P=PIC16C84

; Секция заголовка

; Описание специальных регистров

STATUS EQU 03H

; Описание регистров памяти данных и переменных

START EQU 0CH ; Делимое (8 старших разрядов

; исходного числа)

ENDSTART EQU 0DH ; Делимое (2 младших разряда

; исходного числа)

TEN EQU 0EH ; Делитель

REZ EQU 0FH ; Переменная для хранения резуль ; тата преобразования (3-й дека

; ды-сотни) и промежуточных ре-

; зультатов деления

TIME EQU 10H ; Переменная для задания коли-

; чества операций вычитания

DEC1 EQU 11H ; Переменная для хранения пер-

; вой декады 2/10 числа (едини-

; цы)

DEC2 EQU 12H ; Переменная для хранения вто-

; рой декады 2/10 числа (десятки)

; Описание битов регистра STATUS

C EQU 0H ; Флаг переноса/заема

; Рабочая секция

; Начало исполняемого кода

ORG 0

GOTO BEGIN

ORG 100

BEGIN

; Начало первого шага деления

CLRW ; Очистить регистр W

MOVLW B’0000 0010’ ; Запись константы в счетчик

MOVWF TIME ; количества вычитаний

CALL DIV10 ; Вызов процедуры деления на 10

RLF START, 1 ; Сдвиг делимого на два

RLF START, 1 ; разряда влево

MOVLW ENDSTART ; Загрузить младшие разряды

; делимого в регистр W

ADDWF START ; Загрузить 9-й и 10-й биты

; исходного числа в младшие

; разряды регистра START

; Окончание первого шага деления

MOVLF B’0000 0100’

MOVWF TIME

CALL DIV10

MOVLF START ; Сохранение младшей декады

MOVLW DEC1 ; 2/10 числа в регистре DEC1

MOVLW REZ ; Частное от деления на 1-м

MOVWF START ; шаге загрузить в START

CLRF REZ ; Очистить регистр REZ

; Начало второго шага деления

MOVLW B’0000 0100’

MOVWF TIME

CALL DIV10

DIV10 ; Процедура деления на 10

FIRST

SUBWF START

BTFSC STATUS, C ; Проверка флага переноса

GOTO NOTFLAG1 ; Если С=0, то переход по метке

ADDWF START ; Восстановление START

BCF STATUS, 0 ; Очистить флаг переноса

RLF REZ, 1 ; Сдвиг влево частного

RRF TEN, 1 ; Сдвиг вправо делителя

GOTO NOTFLAG

NOTFLAG1 RRF TEN, 1 ; Сдвиг вправо делителя

MOVLW TEN ; Загрузить делитель в W

NOTFLAG DECFSZ TIME, 1 ; Декремент TIME, пропустить

; команду, если 0 (если регистр

; TIME обнулился)

GOTO FIRST

RETURN ; Конец процедуры DIV10

END

 

Обратное преобразование (из двоично-десятичного кода в двоичный) осуществляется делением исходного числа на 16 по правилам десятичной арифметики.

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