| Автор |
Съобщение |
|
edi
Ранг: Минаващ
Регистриран на: Чет Окт 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 |
|
 |
|
darkyp
Ранг: Ориентиран
Регистриран на: Пон Дек 12, 2005 6:03 pm Мнения: 263 Местоположение: София
|
докато числото е <> 0 numX = числото mod 10, числото = числото div 10.
примера е с 16 битово число. Наистина ли искаш 32 битово?
|
| Чет Окт 12, 2006 5:04 pm |
|
 |
|
paregov
Ранг: Ориентиран
Регистриран на: Сря Мар 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 |
|
 |
|
edi
Ранг: Минаващ
Регистриран на: Чет Окт 12, 2006 3:52 pm Мнения: 21 Местоположение: Varna
|
Зависи какви честоти ще меря...т.е. при ниски ще бъдат около 20бита а при максимали около 32 бита.Направих го с повече разряди т.к. ми трябва по голяма резолюция...около 600Hz.
|
| Чет Окт 12, 2006 6:38 pm |
|
 |
|
Cekins
Ранг: Форумен бог
Регистриран на: Сря Апр 20, 2005 12:02 pm Мнения: 9119 Местоположение: Разград
|
Ами те май всички компилатори имат команда която го поддържа, примерно (сега от това всички ще скочат ама ко да се прай) на picbasic+ е следното : Print DEC Num32. Другия вариант е следния:
ако числото е по-голямо примерно от 999 делиш го на хиляда. Резултата ти е най-старшата цифра (+32 и става ASCII). Остатъка го намираш и пак само, че Х>99 делиш на сто и т.н. Аз така правя. Ама трябва да почнеш от най-голямата разрядност. В случая на 32 бита ще е 999999999
|
| Чет Окт 12, 2006 7:50 pm |
|
 |
|
Nikola Kirov
Ранг: Форумен бог
Регистриран на: Нед Окт 31, 2004 9:19 pm Мнения: 4464 Местоположение: Stara Zagora
|
С тия пикове и бейсици ще ви закърнеят мозъците
които не обича goto лесно се преправя кода  Това е писано за HiTech и PIC и така даваше минимален размер на кода.
В нормалните компилатори и нормалните процесори такова решение с goto дава по раздут код,или поне същия по обем но така е при вездесъщите PIC,нищо не е както трябва.
digits -> Брой символи до които се допълва с type
Пример
lcd_PrintNumberExt (112,4,'0');
ще изпише
0112
|
| Чет Окт 12, 2006 8:01 pm |
|
 |
|
Dimiter
Ранг: Популярен
Регистриран на: Пет Фев 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 |
|
 |
|
Gogo
Ранг: Форумен бог
Регистриран на: Чет Фев 24, 2005 11:41 pm Мнения: 1049 Местоположение: Pz
|
Айде и от мене едно парче:
|
| Пет Окт 13, 2006 12:01 am |
|
 |
|
¶
Ранг: Форумен бог
Регистриран на: Пет Фев 25, 2005 1:58 pm Мнения: 4585 Местоположение: US
|
От Help системата на CCS C:
В string получаваш ASCII символите.
_________________ Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....
|
| Пет Окт 13, 2006 12:59 am |
|
 |
|
the_real_maniac
Ранг: Почетен член
Регистриран на: Пет Авг 19, 2005 11:38 am Мнения: 978 Местоположение: Europe -> BG
|
pirev , но колко ли време отнема е интересно да се види.
/сравни ака 
|
| Пет Окт 13, 2006 1:34 am |
|
 |
|
Nikola Kirov
Ранг: Форумен бог
Регистриран на: Нед Окт 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
|
Не е кой знае колко интересно, сравнявал съм моя sprintf функция, която разпечатва само float числа и универсалната такава на CCS. Като бързодействие моята разпечатва на 2,75MHz за 2-3 ms, на CCS с 0,5ms отгоре, като код, моята с около 100 байта по-малка. Само че на CCS поддържа доста формати, докато моята само float  Може на първо време да се използва sprintf на компилатора, след като набъбне кода и не стигне времето да търси алтернатива. Освен това такава разпечатка се прави 1-2 пъти в секунда ( предполага се за дисплей ), така че бързодействието също не е кой знае колко съществено.
_________________ Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....
|
| Пет Окт 13, 2006 3:10 am |
|
 |
|
edi
Ранг: Минаващ
Регистриран на: Чет Окт 12, 2006 3:52 pm Мнения: 21 Местоположение: Varna
|
Не съм писал на С...само асемблер, но ще седна да почета малко.
Има ли възможност да се комбинират и двата езика.Примерно част от кода да е на Асемблер друга част да е на С?
|
| Пет Окт 13, 2006 12:25 pm |
|
 |
|
mndsl
Ранг: Новодошъл
Регистриран на: Вто Май 23, 2006 4:56 pm Мнения: 113 Местоположение: Варна
|
Да има. Всеки С компилатор поддържа и асемблер, но не винаги е съвместим с него. Т.е. една програма написана за MPASM примерно е възможно да не може да се компилира с друг асемблер. За тази цел може да се позлва MPLINK , обаче С компилатора на майкрочип поддържа само 18-та и 30-та серия, което е спънка ако използваш друг вид процесор.
|
| Пет Окт 13, 2006 2:32 pm |
|
 |
|
edi
Ранг: Минаващ
Регистриран на: Чет Окт 12, 2006 3:52 pm Мнения: 21 Местоположение: Varna
|
Ясно.Ще го мисля на асемблер за сега.
|
| Съб Окт 14, 2006 9:18 am |
|
|