Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Превръщане на 32BITово число в ASCII символи...
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=3056
Страница 1 от 2

Автор:  edi [ Чет Окт 12, 2006 4:15 pm ]
Заглавие:  Превръщане на 32BITово число в ASCII символи...

Здравейте!
Трябва ми идея как да конвертирам 32битово число така че да стане в ASCII код за да мога след това число по число да ги изпратя към дисплея за да се визуализират?Всяко число от ASCII кода трябва да е в отделен байт.Пример :
Temp0 = h'2f'
Temp1 = h'45' ->Старши байт
Следователно числото е : 17 711
num0 = d'1'
num1 = d'1'
num2 = d'7' и т.н. един по един ги изпраштам към дисплея!
Контролера е 16f870.Благодаря за вниманието :)

Автор:  darkyp [ Чет Окт 12, 2006 5:04 pm ]
Заглавие: 

докато числото е <> 0 numX = числото mod 10, числото = числото div 10.

примера е с 16 битово число. Наистина ли искаш 32 битово?

Автор:  paregov [ Чет Окт 12, 2006 5:12 pm ]
Заглавие: 

Един вариант на С:

char Num[20];
long int Number = 23232;

sprintf(Num, "%l", &Number);

Автор:  edi [ Чет Окт 12, 2006 6:38 pm ]
Заглавие: 

darkyp написа:
докато числото е <> 0 numX = числото mod 10, числото = числото div 10.

примера е с 16 битово число. Наистина ли искаш 32 битово?

Зависи какви честоти ще меря...т.е. при ниски ще бъдат около 20бита а при максимали около 32 бита.Направих го с повече разряди т.к. ми трябва по голяма резолюция...около 600Hz.

Автор:  Cekins [ Чет Окт 12, 2006 7:50 pm ]
Заглавие: 

Ами те май всички компилатори имат команда която го поддържа, примерно (сега от това всички ще скочат ама ко да се прай) на picbasic+ е следното : Print DEC Num32. Другия вариант е следния:

ако числото е по-голямо примерно от 999 делиш го на хиляда. Резултата ти е най-старшата цифра (+32 и става ASCII). Остатъка го намираш и пак само, че Х>99 делиш на сто и т.н. Аз така правя. Ама трябва да почнеш от най-голямата разрядност. В случая на 32 бита ще е 999999999

Автор:  Nikola Kirov [ Чет Окт 12, 2006 8:01 pm ]
Заглавие: 

С тия пикове и бейсици ще ви закърнеят мозъците :)

Код:
void lcd_PrintNumberExt (unsigned long number,char digits,char type)
{
   char i,tmp;
   char a [8];

   i = 0;
wl:
    tmp    = number % 10;
    number    = number / 10;
    a[i++]    = tmp + 48;
   if (number) goto wl;

    while( i < digits )
    {
         digits--;
        lcd_putch (type);
    }
      
wlA:
   i --;
   lcd_putch (a[i]);
   if(i) goto wlA;
}


които не обича goto лесно се преправя кода :) Това е писано за HiTech и PIC и така даваше минимален размер на кода.
В нормалните компилатори и нормалните процесори такова решение с goto дава по раздут код,или поне същия по обем но така е при вездесъщите PIC,нищо не е както трябва.

digits -> Брой символи до които се допълва с type
Пример
lcd_PrintNumberExt (112,4,'0');
ще изпише
0112

Автор:  Dimiter [ Чет Окт 12, 2006 9:35 pm ]
Заглавие: 

Ей това съм го писал за пик (на CCS) , работи и се използва в момента
// функция print не е към компилатора декларацията и е: void print(byte data);



/*
void print_float(float data,byte num);
void print32(unsigned int32 data,byte num); <-------- туй
void print16(unsigned int16 data,byte num);
void print8(byte data,byte num);
void print_hex(byte data);
*/

byte dig[10];

//-----------------------------------------------------------
void print32(unsigned int32 data,byte num) // num=брой изписани декади, при 0 - колкото са толкоз
{
unsigned int32 data1,data2;
byte i,j,temp;

memset(dig,0xff,sizeof(dig));
if(num>10){num=10;} // против уроки ;)

for(i=0;i<10;i++)
{
data1=data/10;data2=data1*10;
dig[i]=data-data2;
if(data1==0) { break; }
data=data1;
}

if(num){j=10-num;}else{j=0;}

for(i=0;i<10;i++)
{
temp=dig[9-i];
if(num)
{
if(temp==0xff){temp=0;}
if(i>=j) {print(temp+0x30);}
}
else { if(temp!=0xff){print(temp+0x30);} }
}

}

