Форум РадиоКот https://radiokot.ru/forum/ |
|
преобразование HEX to DEC https://radiokot.ru/forum/viewtopic.php?f=62&t=150398 |
Страница 1 из 1 |
Автор: | akl [ Чт ноя 30, 2017 01:59:14 ] |
Заголовок сообщения: | Re: преобразование HEX to DEC |
Самый простой способ вычитанием. Из, допустим, слова $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 |
Автор: | alex_ [ Чт ноя 30, 2017 07:53:02 ] |
Заголовок сообщения: | Re: преобразование HEX to DEC |
Код: 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; // Символ конца строки ![]() |
Автор: | petrenko [ Чт ноя 30, 2017 07:57:50 ] |
Заголовок сообщения: | преоборзование HEX -> BCD |
TS -балуется- занимается наукой с очередным м.к ,но при этом лениво даж "пояндексить" ... ![]() Ну от конкретного м.к. конечно зависит. Вот пример : ( "заяндексился" за 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 |
Автор: | ARV [ Чт ноя 30, 2017 08:44:58 ] |
Заголовок сообщения: | Re: преобразование HEX to DEC |
Если на Си, то itoa ![]() |
Автор: | Голимый [ Чт ноя 30, 2017 09:20:23 ] |
Заголовок сообщения: | Re: преобразование HEX to DEC |
А это что получается, обычное преобразование в BCD? Ну то легко, 8051 делить умеет. Чего-то мне показалось что тут как-то по другому надо. Извините, затупил. |
Автор: | petrenko [ Пт дек 01, 2017 09:35:13 ] |
Заголовок сообщения: | Re: преобразование HEX to DEC |
.. обычное преобразование в 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"-ого м.к. - так или с делениями. |
Автор: | Голимый [ Пт дек 01, 2017 09:58:03 ] |
Заголовок сообщения: | Re: преобразование HEX to DEC |
Ну да, я собственно, только им и занимаюсь. Если берусь за какие-то другие, то это обычно, ненадолго. Ваш способ сегодня попробую. А мне лично делением проще типа: mov A, #X ; X - наш байт. mov B, #00Ah ; - основание 10-ной системы div AB ;поделили, остаток деления в B - младший разряд десятичного. mov куда_ни_будь, B mov B, #00Ah ; - результат предыдущего деления опять делится на 10 div AB ; опять поделили. В B - средний разряд, в A старший. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |