Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

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



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

Преобразование двоичного числа в двоично-десятичное в этом случае должно осуществляться делением исходного числа на 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 по правилам десятичной арифметики.

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





Дата публикования: 2014-11-03; Прочитано: 560 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.009 с)...