Страница 1 из 1

Перевод двоичного числа в текс, для индикации на LCD

Добавлено: Пн янв 01, 2007 15:24:25
Яrik
С Новым Годом! :))

Люди, помогите пожалуйста с кодом, желательно на СИ(пользуюсь CodeVisionAVR). Сам недавно начал работаь с МК ATmega8. Нужно чтобы измеряное напряжения встроеным АЦП выводилось на дисплей LCD(HD44780).
Измерение я организовал, но проблема с выводом переменной, значение которой равно результату преобразования.

Зарание благодарен всем кто откликнется!!!

Добавлено: Вт янв 02, 2007 10:46:07
moLCHec
Всё очень просто в Си есть такая функция. которая преобразует число типа int со знаком в стороку.
void itoa (char *buf, int value, int base)
здесь *buf строка в которую выводится результат
value число которое нада преооброзовать
base это база т.е. может тебе в 2-й форме надо прога же не знает пишешь 10, для 1010101 пишешь 2 и т.д.

а на будущее найди справочник по Си в современных компиляторах по AVR большинство этих функций поддерживается. У меня есть Хэлп в пдф-формате на русском только он под ICCAVR, но основные функцие везде одинаковые.

Добавлено: Вт янв 02, 2007 13:38:43
Яrik
Спасибо moLCHec!!!

Сейчас буду пробывать.
А на счет Хэлпа, скинь пожалуйста на мыло.

P. S.
Неподскажеш как округлять значение полученные в результате вычислений.

Добавлено: Вт янв 02, 2007 16:32:29
moLCHec
если уже у готовой строки. то просто отображаешь на один символ меньше, чтоб учесть >5 то можно условие есче задать
например
if(buf[0]-0x30>=5)
{
if(buf[1]==0x39)
{
buf[2]++;
buf[1]=0x30;
}
else
{
buf[1]++;
}
}

Добавлено: Чт янв 04, 2007 13:54:48
Яrik
Еще раз благодарю за помощь.

Есть вопрос.
Почему проводя симуляцию в VMlab, у меня на дисплеи LCD невыводится дробная чать числа, только челая. Хотя использую
для перевода следущий код:
ftoa(v, 3, lcd_buffer).
Насколько я понял 3 - количество знаков после запитой.

Добавлено: Пт янв 05, 2007 13:35:08
moLCHec
char *ftoa(float f,int *status)
см. хэлп который я те скинул. функция возврыщает сроку, а status нужен для обработки ошибок.

Добавлено: Сб янв 06, 2007 02:25:05
Гость
Тут (http://www.atmel.ru/Articles/Atmel13.htm) нашел программу на ассемблере,наз. bcdfp, которая преобразует двоичные числа с плавающей точкой, в последовательность (строку) из 8 ASCII-символов, которая включает в себя ASCII-символ знака, шесть ASCII-символов значащих десятичных цифр и ASCII-символ точки. Но у меня его неполучается использоватьэтот код в CodeVisionAVR.
Выдает какието ошибки при компелировании.

Может, ктото растолкует, что и как.

Добавлено: Вс фев 04, 2007 07:23:20
vladimir-19
Привет котятам и котам.
Собираю аналогичное устройство.
Столкнулся с похожей проблемой
Попытался решить следующим образом:

Код: Выделить всё

unsigned int volt; 
...
...
sprintf(lcd_buffer,"%2i.%iV   ",volt/100,volt%100);

но при выводе значения volt 1203 (предположим)
выводится 12.3 (выбрасывается нуль).
Как исправить?
_____
P.S. А мне можно хелп забросить

Добавлено: Вс фев 04, 2007 09:44:35
moLCHec
результат 1230%100 получается ведь 3 он 3 и пишет. ты бы сам стал писать 03???

Добавлено: Вс фев 04, 2007 13:45:07
vladimir-19
Я понимаю что таким способом вывожу остаток деления на 100 после точки.
Если выводить %10 будет проще но мне нужна сотая часть. Если нет то каким способом лучше.

Заранее благодарен! :roll:

Добавлено: Вс фев 04, 2007 17:16:17
moLCHec
Abakt я опечатался но сути это не меняет,
можно так
int a;
char str[16],str1[16];
.....
sprintf(str,"%i.",a/100);
if(a%100>9)
{
sprintf(str1,"%i",a%100); или utoa(str1,a%100,10);
}
else
{
sprintf(str1,"0%i",a%100);
}
strcat(str,str1);