Перевод 0-999 Bcd В Bin И Обратно Для Pic12/16 На Asm

15-05-2013, 11:44 От: admin Посмотрели: 727
В очередной раз стал вопрос перевода трех-разрядного BCD в bin и обратно.

Организовывать перевод  циклами долго,  таблицами занимает много места

сделал методом сдвига:

itog_H:itog_L = reg_2*100 + reg_1*10 + reg_0

itog_H:itog_L = reg_2*(64+32+4) + reg_1*(8+2)+ reg_0

itog_H:itog_L= reg_2<<6 + reg_2<<5 + reg_2<<2  + reg_1<<3 + reg_1<<1 + reg_0

код занял 37 маш.команд, время выполнения 39маш.тактов

собственно код:


Spoiler
;**********************************************************************
;* перевод трезначного BCD (0-999) в двоичный формат результат в itog_H:itog_L
;* itog_H:itog_L = reg_2*100 + reg_1*10 + reg_0
;* reg_0 - регистр хранения единиц
;* reg_1 - регистр хранения десятков
;* reg_2 - регистр хранения тысяч
;* itog_L - мадший байт результата
;* itog_H - старший байт результата
;**********************************************************************
;***** itog_H:itog_L = reg_2*100 = reg_2*(64+32+4) = reg_2<<6 + reg_2<<5 + reg_2<<2
BCD_in_bin:
clrf itog_H
clrf itog_L

movf reg_2,w ; значение тысяч заносим
movwf reg_temp ; в спомагательный регистр (СР)
movwf itog_H ; и в старший бит результата

bcf STATUS,C ; значение результат сдвигаем на 2 вправо
rrf itog_H,f ; itog_H:itog_L = itog_H:itog_L >> 2
rrf itog_L,f ; эта операция эквивалентна: reg_2<<6
rrf itog_H,f
rrf itog_L,f

rlf reg_temp,f ; СР сдвигаем на 2 влево
rlf reg_temp,f ; reg_temp = reg_temp << 2

movf reg_temp,w ; itog_L = itog_L + reg_temp
addwf itog_L,f

bcf STATUS,C ; reg_temp = reg_temp << 3
rlf reg_temp,f
rlf reg_temp,f
rlf reg_temp,f ; если возник переполнение С=1

btfsc STATUS,C ; увеличиваем старший бит результата
incf itog_H,f ; на единицу

movf reg_temp,w ; itog_L = itog_L + reg_temp
addwf itog_L,f ; если возник переполнение С=1
btfsc STATUS,C ; увеличиваем старший бит результата
incf itog_H,f ; на единицу
;***** w = reg_1*10 + reg_0 = reg_1*(8+2)+ reg_0 = reg_1<<3 + reg_1<<1 + reg_0

movf reg_1,w ; значение десятков заносим
movwf reg_temp ; в спомагательный регистр (СР)

bcf STATUS,C
rlf reg_temp,w ; w = reg_temp<<1

rlf reg_temp,f ; reg_temp= reg_temp<<3
rlf reg_temp,f ;
rlf reg_temp,f ;

addwf reg_temp,w ; w = w + reg_tmp = reg_1<<3 + reg_1<<1

addwf reg_0,w ; w = w + reg_0

;***** itog_H:itog_L = itog_H:itog_L + w

addwf itog_L,f
btfsc STATUS,C ; увеличиваем старший бит результата
incf itog_H,f ; на единицу

BCD_in_bin_end return


может кому пригодится...

есть пару вопросов:

1 можно ли еще уменьшить размер исполняемого кода

2 если у кого идеи как сделать нечто подобное для обратного преобразования???

зарание спасибо всем откликнувшимся....
Раздел: PIC

Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться, либо войти на сайт под своим именем.

Обсудить на форуме


На момент добавления Перевод 0-999 Bcd В Bin И Обратно Для Pic12/16 На Asm все ссылки были рабочие.
Все публикации статей, книг и журналов, представлены на этом сайте, исключительно для ознакомления,
авторские права на эти публикации принадлежат авторам статей, книг и издательствам журналов!
Подробно тут | Жалоба
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.


Опрос

Ваши предпочтения в TRX


Одинарное преобразование
Двойное преобразование
Прямое преобразование
SDR
Другое
Мне всё равно

Популярные новости
Календарь новостей
«    Май 2024    »
ПнВтСрЧтПтСбВс
 12345
6789101112
13141516171819
20212223242526
2728293031