Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить

преобразование HEX to DEC

Чт ноя 30, 2017 01:21:14

Вот например, есть такая табличка, ASCII зовется. И у 16-ричных чисел есть десятичное значение. Типа 000h - 0d, а 0FFh - 255d. Мне нужно нужно как-то преобразовать байт в это значение, и получить его в виде 3 BCD-чисел. Че-то подзавис, и в книжках что-то не особо. Топорно Таблично это не тоже не получается. Есть какие способы преобразования?
Изображение

Re: преобразование HEX to DEC

Чт ноя 30, 2017 01:59:14

Самый простой способ вычитанием. Из, допустим, слова $XXXX вычитаете 10'000 и складываете в регистр десятков тысяч, когда остаток становится меньше вычитаете 1'000 и складываете в регистр тысяч и т.д. Например
Естественно есть великое множество вариантов таких преобразований.
Преобразование полученных чисел в ASCII просто добавить 0x30

Re: преобразование HEX to DEC

Чт ноя 30, 2017 07:53:02

Код:
short int t;    // Переменная которую нужно конвертировать
char out[4];  // Здесь будет результат

short int tmp;
tmp=t;

out[2]=tmp%10+48;  tmp=tmp/10;
out[1]=tmp%10+48;
out[0]=tmp/10+48;

out[3]=0; // Символ конца строки

:))

преоборзование HEX -> BCD

Чт ноя 30, 2017 07:57:50

TS -балуется- занимается наукой с очередным м.к ,но при этом лениво даж "пояндексить" ... :facepalm:

Ну от конкретного м.к. конечно зависит.

Вот пример : ( "заяндексился" за 1.5минуты )
Код:
; ----------
bin2bcd2:
; ----------
; Преобразование однобайтного числа в упакованный BCD
; ----------
; Вход : R24 - число от 0 до 255
; Выход: R17:16 -  BCD представление
; Изменяет: R18, R24, SREG
; ----------

    ldi     R16, 0      ; инициализация результата
    ldi     R17, 0      ;
    ldi     R18, 8      ; счетчик циклов
loop:
    cpi     R16, 0x05   ; сравнение разряда 0
    brhs    L1          ; если <= 4,  продолжаем
    subi    R16, 256-3     ; иначе увеличиваем разряд 0 на 3
L1:
    cpi     R16, 0x50   ; сравнение разряда 1
    brcs    L2          ; если <= 4,
    subi    R16, 256-(3*16); иначе увеличиваем разряд 1 на 3
L2:
    cpi     R17, 0x05   ; сравнение разряда 2
    brhs    L3          ; если <= 4, продолжаем
    subi    R17, -3     ; иначе, увеличиваем разряд 2 на 3
L3:
    lsl     R24         ; сдвиг
    rol     R16
    rol     R17
    dec     R18         ; цикл
    brne    loop
    ret

Re: преобразование HEX to DEC

Чт ноя 30, 2017 08:44:58

Если на Си, то itoa :)))

Re: преобразование HEX to DEC

Чт ноя 30, 2017 09:20:23

А это что получается, обычное преобразование в BCD? Ну то легко, 8051 делить умеет.
Чего-то мне показалось что тут как-то по другому надо. Извините, затупил.

Re: преобразование HEX to DEC

Пт дек 01, 2017 09:35:13

.. обычное преобразование в BCD? Ну то легко, 8051 ..
А что ж Вы сразу не сказали, что всё ещё с "*51"-ым балуетесь ?

У него ж есть DAA !
, но поелику DAA корректно работает только с аргументами менее 19910==C7h ,то сначала проверяете аргумент в Acc и если он >(19910==C7h) , то вычитаете из Acc константу (10010==64h) и инкрементируете B( там должен быть заранее 00h ) ,после чего делаете DAA ,потом XCH B ,потом ADDC 00h . В итоге у Вас в B две младшие BCD-цифры , а в Acc старшая( или 0 или 1 или 2 ) . Сравните по байтам кода и по тактам/циклам выполнения , что лучше для Вашего варианта изполнения "*51"-ого м.к. - так или с делениями.

Re: преобразование HEX to DEC

Пт дек 01, 2017 09:58:03

Ну да, я собственно, только им и занимаюсь.
Если берусь за какие-то другие, то это обычно, ненадолго.

Ваш способ сегодня попробую.
А мне лично делением проще
типа:
mov A, #X ; X - наш байт.
mov B, #00Ah ; - основание 10-ной системы
div AB ;поделили, остаток деления в B - младший разряд десятичного.
mov куда_ни_будь, B
mov B, #00Ah ; - результат предыдущего деления опять делится на 10
div AB ; опять поделили. В B - средний разряд, в A старший.
Ответить