|
3 страниц
1 2 3 >
|
 |
Ответов
(1 - 14)
|
Oct 12 2009, 11:37
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(Neytrino @ Oct 12 2009, 12:38)  в 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]-десятки, и тд. Если нужно делать это быстро, то вычитанием десятков тысяч, единиц тысяч, сотен, и тд (воспользуйтесь поиском - это уже не раз обсуждалось).
|
|
|
|
|
Oct 12 2009, 12:41
|
Участник

Группа: Участник
Сообщений: 53
Регистрация: 26-02-09
Пользователь №: 45 406

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

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Цитата Да, я опрашиваю DS1307 и вывожу значения на LCD на основе ks0108. Дык это совсем другое дело, там же BCD. Каждый байт в символьный десятичный вид преобразуется банально: Код char *out; //Указатель на буфер строки char v; //Значение байта .... *out++=((v&0xF0)>>4)+'0'; *out++=(v&0x0F)+'0';
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Oct 12 2009, 13:38
|
Участник

Группа: Участник
Сообщений: 53
Регистрация: 26-02-09
Пользователь №: 45 406

|
а что такое bcd? я что-то не совсем понял гугл
|
|
|
|
|
Oct 13 2009, 15:56
|
Участник

Группа: Участник
Сообщений: 53
Регистрация: 26-02-09
Пользователь №: 45 406

|
CODE int bin2bcd(int v) { int out; int i1; i1=(v>>4)*10; out = i1; return out; } вот так я получил десятки, но что-то не могу получить единицы, помогите, я совсем запутался
|
|
|
|
|
Oct 13 2009, 17:02
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(Neytrino @ Oct 13 2009, 21:56)  вот так я получил десятки, но что-то не могу получить единицы, помогите, я совсем запутался Раз уж вы использовали умножение, то видимо и деление не будет извратом.  Используйте операцию % - получение остатка от целочисленного деления. Код i2=v%10; // получение остатка при делении на десять
|
|
|
|
|
Oct 13 2009, 17:22
|
Участник

Группа: Участник
Сообщений: 53
Регистрация: 26-02-09
Пользователь №: 45 406

|
Люди, Вы наверное будите смеяться, но у меня снова получился полный бред, вот код: CODE int bin2bcd(int v) { int out; int i1,i2; i1=(v>>4)*10; i2=v%10; out = i1+i2; return out; }
|
|
|
|
|
Oct 17 2009, 17:38
|
Участник

Группа: Участник
Сообщений: 53
Регистрация: 26-02-09
Пользователь №: 45 406

|
странно конечно, но правильно не работает... может проблема в переменных, которые я поставил, вместо uintl6_t и предположит, что это unsigned int
|
|
|
|
|
Oct 17 2009, 18:56
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(Neytrino @ Oct 17 2009, 23:38)  странно конечно, но правильно не работает... Что именно не работает? На входе бинарное число, на выходе бинарно-десятичное. Т.е. каждый полубайт (4 бита) содержит число, не превышающее основания 10 (от 0 до 9). Допустим на входе число 1234=0x04D2, на выходе получаем 0x1234. После этого достаточно выделить каждый из полубайтов, прибавить к нему ASCII-код символа '0'=0x30 и можно выводить на экран число в привычном десятичном виде. Цитата(Neytrino @ Oct 17 2009, 23:38)  может проблема в переменных, которые я поставил, вместо uintl6_t и предположит, что это unsigned int В стандарте Си нет конкретной размерности у типов переменных. Размерность типов переменных задается в стандартном хедере limits.h и может отличаться на разных кристаллах и компиляторах. А стандарт лишь гарантирует их отношение char ≤ short int ≤ int ≤ long int. Чтобы избежать неоднозначности я использовал конкретный тип uint16_t, который соответствует 16-и битному unsigned int.
|
|
|
|
|
Oct 17 2009, 19:26
|
Участник

Группа: Участник
Сообщений: 53
Регистрация: 26-02-09
Пользователь №: 45 406

|
Простите за глупый вопрос, но как выделить полубайт? Цитата(Rst7 @ Oct 17 2009, 21:50)  Вы бы задачу конкретизировали. А то совсем не ясно, какой результат Вам надо получить. Ну мне надо вывести значения в десятичной системе, которые выдает мне DS1307
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|