|
|
  |
преобразование 32бита в BCD, надо отобразить число 144500 на экране для рации |
|
|
|
Apr 7 2006, 01:34
|
Участник

Группа: Новичок
Сообщений: 15
Регистрация: 3-01-06
Пользователь №: 12 788

|
помогите как преобразовать в асм-е 32 бита (или 24) в bcd формат для индикации на datavision экране. может есть у кого действующий кусок программы. си не знаю/не предлогать.
|
|
|
|
|
Apr 7 2006, 12:51
|
Частый гость
 
Группа: Свой
Сообщений: 151
Регистрация: 11-01-06
Из: Украина Ровно
Пользователь №: 13 066

|
Цитата(индюк @ Apr 7 2006, 04:34)  помогите как преобразовать в асм-е 32 бита (или 24) в bcd формат для индикации на datavision экране. может есть у кого действующий кусок программы. си не знаю/не предлогать. Все таки здесь С + асм неоптимально, но работает.
Прикрепленные файлы
FL.RAR ( 3.09 килобайт )
Кол-во скачиваний: 66
|
|
|
|
|
Apr 7 2006, 13:07
|

Мастер-фломастер
   
Группа: Свой
Сообщений: 611
Регистрация: 29-12-05
Пользователь №: 12 700

|
Пробуйте если мне неизменяет память это подправленый исходник аппнота делалась давно - извиняюсь за корявость Код ;************************************************** ; in temp4 -temp3-temp2-temp ; входное значение не более 99 999 999 (dec) ; out temp8-temp7-temp6-temp5 ; time cpu = 1760 cycle .equ _AtBCD5 =2;address of tBCD0 .equ _AtBCD7 =5;address of tBCD1 bin2BCD32: pushz push r20 push r21 ldi r20,32;Init loop counter clr temp8 clr temp7;clear result (3 bytes) clr temp6 clr temp5 clr ZH;clear ZH (not needed for AT90Sxx0x) _bBCDx_1: lsl TEMP;shift input value rol TEMP2;through all bytes rol temp3 rol temp4 rol temp5; rol temp6 rol temp7 rol temp8 dec r20;decrement loop counter brne _bBCDx_2;if counter not zero pop r21 pop r20 popz ret; return _bBCDx_2: ldi zl,_AtBCD7+1;Z points to result MSB + 1 _bBCDx_3: ld r21,-Z;get (Z) with pre-decrement subi r21,-$03;add 0x03 sbrc r21,3;if bit 3 not clear st Z,r21; store back ld r21,Z;get (Z) subi r21,-$30;add 0x30 sbrc r21,7;if bit 7 not clear st Z,r21; store back cpi ZL,_AtBCD5;done all three? brne _bBCDx_3;loop again if not rjmp _bBCDx_1
--------------------
Вон ПОПОВ, клоун клоуном, а радио изобрел!!
|
|
|
|
|
Apr 7 2006, 20:34
|
Участник

Группа: Новичок
Сообщений: 15
Регистрация: 3-01-06
Пользователь №: 12 788

|
спасибо, попробую. я начинающий.
|
|
|
|
|
Apr 8 2006, 16:06
|
Участник

Группа: Новичок
Сообщений: 15
Регистрация: 3-01-06
Пользователь №: 12 788

|
2 kovrov чотто или я делаю не так или у вас чувство юмора хорошее, но в симуляторе программа просто переписывает значания регистров без видимых изменений.
|
|
|
|
|
Apr 9 2006, 03:12
|
Участник

Группа: Новичок
Сообщений: 15
Регистрация: 3-01-06
Пользователь №: 12 788

|
а, понял, щас еще раз все запущу. вы уж извините, что я так, начинающий я. мне разжовывать все пока надо.
|
|
|
|
|
Apr 9 2006, 03:39
|
Участник

Группа: Новичок
Сообщений: 15
Регистрация: 3-01-06
Пользователь №: 12 788

|
спасибо огромное - работает на ура!
а где бы мне посмотреть как число 6000д умножить на 25д и прибавить или вычесть из результата 10700д? и еще как вычитать и прибавлять по единице от 6000д?
|
|
|
|
|
Apr 9 2006, 14:26
|
Участник

Группа: Новичок
Сообщений: 15
Регистрация: 3-01-06
Пользователь №: 12 788

|
да я просто имел ввиду что числа именно такие, конечно я и собираюсь их умножать в бине а не в деке. я хоть и начинающий но не настолько же!!! я начинающий в плане математики. так я много чего для себя могу.
расскажите чего как мне сделать плиз!
|
|
|
|
|
Apr 9 2006, 16:42
|

Частый гость
 
Группа: Участник
Сообщений: 92
Регистрация: 26-06-04
Пользователь №: 192

|
ну и до кучи - честно стыренный алгоритм с телесистем. Автору поста не смотреть, т.к. на С. может кому пригодится. Самое сложное тут умноить на 429497 Сам алгоритм можно понять, но немного поясню. w тут используется чтобы засечь ведущий не 0. Код static u8_t * PutWord(u8_t *p, u16_t w) { vu32_t res32; vu32_t ret ; u64_t res48 = (u64_t)w * 429497ull; //////////////////////////////////////////////////////// res32 = (res48 >> 16); res32++; // десятки тыщ w = res32 >> 16; if (w) { *p++ = w | '0'; } // тыщи ret = (res32 = (res32 & 0xffff) * 10) >> 16; if (ret || w) { w = 1; *p++ = ret | '0'; } // сотни ret = (res32 = (res32 & 0xffff) * 10) >> 16; if (ret || w) { w = 1; *p++ = ret | '0'; } // десятки ret = (res32 = (res32 & 0xffff) * 10) >> 16; if (ret || w) { *p++ = ret | '0'; } // еденицы *p++ = (((res32 & 0xffff) * 10) >> 16) | '0'; return p; }
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|