|
Гашение незначащих нулей, кто как делает? |
|
|
|
Aug 31 2008, 10:55
|

Местный
  
Группа: Участник
Сообщений: 355
Регистрация: 27-03-07
Из: Україна, Чуднів
Пользователь №: 26 530

|
Пока вижу два варианта вывода числа на ЖКИ с гашением незначащих нулей: Код #include <stdlib.h> div_t dtmp; char str_tmp[6]; str_tmp[5] = 0; OborotiZaMin = (OborotiZaMinConst + (PPeriod >> 1)) / PPeriod;
#if 0
dtmp = div(OborotiZaMin, 10); str_tmp[4] = dtmp.rem + '0'; dtmp = div(dtmp.quot, 10); str_tmp[3] = dtmp.rem + '0'; dtmp = div(dtmp.quot, 10); str_tmp[2] = dtmp.rem + '0'; dtmp = div(dtmp.quot, 10); str_tmp[1] = dtmp.rem + '0'; str_tmp[0] = dtmp.quot + '0'; // Гашение незначащих нулей for (i = 0; i < 4; ++i) if (str_tmp[i] == '0') str_tmp[i] = ' '; else break;
#else i = 0; dtmp = div(OborotiZaMin, 10000); if (dtmp.quot != 0) str_tmp[i++] = dtmp.quot + '0';
dtmp = div(dtmp.rem, 1000); if (i || (dtmp.quot != 0)) str_tmp[i++] = dtmp.quot + '0'; dtmp = div(dtmp.rem, 100); if (i || (dtmp.quot != 0)) str_tmp[i++] = dtmp.quot + '0'; dtmp = div(dtmp.rem, 10); if (i || (dtmp.quot != 0)) str_tmp[i++] = dtmp.quot + '0'; str_tmp[i++] = dtmp.rem + '0'; str_tmp[i] = 0; #endif // LCD_Write Дабы на ЖКИ небыло такого, например "0750", а было такое "750". Какой алгоритм используете?
--------------------
нельзя недооценивать предсказуемость глупости
|
|
|
|
|
 |
Ответов
|
Aug 31 2008, 15:41
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Ох, что-то, вы, господа, мрачно тут начали, деление и т.д. Вот - без лидирующих нулей для unsigned short. Заточена под IAR'овское соглашение о связях. Код RSEG CODE:CODE:NOROOT(1) PUBLIC _i2a // 13 __z void i2a(char *s, UINT16 v) _i2a: // 14 { // 15 UINT8 m0; //R16 // 16 UINT8 m1; //R17 //R18-R20 - 24bit fmul result //R21 - c,b,a ->06 8D B9 //R22 - zero reg CLR R22 LDI R21,0x06 // v=__multiply_unsigned(m0,0x06)+3; MUL R16,R21 MOVW R19:R18,R1:R0 SUBI R18,0xFD SBCI R19,0xFF // v+=__multiply_unsigned(m1,0x06)<<8; MUL R17,R21 MOV R20,R1 ADD R19,R0 ADC R20,R22 // v+=__multiply_unsigned(m1,0x8D); LDI R21, 0x8D MUL R17, R21 ADD R18, R0 ADC R19, R1 ADC R20, R22 // v+=__multiply_unsigned(m0,0x8D)>>8; MUL R16, R21 ADD R18, R1 ADC R19, R22 ADC R20, R22 // v+=__multiply_unsigned(m1,0xB9)>>8; LDI R16,0x10 ; Counter & flags LDI R21,0xB9 MUL R17, R21 LDI R21, 10 ; Next multiplicand ADD R18, R1 ADC R19, R22 ADC R20, R22 BREQ ??i2a_0 SUBI R20,208 ST Z+,R20 INC R16 ??i2a_0: // 39 UINT16 hv; // 40 UINT8 bv; // 41 bv=v>>8; MOV R17, R19 // 42 v=__multiply_unsigned(v,10); MUL R18, R21 MOVW R19:R18, R1:R0 // 43 hv=__multiply_unsigned(bv,10); MUL R17, R21 // 44 v+=(hv&0xFF)<<8; ADD R19, R0 // 45 if (SREG_Bit0) hv+=0x100; ADC R1, R22 // 46 bv=hv>>8; MOV R17, R1 // 47 if ((i|bv)&0x8F) MOV R20, R1 OR R20, R16 ANDI R20, 0x8F BREQ ??i2a_1 // 48 { // 49 *s++=bv+'0'; SUBI R17,208 ST Z+,R17 // 50 i|=1; // ORI R18, 0x01 ??i2a_1: // 51 } // 52 i<<=1; ROL R16 // 54 while(!SREG_Bit0); BRBC 0, ??i2a_0 // 55 *s=0; ST Z, R22 // 56 } RET Правда, требует аппаратного умножителя, но теперь уже и камней нету без него...
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Jul 7 2013, 11:55
|

Местный
  
Группа: Участник
Сообщений: 355
Регистрация: 27-03-07
Из: Україна, Чуднів
Пользователь №: 26 530

