Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вывод на семисегментный индикатор, PIC16F690
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Сергей Владимирович
Здравствуйте! Делаю вольтметр от 0 до 5В.

Результат измерения АЦП МК представляется двумя байтами. Например 5В - это 0х03 и 0хFF.

Я "складываю" их в переменную int, умножаю на цену деления 49 и получаю С3СF, это около 50127. Отбрасывая "7", остаётся значение для вывода на индикатор.

Алгоритм преобразования я написал - простой перебор. Из переменной short int 0x03FF в результате я получаю int 0x050127. Затем сдвигом выделяю нужные разряды и вывожу на индикатор.

Однако мой алгоритм работает очень медленно. Посоветуйте как правильно организовать преобразование шестнадцатиричного значение в десятичное. Спасибо.
demiurg_spb
посмотрите исходники bin2bcd
maksimp
Цитата(Сергей Владимирович @ May 29 2013, 21:55) *
Посоветуйте как правильно организовать преобразование шестнадцатиричного значение в десятичное.

Код
char b[5];
short i=0;
do {
  b[i]=v%10;
  v/=10;
  i++;
} while (i<5);

v - исходное неотрицательное число, b - результат, цифры - b[0] младшая, b[4] старшая.
igorle
У меня использование операции "остаток от деления" значительно увеличивает размер скомпилированного кода. Я бы сдеалал как-то так:

Код
#define CAPACITY 5
#define DIVIDER 10000 /* DIVIDER should be 10^(CAPACITY - 1) */

char b[CAPACITY] = {0};
int i;
int divider = DIVIDER;

for (i = 0; i < CAPACITY; i++)
{
    while (v > divider)
    {
        v -= divider;
        b[i]++;
    }
    divider /= 10;
}
demiurg_spb
А у меня так реализовано:
Код
void bin2bcd(uint8_t* dst, uint16_t bin)  // max 9999
{
    if (bin>9999U)  // to feet in signed int type
    {
        bin = 9999U;
    }

    uint_fast8_t i = 4;

    do
    {
        div_t x = div(bin, 10U);

        dst[--i] = x.rem;
        bin      = x.quot;

    } while (i);
}
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.