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

Помогите разобраться с преобразованиями

Уважаемые гуру помогите мне разобраться? в IAR нет функций преобразования bin2dec и обратно. Помогите уважаемы с кодом для С. Прошу не пинать сильно

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


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

в IAR нет функций преобразования bin2dec и обратно.
Вам это нужно для вывода значения на индикатор? Тогда что-то такое:

unsigned int Bin;
unsigned char D[5];
for(i=0; i<5; ++i)
{
  D[i]= Bin % 10;
  Bin /= 10;
}

Десятичные цифры в массиве будут лежать "наоборот": D[0]-самая младшая (единицы), D[1]-десятки, и тд.

Если нужно делать это быстро, то вычитанием десятков тысяч, единиц тысяч, сотен, и тд (воспользуйтесь поиском - это уже не раз обсуждалось).

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


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

Если нужно делать это быстро, то вычитанием десятков тысяч, единиц тысяч, сотен, и тд

 

Есть способы и быстрее. Правда, требуют аппаратного умножителя.

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


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

Да, я опрашиваю DS1307 и вывожу значения на LCD на основе ks0108. Беда оказалась в том, что после того как секунды отсчитали 9 следующее значение было уже 16, после 24 сразу же 32 и т.д. Где-то наткнулся, что неправильно преобразованы числа, но готовой функции в IAR не нашел, как в CV вот и решил обратиться, т.к. кодов не нашел

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


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

Да, я опрашиваю DS1307 и вывожу значения на LCD на основе ks0108.

 

Дык это совсем другое дело, там же BCD. Каждый байт в символьный десятичный вид преобразуется банально:

char *out; //Указатель на буфер строки
char v; //Значение байта
....
*out++=((v&0xF0)>>4)+'0';
*out++=(v&0x0F)+'0';

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


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

int bin2bcd(int v)
{

int out; 
int i1;
i1=(v>>4)*10;
out = i1;
return out;
}

 

вот так я получил десятки, но что-то не могу получить единицы, помогите, я совсем запутался

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


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

вот так я получил десятки, но что-то не могу получить единицы, помогите, я совсем запутался
Раз уж вы использовали умножение, то видимо и деление не будет извратом. :laughing: Используйте операцию % - получение остатка от целочисленного деления.

i2=v%10; // получение остатка при делении на десять

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


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

Люди, Вы наверное будите смеяться, но у меня снова получился полный бред, вот код:

int bin2bcd(int v)
{

int out;
int i1,i2;
i1=(v>>4)*10;
i2=v%10; 
out = i1+i2;
return out;
}

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


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

Конечно бред. Вот код. Может не эстетично, зато дешево надежно и практично ;) И без умножений-делений, которые требуют соответствующих библиотек, увеличивающих конечный код. Актуально для МК с небольшим количеством набортной Flash.

uint16_t bcd(uint16_t val)
{ uint16_t out=0, inp=val;
  while (inp>=1000)
  { inp-=1000;
    out+=1<<12;
  }
  while (inp>=100)
  { inp-=100;
    out+=1<<8;
  }
  while (inp>=10)
  { inp-=10;
    out+=1<<4;
  }
  out+=inp;
  return (out);
}

Естественно аргумент функции не должен превышать значения 9999.

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


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

странно конечно, но правильно не работает... может проблема в переменных, которые я поставил, вместо uintl6_t и предположит, что это unsigned int

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


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

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

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


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

странно конечно, но правильно не работает...
Что именно не работает? На входе бинарное число, на выходе бинарно-десятичное. Т.е. каждый полубайт (4 бита) содержит число, не превышающее основания 10 (от 0 до 9). Допустим на входе число 1234=0x04D2, на выходе получаем 0x1234. После этого достаточно выделить каждый из полубайтов, прибавить к нему ASCII-код символа '0'=0x30 и можно выводить на экран число в привычном десятичном виде.

может проблема в переменных, которые я поставил, вместо uintl6_t и предположит, что это unsigned int
В стандарте Си нет конкретной размерности у типов переменных. Размерность типов переменных задается в стандартном хедере limits.h и может отличаться на разных кристаллах и компиляторах. А стандарт лишь гарантирует их отношение charshort intintlong int. Чтобы избежать неоднозначности я использовал конкретный тип uint16_t, который соответствует 16-и битному unsigned int.

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


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

Простите за глупый вопрос, но как выделить полубайт?

 

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

Ну мне надо вывести значения в десятичной системе, которые выдает мне DS1307

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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