Ви не увійшли.
Сторінки 1
Ребята объясните как отображают число с запятой на экране. Я использую переменную int (000 - 999 сотни) и byte (0 - 9 десятичную) но проблема в том что когда счётчик переходит через 100.0 а потом возвращается назад получается 99.90 как с этим бороться какие алгоритмы используете вы.
Неактивний
спасибо попробую
Неактивний
а можно как то подробней что то у меня ерунда получается какая то long хранит четыре бита но запятая то как получается
Допустим записываем в неё 157 / 10 = 15 дробная часть опускается значит её нужно выделить перед преобразованием 157 [10] = 7 и здесь это работает, но вот проблема начинается если если в переменной 99 / 10 получается 9 а не 90 и всё ровно мне пришлось использовать две байтовых переменных для вывода на экран, что как то совсем странно использовать 6 байт вместо 4. Изначально я использовал 4 байтовых переменных который отображаясь на экране считаются с право налево в порядке возрастания.
............
lcd_3++
if(lcd_3==10)
{
lcd_3 =0;
lcd_2++;
}
if(lcd_3==10)
{
lcd_3 =0;
lcd_1++;
}
if(lcd_1==10)
{
lcd_1 =0;
lcd_0++
}
if(lcd_0==10)
{
lcd_0 =0;
}
Остання редакція goodspeedmen (2016-10-16 21:49:27)
Неактивний
Я так понял нужен форматированный вывод на дисплей. Варианта 3: преобразовать число в строку как вам надо и уже ее выводить на дисплей, использовать функции вывода поддерживающие форматирование, написать что-то свое.
0. 99 - это 9.9, 157 - это 15.7 и не надо никаких 2-х, 3-х или 4-х переменных, достаточно одной, NoName вам все написал.
1. 99/10 = 9. Выводим {009} или { 9} или форматируем как надо.
2. Выводим точку {.}
3. 99 [10] = 9. выводим {9}
Результат 009.9 или 9.9
Как-то так.
Неактивний
Я так понял нужен форматированный вывод на дисплей. Варианта 3: преобразовать число в строку как вам надо и уже ее выводить на дисплей, использовать функции вывода поддерживающие форматирование, написать что-то свое.
0. 99 - это 9.9, 157 - это 15.7 и не надо никаких 2-х, 3-х или 4-х переменных, достаточно одной, NoName вам все написал.
1. 99/10 = 9. Выводим {009} или { 9} или форматируем как надо.
2. Выводим точку {.}
3. 99 [10] = 9. выводим {9}
Результат 009.9 или 9.9
Как-то так.
Я конечно не специалист но после деления в перемененной останется число деления а не исходное вот поэтому я и использовал переменный для сохранения результата и вывода его на экран
Неактивний
Похоже мы говорим о разных вещах.
У тебя изначально дробное число с одной цифрой после запятой. Храни его в long умноженным на 10, иначе говоря младший разряд - это цифра после запятой, все остальное целая часть. Дальше смотри 2-й пост.
Неактивний
а можно как то подробней что то у меня ерунда получается какая то long хранит четыре бита но запятая то как получается
............
lcd_3++
if(lcd_3==10)
{
lcd_3 =0;
lcd_2++;
}
if(lcd_3==10)
{
lcd_3 =0;
lcd_1++;
}
if(lcd_1==10)
{
lcd_1 =0;
lcd_0++
}
if(lcd_0==10)
{
lcd_0 =0;
}
гугл подсказал, или сами придумали?
https://www.tutorialspoint.com/c_standa … printf.htm
наверняка эти деятели (те кто либу написал) делали и примеры,
так вот они ардуинщиков ненавидят в душе. примеры просты и ущербны, это как большинство примеров по использованию таймера, почти все на overload
я так 4 дня убил на поиск маленькой строчки о том что перед сменой регистра сравнения нужно остановить таймер,
вот наши герои (
Library originally added 18 Apr 2008
by David A. Mellis
library modified 5 Jul 2009
by Limor Fried (http://www.ladyada.net)
example added 9 Jul 2009
by Tom Igoe
modified 22 Nov 2010
by Tom Igoe
примеры рабочие, но недостаточные хороши для построения нормального вывода на дисплей (((
void setup() {
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
// Print a message to the LCD.
lcd.print("hello, world!");
}
okey , поехали
проверите сами,
float нет смысла использовать, он может скушать много места в контроллере
void setup() {
chat tmp_str[32];
long data = 1236; // == 123.6
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
// Print a message to the LCD.
sprintf (tmp_str, " data= %d.%d", data /10, data%10);
lcd.print(tmp_str);
}
проверяйте сами. пользуйтесь и git
goodspeedmen, а может вы "от фонаря" ЭТО написали? ) в надежде что кто то "нервный" исправит )
ладно, незнаю что вы делаете - но успеха ) , и надеюсь Вы не на Малышева или на Антонова работаете )
можно и без sprintf, но тогда все самописное, и начните с простого.
Неактивний
Я же не специалист и не писал что бы кто то чего то исправлял. Я сужу из того что контроллер 8 битный его регистры тоже (значит с байтами ему работать проще), есть пары регистровые но все же это занимает его время на обработку инициализация long деление его, вывод информации и прочие. Честно я надеялся увидеть нечто совсем другое...
lowByte()
highByte()
Остання редакція goodspeedmen (2016-10-17 17:53:35)
Неактивний
)))
goodspeedmen, решили похвастаться тогда что ли?
"Честно я надеялся увидеть нечто совсем другое..."
*(unsigned char*) pmem ... такое ? )
основная прелесть "ардуино" в наглядности, хотя эта его нагляность реализована в "ущерб функционалу", но работает , и большинство задач удовлетворяет, так что выстрелили мегой и ладно, хоть пипл к науке будет ближе, чем к журналу из серии "playboy" ( вот тут вопросов нет, кроме красивых женщин раньше были и толковые общеполитические статьи ) и алкоголю уровня alcoenergy
я сам не светочь чистого кода
но такие алгоритмы убивают всю наглядность
lcd_3++
if(lcd_3==10)
{
lcd_3 =0;
lcd_2++;
}
и самое паршивое - очень много народу пишет именно так, я не знаю как можно придумать такой алгоритм, потому мне просто интересно, где обучают таким основам
я просто не понял код, но это все мелочи.
что за девайсину делаете ?
нашел пример
int test = 0xAB;
byte hi, lo;
hi = HighByte(test); //in case you're wondering this should be 0xA
lo = LowByte(test); // and this should be 0xB.
вы данные в hex будете выводить?
Неактивний
Честно сказать после ваших ответов я чувствую себя ущербным (я не обидчивый и готов выслушивать конструктивную критику если от неё есть польза)... Как придумал, смотрел видео, читал про работу контроллеров для вывода информации на экран нужен байт как по мне вполне очевидный вывод учитывая вводные параметры. Опрос if происходит по мере необходимости соответственно процессору легче оперировать этими цифрами (мне так казалось) И оно отлично работает к тому же. Просто возникла проблема, нужно сравнивать эти цифры на "<" ">" с таким же количество байтов и тут иногда по каким то непонятным мне причинам определяется, сумма отпала сразу так как "от перемены мест слагаемых сумма не изменяется" x_0 > y_0 || x_1 > y_1 результат тоже не ахти.
Остання редакція goodspeedmen (2016-10-18 21:07:04)
Неактивний
goodspeedmen, Какой у Вас ЛЦД? Если типа 1602 или аналогичный то перед выводом на дисплей очистите соответственно количество символов с позиции которой Вы выводите на экран. С графическим немножко сложнее нужно очистить прямоугольник.
Если не очищать то получается примерно такое:
102.4
98.74 - а должно быть (хотелось вывести) 98.7 .
Остання редакція Nefreemen (2016-10-18 21:04:33)
Неактивний
Ребята я очень всем благодарен всем за ваши ответы но поймите я не умею читать мысли, если их пишите то излагайте из в виде кода, мы же тут "программисты" всё же
Неактивний
Ребята я очень всем благодарен всем за ваши ответы но поймите я не умею читать мысли, если их пишите то излагайте из в виде кода, мы же тут "программисты" всё же
Я тоже не умею читать мысли. Диапазон чисел? Какой дисплей? Какие действия с числами надо совершать?
Какой код можно написать не зная под что писать?
Неактивний
goodspeedmen, Какой у Вас ЛЦД? Если типа 1602 или аналогичный то перед выводом на дисплей очистите соответственно количество символов с позиции которой Вы выводите на экран. С графическим немножко сложнее нужно очистить прямоугольник.
Если не очищать то получается примерно такое:
102.4
98.74 - а должно быть (хотелось вывести) 98.7 .
Да 1602. Я думал передвигать курсор, очищать его if (lcd... < 100) но получается мерцание при очистке ну и к тому же упираемся в лишний код который не нужен...
Неактивний
Капец, ну глаз, мерцание...А кода значение меняется Вы то же мерцание видите ?
Интересно если сделать так...Тоже будет "мерцать"
lcd.setCursor(2, 0);
lcd.print(" "); - стираете 5 символов
lcd.setCursor(2, 0);
lcd.print(n) - печатаете переменную n не больше 5 символов с той же позиции.
Возможно топорно но просто ( без каких то вычислений длины печати и пр. лабуды).
Ну если лишний код, извините я уж не знаю "лишняя ли у попа жена"
Неактивний
"лишняя ли у попа жена" чес слово поржал, ну у вас и сравнения )))
между прочим goodspeedmen плывет в правильном направление, только сильно углубился )
у кого есть подключенный индикатор? - проверьте плс
void setup() {
chat tmp_str[32];
long data = 1236; // == 123.6
lcd.begin(0, 0);
sprintf (tmp_str, " data= %d.%d", data /10, data%10);
lcd.print(tmp_str);
}
я думал что этот код рабочий
Неактивний
if (update_lcd==0)
{
lcd.setCursor(0,0); //курсор.
lcd.print("Counter:"); //выводит текст.
lcd.print(lcd_Counter_0); //выводит значение переменной.
lcd.print(lcd_Counter_1); //выводит значение переменной.
lcd.print(lcd_Counter_2); //выводит значение переменной.
lcd.print("."); //выводит текст.
lcd.print(lcd_Counter_3); //выводит значение переменной.
lcd.print("MM"); //выводит текст.
lcd.setCursor(0,1); //курсор 0 символ 2 строка
lcd.print("Сaliber:"); //выводит текст.
lcd.print(lcd_caliber_0); //выводит значение переменной.
lcd.print(lcd_caliber_1); //выводит значение переменной.
lcd.print(lcd_caliber_2); //выводит значение переменной.
lcd.print("."); //выводит текст.
lcd.print(lcd_caliber_3); //выводит значение переменной.
lcd.print("MM"); //выводит текст.
update_lcd = 4095;
}
update_lcd = update_lcd--;
Остання редакція goodspeedmen (2016-10-19 11:09:23)
Неактивний
Перечитал еще раз 1-й пост. У вас 0 остается от числа 100.0, так как 99.9 занимает на одно знакоместо меньше и 0 стандартными средствами не затирается. Если число будет 9.9 - будет видно 2 знака от предыдущих чисел. Вам надо либо перед выводом затирать предыдущие числа пробелами (можно просто очистить дисплей) либо нужен форматированный вывод на дисплей. Ознакомтесь http://www.c-cpp.ru/content/printf. Про оба эти метода уже писали ранее, но вы упорно изобретаете велосипед.
Кусок кода, который вы привели является вариантом форматированного вывода, только вместо одной переменной вы используете 4.
Неактивний
Капец, ну глаз, мерцание...А кода значение меняется Вы то же мерцание видите ?
Интересно если сделать так...Тоже будет "мерцать"
lcd.setCursor(2, 0);
lcd.print(" "); - стираете 5 символов
lcd.setCursor(2, 0);
lcd.print(n) - печатаете переменную n не больше 5 символов с той же позиции.
Возможно топорно но просто ( без каких то вычислений длины печати и пр. лабуды).
Ну если лишний код, извините я уж не знаю "лишняя ли у попа жена"
Спасибо нужно будет попробовать. И всё же две попы тоже не ахти.
Остання редакція goodspeedmen (2016-10-19 11:14:06)
Неактивний
Сторінки 1