Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
Преобразование кода из одной позиционной системы счисления в другую осуществляется делением исходного числа на основание новой системы счисления. При этом деление должно выполнятся по правилам исходной системы счисления.
Преобразование двоичного числа в двоично-десятичное в этом случае должно осуществляться делением исходного числа на 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 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!