|
Цитата(Rst7 @ Aug 31 2008, 19:41)  Ох, что-то, вы, господа, мрачно тут начали, деление и т.д. Вот - без лидирующих нулей для unsigned short. Заточена под IAR'овское соглашение о связях. CODE RSEG CODE:CODE:NOROOT(1) PUBLIC _i2a // 13 __z void i2a(char *s, UINT16 v) _i2a: // 14 { // 15 UINT8 m0; //R16 // 16 UINT8 m1; //R17 //R18-R20 - 24bit fmul result //R21 - c,b,a ->06 8D B9 //R22 - zero reg CLR R22 LDI R21,0x06 // v=__multiply_unsigned(m0,0x06)+3; MUL R16,R21 MOVW R19:R18,R1:R0 SUBI R18,0xFD SBCI R19,0xFF // v+=__multiply_unsigned(m1,0x06)<<8; MUL R17,R21 MOV R20,R1 ADD R19,R0 ADC R20,R22 // v+=__multiply_unsigned(m1,0x8D); LDI R21, 0x8D MUL R17, R21 ADD R18, R0 ADC R19, R1 ADC R20, R22 // v+=__multiply_unsigned(m0,0x8D)>>8; MUL R16, R21 ADD R18, R1 ADC R19, R22 ADC R20, R22 // v+=__multiply_unsigned(m1,0xB9)>>8; LDI R16,0x10; Counter & flags LDI R21,0xB9 MUL R17, R21 LDI R21, 10 ; Next multiplicand ADD R18, R1 ADC R19, R22 ADC R20, R22 BREQ ??i2a_0 SUBI R20,208 ST Z+,R20 INC R16 ??i2a_0: // 39 UINT16 hv; // 40 UINT8 bv; // 41 bv=v>>8; MOV R17, R19 // 42 v=__multiply_unsigned(v,10); MUL R18, R21 MOVW R19:R18, R1:R0 // 43 hv=__multiply_unsigned(bv,10); MUL R17, R21 // 44 v+=(hv&0xFF)<<8; ADD R19, R0 // 45 if (SREG_Bit0) hv+=0x100; ADC R1, R22 // 46 bv=hv>>8; MOV R17, R1 // 47 if ((i|bv)&0x8F) MOV R20, R1 OR R20, R16 ANDI R20, 0x8F BREQ ??i2a_1 // 48 { // 49 *s++=bv+'0'; SUBI R17,208 ST Z+,R17 // 50 i|=1; // ORI R18, 0x01 ??i2a_1: // 51 } // 52 i<<=1; ROL R16 // 54 while(!SREG_Bit0); BRBC 0, ??i2a_0 // 55 *s=0; ST Z, R22 // 56 } RET Чисто из академического интереса попробовал скомпилировать Ваш код. Переменная i - неизвестна. Да и алгоритм гашения моему неокрепшему уму непонятен. если не трудно на пальцах объясните плиз. Заранее спасибо.
--------------------
нельзя недооценивать предсказуемость глупости
|
|
|
|
Сообщений в этой теме
sKWO Гашение незначащих нулей Aug 31 2008, 10:55 alux Цитата(sKWO @ Aug 31 2008, 13:55) Дабы на... Aug 31 2008, 12:39 Павлик я просто сравниваю число , и если оно равняется 0х... Aug 31 2008, 13:26 zltigo Цитата(Павлик @ Aug 31 2008, 15:26) ...ес... Aug 31 2008, 13:45  rezident Цитата(zltigo @ Aug 31 2008, 19:45) Здоро... Aug 31 2008, 15:14   zltigo Цитата(rezident @ Aug 31 2008, 17:14) Как... Aug 31 2008, 15:20 aesok Цитата(sKWO @ Aug 31 2008, 14:55) Какой а... Aug 31 2008, 13:31 Aesthete Animus Ну а кто запрещает пользоваться стандартной snprin... Aug 31 2008, 14:09 aaarrr Цитата(Aesthete Animus @ Aug 31 2008, 18... Aug 31 2008, 14:11 aesok ЦитатаНу и унивесализм, как по радиксу, так и по к... Aug 31 2008, 14:14 _Pasha Цитата(aesok @ Aug 31 2008, 18:14) Обе ис... Aug 31 2008, 15:09 Павлик Я тут спорить не собираюсь , сам начинающий и мног... Aug 31 2008, 15:43 zltigo Цитата(Павлик @ Aug 31 2008, 17:43) Предл... Aug 31 2008, 16:22 defunct Код// convert and output decimal value
int IntToSt... Aug 31 2008, 18:00 ReAl Ну и до кучи - чтобы все варианты были и чтобы был... Aug 31 2008, 20:08 777777 У меня сделано два отдельных преобразования: целое... Sep 1 2008, 13:01 rx3apf Какие-то все жутковатые алгоритмы... Я вот всю жиз... Jul 7 2013, 12:19 toweroff Цитата(rx3apf @ Jul 7 2013, 16:19) заменя... Jul 7 2013, 13:33 V.K Никогда не думал, что подобные вопросы могут быть ... Jul 7 2013, 13:50 sKWO Цитата(V.K @ Jul 7 2013, 17:50) Никогда н... Jul 7 2013, 14:21 zöner вот тут неплохо разжованы разные алгоритмы преобра... Jul 7 2013, 19:33 Rst7 QUOTE (sKWO @ Jul 7 2013, 14:55) Чисто из... Jul 8 2013, 07:42 sKWO Цитата(Rst7 @ Jul 8 2013, 11:42) Ничего у... Jul 8 2013, 10:03
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|