Перейти к содержанию
    

Вывод на семисегментный индикатор, PIC16F690

Здравствуйте! Делаю вольтметр от 0 до 5В.

 

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

 

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

 

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

 

Однако мой алгоритм работает очень медленно. Посоветуйте как правильно организовать преобразование шестнадцатиричного значение в десятичное. Спасибо.

Изменено пользователем Сергей Владимирович

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Посоветуйте как правильно организовать преобразование шестнадцатиричного значение в десятичное.

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

v - исходное неотрицательное число, b - результат, цифры - b[0] младшая, b[4] старшая.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня использование операции "остаток от деления" значительно увеличивает размер скомпилированного кода. Я бы сдеалал как-то так:

 

#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;
}

Изменено пользователем igorle

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А у меня так реализовано:

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);
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...