Автор:  Gogo [ Пет Окт 13, 2006 12:01 am ]
Заглавие: 

Айде и от мене едно парче:
Код:
void   ltoa   (long i, char *s)
{
  long long k = 10000000000;
// unsigned long k=100000; for 'itoa' function
  unsigned char j=0;
    if(i==0)
  {
    s[0]='0';
    s[1]='\0';
    return;
  }
  if(i<0)
  {
    s[0]='-';
    j=1;
    i*=-1;
  }
  while(k>i) k/=10;
  while(k)
  {
    s[j++]=((i/k)%10)+48;
    k/=10;
  }
  s[j]='\0';
}

Автор:  [ Пет Окт 13, 2006 12:59 am ]
Заглавие: 

От Help системата на CCS C:
Цитат:
How do I do a printf to a string?
--------------------------------------------------------------------------------
The following is an example of how to direct the output of a printf to a string. We used the \f to indicate the start of the string. This example shows how to put a floating point number in a string.

Код:
main() {
   char string[20];
   float f;
   f=12.345;
   sprintf(string,"\f%6.3f",f);
}



В string получаваш ASCII символите.

Автор:  the_real_maniac [ Пет Окт 13, 2006 1:34 am ]
Заглавие: 

pirev , но колко ли време отнема е интересно да се види.
/сравни ака :-)

Автор:  Nikola Kirov [ Пет Окт 13, 2006 1:57 am ]
Заглавие: 

sprintf ползва същия код като printf само дето изхода е в буфер.
Но като цяло printf е тежка функция. Може да се ползва ако не те бърка време и заемано място.

При IAR системата е малко по гъвкава. Не съм виждал по другите компилатори такава опция /не казвам че няма с сигурност/. Там имаш опция за prinf като има 4 варианта Full,Large,Tiny,Small. В Small е с много орязана функционалност но за случая ще стане. А full много тежък но е с цялата полагаща се функционалност на тая функция.

Предполагам че и в други компилатори има но вероятно става като се дефинира променлива която превключва функционалноста на printf директно в кода на съответната библиотека.

Автор:  [ Пет Окт 13, 2006 3:10 am ]
Заглавие: 

the_real_maniac написа:
pirev , но колко ли време отнема е интересно да се види.
/сравни ака :-)

Не е кой знае колко интересно, сравнявал съм моя sprintf функция, която разпечатва само float числа и универсалната такава на CCS. Като бързодействие моята разпечатва на 2,75MHz за 2-3 ms, на CCS с 0,5ms отгоре, като код, моята с около 100 байта по-малка. Само че на CCS поддържа доста формати, докато моята само float :) Може на първо време да се използва sprintf на компилатора, след като набъбне кода и не стигне времето да търси алтернатива. Освен това такава разпечатка се прави 1-2 пъти в секунда ( предполага се за дисплей ), така че бързодействието също не е кой знае колко съществено.

Автор:  edi [ Пет Окт 13, 2006 12:25 pm ]
Заглавие: 

Не съм писал на С...само асемблер, но ще седна да почета малко.
Има ли възможност да се комбинират и двата езика.Примерно част от кода да е на Асемблер друга част да е на С?

Автор:  mndsl [ Пет Окт 13, 2006 2:32 pm ]
Заглавие: 

edi написа:
Има ли възможност да се комбинират и двата езика.Примерно част от кода да е на Асемблер друга част да е на С?


Да има. Всеки С компилатор поддържа и асемблер, но не винаги е съвместим с него. Т.е. една програма написана за MPASM примерно е възможно да не може да се компилира с друг асемблер. За тази цел може да се позлва MPLINK , обаче С компилатора на майкрочип поддържа само 18-та и 30-та серия, което е спънка ако използваш друг вид процесор.

Автор:  edi [ Съб Окт 14, 2006 9:18 am ]
Заглавие: 

mndsl написа:
Да има...

Ясно.Ще го мисля на асемблер за сега.

Страница 1 от 2 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/