Отговори на тема  [ 17 мнения ]  Отиди на страница 1, 2  Следваща
Превръщане на 32BITово число в ASCII символи... 
Автор Съобщение
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Чет Окт 12, 2006 3:52 pm
Мнения: 21
Местоположение: Varna
Мнение Превръщане на 32BITово число в ASCII символи...
Здравейте!
Трябва ми идея как да конвертирам 32битово число така че да стане в ASCII код за да мога след това число по число да ги изпратя към дисплея за да се визуализират?Всяко число от ASCII кода трябва да е в отделен байт.Пример :
Temp0 = h'2f'
Temp1 = h'45' ->Старши байт
Следователно числото е : 17 711
num0 = d'1'
num1 = d'1'
num2 = d'7' и т.н. един по един ги изпраштам към дисплея!
Контролера е 16f870.Благодаря за вниманието :)


Чет Окт 12, 2006 4:15 pm
Профил ICQ
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Пон Дек 12, 2005 6:03 pm
Мнения: 263
Местоположение: София
Мнение 
докато числото е <> 0 numX = числото mod 10, числото = числото div 10.

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


Чет Окт 12, 2006 5:04 pm
Профил ICQ YIM
Ранг: Ориентиран
Ранг: Ориентиран
Аватар

Регистриран на: Сря Мар 01, 2006 2:21 pm
Мнения: 267
Местоположение: Fort Lauderdale, FL
Мнение 
Един вариант на С:

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

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

_________________
Всички обичаме да печелим, но колко от нас обичат да тренират!


Последна промяна paregov на Пет Окт 13, 2006 1:48 pm, променена общо 1 път



Чет Окт 12, 2006 5:12 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Чет Окт 12, 2006 3:52 pm
Мнения: 21
Местоположение: Varna
Мнение 
darkyp написа:
докато числото е <> 0 numX = числото mod 10, числото = числото div 10.

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

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


Чет Окт 12, 2006 6:38 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 20, 2005 12:02 pm
Мнения: 9119
Местоположение: Разград
Мнение 
Ами те май всички компилатори имат команда която го поддържа, примерно (сега от това всички ще скочат ама ко да се прай) на picbasic+ е следното : Print DEC Num32. Другия вариант е следния:

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


Чет Окт 12, 2006 7:50 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
С тия пикове и бейсици ще ви закърнеят мозъците :)

Код:
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


Чет Окт 12, 2006 8:01 pm
Профил
Ранг: Популярен
Ранг: Популярен
Аватар

Регистриран на: Пет Фев 04, 2005 3:18 pm
Мнения: 309
Местоположение: Sofia
Мнение 
Ей това съм го писал за пик (на 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);} }
}

}


Чет Окт 12, 2006 9:35 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Фев 24, 2005 11:41 pm
Мнения: 1049
Местоположение: Pz
Мнение 
Айде и от мене едно парче:
Код:
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:01 am
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Фев 25, 2005 1:58 pm
Мнения: 4585
Местоположение: US
Мнение 
От 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 символите.

_________________
Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....


Пет Окт 13, 2006 12:59 am
Профил WWW
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Пет Авг 19, 2005 11:38 am
Мнения: 978
Местоположение: Europe -> BG
Мнение 
pirev , но колко ли време отнема е интересно да се види.
/сравни ака :-)

_________________
един факт :-)
Съжалявам , че исках да помогна ...


Пет Окт 13, 2006 1:34 am
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
sprintf ползва същия код като printf само дето изхода е в буфер.
Но като цяло printf е тежка функция. Може да се ползва ако не те бърка време и заемано място.

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

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


Пет Окт 13, 2006 1:57 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Фев 25, 2005 1:58 pm
Мнения: 4585
Местоположение: US
Мнение 
the_real_maniac написа:
pirev , но колко ли време отнема е интересно да се види.
/сравни ака :-)

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

_________________
Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....


Пет Окт 13, 2006 3:10 am
Профил WWW
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Чет Окт 12, 2006 3:52 pm
Мнения: 21
Местоположение: Varna
Мнение 
Не съм писал на С...само асемблер, но ще седна да почета малко.
Има ли възможност да се комбинират и двата езика.Примерно част от кода да е на Асемблер друга част да е на С?


Пет Окт 13, 2006 12:25 pm
Профил ICQ
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Вто Май 23, 2006 4:56 pm
Мнения: 113
Местоположение: Варна
Мнение 
edi написа:
Има ли възможност да се комбинират и двата езика.Примерно част от кода да е на Асемблер друга част да е на С?


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


Пет Окт 13, 2006 2:32 pm
Профил ICQ
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Чет Окт 12, 2006 3:52 pm
Мнения: 21
Местоположение: Varna
Мнение 
mndsl написа:
Да има...

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


Съб Окт 14, 2006 9:18 am
Профил ICQ
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 17 мнения ]  Отиди на страница 1, 2  Следваща

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 1 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни