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

преобразование 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 и складываете в регистр тысяч и т.д. Например
Спойлер
Код:
.equ   END_VIDEO_RAM=10
.def   temp5=r21
/************************************************************/
   
   RCALL   BIN24BCD8
   RJMP   PC-1

bin24BCD8:

    LDI      XL,LOW(END_VIDEO_RAM-5)
    LDI    XH,HIGH(END_VIDEO_RAM-5)

bin24BCD8A:

    SER    TEMP5

bin24BCD8_1:

    INC    TEMP5
    SUBI    R16,BYTE1(10000000)
    SBCI    R17,BYTE2(10000000)
    SBCI    R18,BYTE3(10000000)
    BRSH    bin24BCD8_1      
    SUBI    R16,BYTE1(-10000000)
    SBCI    R17,BYTE2(-10000000)
    SBCI    R18,BYTE3(-10000000)

    ST       X+,TEMP5

    SER    TEMP5

bin24BCD8_2:

    INC    TEMP5
    SUBI    R16,BYTE1(1000000)
    SBCI    R17,BYTE2(1000000)
    SBCI    R18,BYTE3(1000000)
    BRSH    bin24BCD8_2
    SUBI    R16,BYTE1(-1000000)
    SBCI    R17,BYTE2(-1000000)
    SBCI    R18,BYTE3(-1000000)

    ST       X+,TEMP5
           
    SER    TEMP5

bin24BCD8_3:

    INC    TEMP5
    SUBI    R16,BYTE1(100000)
    SBCI    R17,BYTE2(100000)
    SBCI    R18,BYTE3(100000)
    BRSH    bin24BCD8_3
    SUBI    R16,BYTE1(-100000)
    SBCI    R17,BYTE2(-100000)
    SBCI    R18,BYTE3(-100000)
   
   ST       X+,TEMP5
         
    SER    TEMP5

bin24BCD8_4:

    INC    TEMP5
    SUBI    R16,BYTE1(10000)
    SBCI    R17,BYTE2(10000)
    SBCI    R18,BYTE3(10000)
    BRSH    bin24BCD8_4
    SUBI    R16,BYTE1(-10000)
    SBCI    R17,BYTE2(-10000)
    SBCI    R18,BYTE3(-10000)
    ST       X+,TEMP5

    SER    TEMP5

bin24BCD8_5:

    INC    TEMP5
    SUBI    R16,BYTE1(1000)
    SBCI    R17,BYTE2(1000)
    BRSH    bin24BCD8_5
    SUBI    R16,BYTE1(-1000)
    SBCI    R17,BYTE2(-1000)
   
   ST       X+,TEMP5

    SER    TEMP5

bin24BCD8_6:

    INC    TEMP5
    SUBI    R16,BYTE1(100)
    SBCI    R17,BYTE2(100)
    BRSH    bin24BCD8_6
    SUBI    R16,BYTE1(-100)
    SBCI    R17,BYTE2(-100)
   
   ST       X+,TEMP5

    SER    TEMP5

bin24BCD8_7:

    INC    TEMP5
    SUBI    R16,10
    BRSH    bin24BCD8_7
    SUBI    R16,-10
   
   ST       X+,TEMP5
   
bin24BCD8_8:

     ST    X,R16

    RET
.exit
Естественно есть великое множество вариантов таких преобразований.
Преобразование полученных чисел в 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 старший.
Ответить