Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: INT to BCD на IAR
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
DeXteR
Добрый день Всем

Кто писал подобную функцию для вывода на LED индикаторы чисел ?
Все мои библиотеки делающие подобное написаны на АСМ

Как в си сделать покрасивше ??

Думал сделать printf в стринг а потом перевести ASCII в числа
Но заня о всех проблеммах функции printf хотелась бы ее неиспользовать ...

Не поделится ли кто кодом ?
rezident
ИМХО самое простое решение это целочисленное деление на степень 10.
goddev
unsigned long int BCDconv(unsigned int a)
{
union dd
{
unsigned char ch[4];
unsigned long int b;
} d;
unsigned char i=0;

d.b=0;
while (a>=10000){ a-=10000; i++;};
d.ch[2]=i; i=0;
while (a>=1000){ a-=1000; i++;};
d.ch[1]=(i<<4); i=0;
while (a>=100){ a-=100; i++;};
d.ch[1]+=i; i=0;
while (a>=10){ a-=10; i++;};
d.ch[0]=(i<<4)+a; i=0;

return d.b;
}
zltigo
Цитата(goddev @ Apr 6 2007, 10:52) *
while (a>=10000){ a-=10000; i++;};

C таким подходом поосторожнее - во многих случаях (про АVR не говорю) деление уже быстрее.
Выскоростные способы типа деления(сдвигового) на 16 с последующей десятичной коррекцией на этом форуме тоже всплывали не раз. Поищите только немножко.
bloodden
Цитата(goddev @ Apr 6 2007, 14:52) *
unsigned long int BCDconv(unsigned int a)
{
union dd
{
unsigned char ch[4];
unsigned long int b;
} d;
unsigned char i=0;

d.b=0;
while (a>=10000){ a-=10000; i++;};
d.ch[2]=i; i=0;
while (a>=1000){ a-=1000; i++;};
d.ch[1]=(i<<4); i=0;
while (a>=100){ a-=100; i++;};
d.ch[1]+=i; i=0;
while (a>=10){ a-=10; i++;};
d.ch[0]=(i<<4)+a; i=0;

return d.b;
}

Я таким страдал, когда код при использовании sprintf в ТИНИ26 не влазил. И шо вы думаете? Такая конструкция места заняла больше чем sprintf !!!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.