Neytrino 0 12 октября, 2009 Опубликовано 12 октября, 2009 · Жалоба Уважаемые гуру помогите мне разобраться? в IAR нет функций преобразования bin2dec и обратно. Помогите уважаемы с кодом для С. Прошу не пинать сильно Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 10 12 октября, 2009 Опубликовано 12 октября, 2009 · Жалоба в 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]-десятки, и тд. Если нужно делать это быстро, то вычитанием десятков тысяч, единиц тысяч, сотен, и тд (воспользуйтесь поиском - это уже не раз обсуждалось). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rst7 5 12 октября, 2009 Опубликовано 12 октября, 2009 · Жалоба Если нужно делать это быстро, то вычитанием десятков тысяч, единиц тысяч, сотен, и тд Есть способы и быстрее. Правда, требуют аппаратного умножителя. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Neytrino 0 12 октября, 2009 Опубликовано 12 октября, 2009 · Жалоба Да, я опрашиваю DS1307 и вывожу значения на LCD на основе ks0108. Беда оказалась в том, что после того как секунды отсчитали 9 следующее значение было уже 16, после 24 сразу же 32 и т.д. Где-то наткнулся, что неправильно преобразованы числа, но готовой функции в IAR не нашел, как в CV вот и решил обратиться, т.к. кодов не нашел Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rst7 5 12 октября, 2009 Опубликовано 12 октября, 2009 · Жалоба Да, я опрашиваю DS1307 и вывожу значения на LCD на основе ks0108. Дык это совсем другое дело, там же BCD. Каждый байт в символьный десятичный вид преобразуется банально: char *out; //Указатель на буфер строки char v; //Значение байта .... *out++=((v&0xF0)>>4)+'0'; *out++=(v&0x0F)+'0'; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Neytrino 0 12 октября, 2009 Опубликовано 12 октября, 2009 · Жалоба а что такое bcd? я что-то не совсем понял гугл Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 10 12 октября, 2009 Опубликовано 12 октября, 2009 · Жалоба а что такое bcd? Двоично-десятичный код Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Neytrino 0 13 октября, 2009 Опубликовано 13 октября, 2009 · Жалоба int bin2bcd(int v) { int out; int i1; i1=(v>>4)*10; out = i1; return out; } вот так я получил десятки, но что-то не могу получить единицы, помогите, я совсем запутался Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 13 октября, 2009 Опубликовано 13 октября, 2009 · Жалоба вот так я получил десятки, но что-то не могу получить единицы, помогите, я совсем запуталсяРаз уж вы использовали умножение, то видимо и деление не будет извратом. :laughing: Используйте операцию % - получение остатка от целочисленного деления. i2=v%10; // получение остатка при делении на десять Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Neytrino 0 13 октября, 2009 Опубликовано 13 октября, 2009 · Жалоба Люди, Вы наверное будите смеяться, но у меня снова получился полный бред, вот код: int bin2bcd(int v) { int out; int i1,i2; i1=(v>>4)*10; i2=v%10; out = i1+i2; return out; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 13 октября, 2009 Опубликовано 13 октября, 2009 · Жалоба Конечно бред. Вот код. Может не эстетично, зато дешево надежно и практично ;) И без умножений-делений, которые требуют соответствующих библиотек, увеличивающих конечный код. Актуально для МК с небольшим количеством набортной 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Neytrino 0 17 октября, 2009 Опубликовано 17 октября, 2009 · Жалоба странно конечно, но правильно не работает... может проблема в переменных, которые я поставил, вместо uintl6_t и предположит, что это unsigned int Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rst7 5 17 октября, 2009 Опубликовано 17 октября, 2009 · Жалоба Вы бы задачу конкретизировали. А то совсем не ясно, какой результат Вам надо получить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 17 октября, 2009 Опубликовано 17 октября, 2009 · Жалоба странно конечно, но правильно не работает...Что именно не работает? На входе бинарное число, на выходе бинарно-десятичное. Т.е. каждый полубайт (4 бита) содержит число, не превышающее основания 10 (от 0 до 9). Допустим на входе число 1234=0x04D2, на выходе получаем 0x1234. После этого достаточно выделить каждый из полубайтов, прибавить к нему ASCII-код символа '0'=0x30 и можно выводить на экран число в привычном десятичном виде. может проблема в переменных, которые я поставил, вместо uintl6_t и предположит, что это unsigned intВ стандарте Си нет конкретной размерности у типов переменных. Размерность типов переменных задается в стандартном хедере limits.h и может отличаться на разных кристаллах и компиляторах. А стандарт лишь гарантирует их отношение char ≤ short int ≤ int ≤ long int. Чтобы избежать неоднозначности я использовал конкретный тип uint16_t, который соответствует 16-и битному unsigned int. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Neytrino 0 17 октября, 2009 Опубликовано 17 октября, 2009 · Жалоба Простите за глупый вопрос, но как выделить полубайт? Вы бы задачу конкретизировали. А то совсем не ясно, какой результат Вам надо получить. Ну мне надо вывести значения в десятичной системе, которые выдает мне DS1307 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться