#1 2016-10-15 00:45:22

goodspeedmen
Учасник
З https://discord.gg/6hbs98y
Зареєстрований: 2016-10-02
Повідомлень: 81

Lcd

Ребята объясните как отображают число с запятой на экране. Я использую переменную int (000 - 999 сотни) и byte (0 - 9 десятичную) но проблема в том что когда счётчик переходит через 100.0 а потом возвращается назад получается 99.90 как с этим бороться какие алгоритмы используете вы.

Неактивний

#2 2016-10-15 02:48:06

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: Lcd

long data = 1000

data / 10 -  100.
data % 10 -  .0

Неактивний

#3 2016-10-15 11:37:15

goodspeedmen
Учасник
З https://discord.gg/6hbs98y
Зареєстрований: 2016-10-02
Повідомлень: 81

Re: Lcd

спасибо попробую

Неактивний

#4 2016-10-15 18:53:48

goodspeedmen
Учасник
З https://discord.gg/6hbs98y
Зареєстрований: 2016-10-02
Повідомлень: 81

Re: Lcd

а можно как то подробней что то у меня ерунда получается какая то  sad  long хранит четыре бита но запятая то как получается hmm

Допустим записываем в неё 157 / 10 = 15 дробная часть опускается  значит её нужно выделить перед преобразованием 157 [10] = 7 и здесь это работает, но вот проблема начинается если если в переменной  99 / 10 получается 9 а не 90  yikes и всё ровно мне пришлось использовать  две байтовых переменных для вывода на экран, что как то совсем странно использовать 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)

Неактивний

#5 2016-10-16 20:04:08

alex_dol
Учасник
Зареєстрований: 2015-12-28
Повідомлень: 196

Re: Lcd

Я так понял нужен форматированный вывод на дисплей. Варианта 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
Как-то так.

Неактивний

#6 2016-10-16 21:56:32

goodspeedmen
Учасник
З https://discord.gg/6hbs98y
Зареєстрований: 2016-10-02
Повідомлень: 81

Re: Lcd

alex_dol пише:

Я так понял нужен форматированный вывод на дисплей. Варианта 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
Как-то так.


Я конечно не специалист но после деления в перемененной останется число деления а не исходное вот поэтому я и использовал переменный для сохранения результата и вывода его на экран

Неактивний

#7 2016-10-17 08:28:18

alex_dol
Учасник
Зареєстрований: 2015-12-28
Повідомлень: 196

Re: Lcd

Похоже мы говорим о разных вещах.
У тебя изначально дробное число с одной цифрой после запятой. Храни его в long умноженным на 10, иначе говоря младший разряд - это цифра после запятой, все остальное целая часть. Дальше смотри 2-й пост.

Неактивний

#8 2016-10-17 10:10:50

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: Lcd

goodspeedmen пише:

а можно как то подробней что то у меня ерунда получается какая то  sad  long хранит четыре бита но запятая то как получается hmm
............
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, но тогда все самописное, и начните с простого.

Неактивний

#9 2016-10-17 17:09:10

goodspeedmen
Учасник
З https://discord.gg/6hbs98y
Зареєстрований: 2016-10-02
Повідомлень: 81

Re: Lcd

Я же не специалист и не писал что бы кто то чего то исправлял. Я сужу из того что контроллер 8 битный его регистры тоже (значит с байтами ему работать проще), есть пары регистровые но все же это занимает его время на обработку инициализация long деление его, вывод информации и прочие. Честно я надеялся увидеть нечто совсем другое...
lowByte()
highByte()

Остання редакція goodspeedmen (2016-10-17 17:53:35)

Неактивний

#10 2016-10-17 21:37:49

alex_dol
Учасник
Зареєстрований: 2015-12-28
Повідомлень: 196

Re: Lcd

Согласен - деление занимает много времени, но это окупается простотой работы с числом. Через lowByte() и highByte() ниче у вас не выйдет, например число больше 65355, что тогда?

Неактивний

#11 2016-10-18 08:37:44

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: Lcd

)))
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 будете выводить?

Неактивний

#12 2016-10-18 20:46:53

Nefreemen
Учасник
З Киев
Зареєстрований: 2015-12-19
Повідомлень: 716

Re: Lcd

Сотрите последнее знакоместо на LCD  smile. Вы сначала выводите четыре символа а потом три а последний остается  wink .

Неактивний

#13 2016-10-18 20:50:12

goodspeedmen
Учасник
З https://discord.gg/6hbs98y
Зареєстрований: 2016-10-02
Повідомлень: 81

Re: Lcd

Честно сказать после ваших ответов я чувствую себя ущербным (я не обидчивый и готов выслушивать конструктивную критику если от неё есть польза)...  Как придумал, смотрел видео, читал про работу контроллеров для вывода информации на экран нужен байт как по мне вполне очевидный вывод учитывая вводные параметры. Опрос if происходит по мере необходимости соответственно процессору легче оперировать этими цифрами (мне так казалось) neutral И оно отлично работает к тому же. Просто возникла проблема, нужно сравнивать эти цифры на  "<" ">" с таким же количество байтов и тут иногда по каким то непонятным мне причинам определяется, сумма отпала сразу так как "от перемены мест слагаемых сумма не изменяется"  x_0 > y_0 || x_1 > y_1 результат тоже не ахти.

Остання редакція goodspeedmen (2016-10-18 21:07:04)

Неактивний

#14 2016-10-18 20:59:14

