В очередной раз стал вопрос перевода трех-разрядного 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
может кому пригодится...
есть пару вопросов:
1 можно ли еще уменьшить размер исполняемого кода
2 если у кого идеи как сделать нечто подобное для обратного преобразования???
зарание спасибо всем откликнувшимся....
Раздел: PIC
Организовывать перевод циклами долго, таблицами занимает много места
сделал методом сдвига:
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