Nefreemen
Учасник
З Киев
Зареєстрований: 2015-12-19
Повідомлень: 716

Re: Lcd

goodspeedmen, Какой у Вас ЛЦД? Если типа 1602 или аналогичный то перед выводом на дисплей очистите  соответственно количество символов с позиции которой Вы выводите на экран. С графическим немножко сложнее нужно очистить прямоугольник.
Если не очищать то получается примерно такое:
102.4
98.74 - а должно быть (хотелось вывести) 98.7 smile .

Остання редакція Nefreemen (2016-10-18 21:04:33)

Неактивний

#15 2016-10-18 21:12:08

goodspeedmen
Учасник
З https://discord.gg/6hbs98y
Зареєстрований: 2016-10-02
Повідомлень: 81

Re: Lcd

Ребята я очень всем благодарен всем за ваши ответы но поймите я не умею читать мысли, если их пишите то излагайте из в виде кода, мы же тут "программисты" всё же big_smile

Неактивний

#16 2016-10-18 21:26:32

alex_dol
Учасник
Зареєстрований: 2015-12-28
Повідомлень: 196

Re: Lcd

goodspeedmen пише:

Ребята я очень всем благодарен всем за ваши ответы но поймите я не умею читать мысли, если их пишите то излагайте из в виде кода, мы же тут "программисты" всё же big_smile

Я тоже не умею читать мысли. Диапазон чисел? Какой дисплей? Какие действия с числами надо совершать?
Какой код можно написать не зная под что писать?

Неактивний

#17 2016-10-18 22:07:57

Nefreemen
Учасник
З Киев
Зареєстрований: 2015-12-19
Повідомлень: 716

Re: Lcd

Приведите кусок кода где происходит вывод на LCD.

Неактивний

#18 2016-10-18 22:17:52

goodspeedmen
Учасник
З https://discord.gg/6hbs98y
Зареєстрований: 2016-10-02
Повідомлень: 81

Re: Lcd

Nefreemen пише:

goodspeedmen, Какой у Вас ЛЦД? Если типа 1602 или аналогичный то перед выводом на дисплей очистите  соответственно количество символов с позиции которой Вы выводите на экран. С графическим немножко сложнее нужно очистить прямоугольник.
Если не очищать то получается примерно такое:
102.4
98.74 - а должно быть (хотелось вывести) 98.7 smile .

Да 1602. Я думал передвигать курсор, очищать его if (lcd... < 100) но получается мерцание при очистке ну и к тому же упираемся в лишний код который не нужен...

Неактивний

#19 2016-10-18 23:07:43

Nefreemen
Учасник
З Киев
Зареєстрований: 2015-12-19
Повідомлень: 716

Re: Lcd

Капец, ну глаз, мерцание...А кода значение меняется Вы то же мерцание видите smile ?
Интересно если сделать так...Тоже будет "мерцать"
      lcd.setCursor(2, 0);
      lcd.print("     "); - стираете 5 символов
      lcd.setCursor(2, 0);
      lcd.print(n) - печатаете переменную n не больше 5 символов с той же позиции.
Возможно топорно но просто ( без каких то вычислений длины печати и пр. лабуды).
Ну если лишний код, извините я уж не знаю "лишняя ли у попа жена" lol

Неактивний

#20 2016-10-19 09:45:33

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: Lcd

"лишняя ли у попа жена"  чес слово поржал, ну у вас и  сравнения )))
между прочим 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);
}

я думал что этот код рабочий

Неактивний

#21 2016-10-19 09:47:39

goodspeedmen
Учасник
З https://discord.gg/6hbs98y
Зареєстрований: 2016-10-02
Повідомлень: 81

Re: Lcd

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)

Неактивний

#22 2016-10-19 11:10:26

alex_dol
Учасник
Зареєстрований: 2015-12-28
Повідомлень: 196

Re: Lcd

Перечитал еще раз 1-й пост. У вас 0 остается от числа 100.0, так как 99.9 занимает на одно знакоместо меньше и 0 стандартными средствами не затирается. Если число будет 9.9 - будет видно 2 знака от предыдущих чисел. Вам надо либо перед выводом затирать предыдущие числа пробелами (можно просто очистить дисплей) либо нужен форматированный вывод на дисплей. Ознакомтесь http://www.c-cpp.ru/content/printf. Про оба эти метода уже писали ранее, но вы упорно изобретаете велосипед.

Кусок кода, который вы привели является вариантом форматированного вывода, только вместо одной переменной вы используете 4.

Неактивний

#23 2016-10-19 11:11:22

goodspeedmen
Учасник
З https://discord.gg/6hbs98y
Зареєстрований: 2016-10-02
Повідомлень: 81

Re: Lcd

Nefreemen пише:

Капец, ну глаз, мерцание...А кода значение меняется Вы то же мерцание видите smile ?
Интересно если сделать так...Тоже будет "мерцать"
      lcd.setCursor(2, 0);
      lcd.print("     "); - стираете 5 символов
      lcd.setCursor(2, 0);
      lcd.print(n) - печатаете переменную n не больше 5 символов с той же позиции.
Возможно топорно но просто ( без каких то вычислений длины печати и пр. лабуды).
Ну если лишний код, извините я уж не знаю "лишняя ли у попа жена" lol

Спасибо нужно будет попробовать. И всё же две попы тоже не ахти.  big_smile

Остання редакція goodspeedmen (2016-10-19 11:14:06)

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму