алгоритм установки значения разряда числа в меню

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
kolobokus
Встал на лапы
Сообщения: 116
Зарегистрирован: Пн дек 29, 2014 19:51:49
Откуда: Санкт-Петербург

алгоритм установки значения разряда числа в меню

Сообщение kolobokus »

Прошу помощи. Не могу сообразить алгоритм установки значения числа по разрядам. :( :dont_know:
Задача такая: имеется модифицируемое в меню 3-х разрядное десятичное число (переменная в EEPROM), выводимое на индикатор. Например 09.8 (дробное, с одним знаком после запятой)
Требуется идея (алгоритм), как сделать так, чтобы короткими нажатиями кнопки можно было перебрать последовательно все значения одного (мигающего) разряда и длинным нажатием перейти к следующему.
Собственно, непонятно только как переходить от одного разряда к другому (по циклу). Если кто ткнет в пример - тоже буду очень благодарен. :)
Что такое электроника?
Кажется, это то, что было перед фотоникой!
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18629
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: алгоритм установки значения разряда числа в меню

Сообщение ARV »

не, ну вы спросили! :))) пусть в переменной i хранится номер разряда вашего числа. всего разрядов 3. тогда переход от одного разряда к следующему по кругу будет делаться элементарным оператором if(++i >= 3) i = 0;

какой алгоритм вы ждете?!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
Аватара пользователя
kolobokus
Встал на лапы
Сообщения: 116
Зарегистрирован: Пн дек 29, 2014 19:51:49
Откуда: Санкт-Петербург

Re: алгоритм установки значения разряда числа в меню

Сообщение kolobokus »

ARV писал(а):не, ну вы спросили! :)))
какой алгоритм вы ждете?!
Мне, наверное, тоже такая бритва нужна.... чтобы отсекать все лишнее....
Я не знаю, как "замигать" нужный разряд. Нужно их по одному выводить через sprintf() - lcd_puts(), или как-то сформировать все число и вывести за раз? (я почти "0" в СИ)
Что такое электроника?
Кажется, это то, что было перед фотоникой!
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18629
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: алгоритм установки значения разряда числа в меню

Сообщение ARV »

на ЖКИ "замигать" будет сложновато, зато там есть режим курсора - включите его и все дела, он для того и нужен. в некоторых ЖКИ курсор и мигает, или знакместо под курсором мигает - это по даташиту на ЖКИ смотреть надо.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
kolobokus
Встал на лапы
Сообщения: 116
Зарегистрирован: Пн дек 29, 2014 19:51:49
Откуда: Санкт-Петербург

Re: алгоритм установки значения разряда числа в меню

Сообщение kolobokus »

Согласен, курсором гораздо проще. Спасибо, наверное это мое желание и было лишним, если не существует простого решения :))
Что такое электроника?
Кажется, это то, что было перед фотоникой!
Реклама
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: алгоритм установки значения разряда числа в меню

Сообщение Аlex »

Я не знаю, как "замигать" нужный разряд.
Примитивно :

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

unsigned char sym_num;  // Номер мигаемого символа

sym_num=0;
while(1){
  sprintf(lcd_buf, "%2.1f", val);
  lcd_gotoxy(0,0);
  lcd_puts(lcd_buf);
  delay_ms(500);
  lcd_gotoxy(0,sym_num);
  lcd_puts(" ");
  delay_ms(500);
}
Реклама
Аватара пользователя
kolobokus
Встал на лапы
Сообщения: 116
Зарегистрирован: Пн дек 29, 2014 19:51:49
Откуда: Санкт-Петербург

Re: алгоритм установки значения разряда числа в меню

Сообщение kolobokus »

Аlex писал(а):Примитивно

[/code]
Спасибо, только, наверное правильней lcd_gotoxy(sym_num,0);

А как в val менять соответствующий разряд?
Что такое электроника?
Кажется, это то, что было перед фотоникой!
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: алгоритм установки значения разряда числа в меню

Сообщение Аlex »

С кнопкой и перебором символов, как то так :

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

unsigned char sym_num;  // Номер мигаемого символа

sym_num=0;
while(1){
  sprintf(lcd_buf, "%2.1f", val);
  lcd_gotoxy(0,0);
  lcd_puts(lcd_buf);
  delay_ms(500);
  lcd_gotoxy(0,sym_num);
  lcd_puts(" ");
  delay_ms(500);

 if(butt_click){  // Если кнопка была нажата
   if(++sym_num>=3)   break;
 }
}
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: алгоритм установки значения разряда числа в меню

Сообщение Аlex »

kolobokus писал(а):только, наверное правильней lcd_gotoxy(sym_num,0);
Ну или так. Не знаю как у Вас происходит адресация на дисплее.
Я написал для примера.
kolobokus писал(а):А как в val менять соответствующий разряд?
В val хранится значение, которое выводится на дисплей. А мигаем мы через lcd_gotoxy, смещая разряд по x и выводя на это знакоместо "пустоту".

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

  sprintf(lcd_buf, "%2.1f", val);
Извиняюсь, надо так делать :

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

  sprintf(lcd_buf, "%02.1f", val);
Чтобы выводился 0 в десятках. Иначе, при значении меньше 10, мигать будет нечем :)
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18629
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: алгоритм установки значения разряда числа в меню

Сообщение ARV »

с курсором проще и логичнее. крайне неудобно, когда средний разряд пропадает во время мигания - по личному опыту скажу. с курсором понятнее.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
kolobokus
Встал на лапы
Сообщения: 116
Зарегистрирован: Пн дек 29, 2014 19:51:49
Откуда: Санкт-Петербург

Re: алгоритм установки значения разряда числа в меню

Сообщение kolobokus »

Alex, спасибо еще раз. Я понял как "замигать" соответствующий разряд и как сформировать его номер. Но я не понимаю, как в имеющейся float переменной, значение которой выводится на дисплей, менять конкретный разряд. Не на дисплее, а в самой переменной.
Вот объявил ее и установил в прошивке начальное значение eeprom float val=9.8;
В меню надо как-то выделить один разряд этого числа, чтобы его модифицировать, потом следующий... А как это сделать? Мне не само меню нужно, с этим я разберусь. Не понимаю сам принцип выделения нужного (очередного) разряда переменной для его модификации. Просьба подсказать.
Что такое электроника?
Кажется, это то, что было перед фотоникой!
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: алгоритм установки значения разряда числа в меню

Сообщение Аlex »

ARV. Согласен.
Я вообще всегда делаю мигающим всё значение. Если оно слишком большое (долго перебирать), то добавляю изменение скорости перебора, зависящее от длительности нажатия кнопки. Плюс мигание пропадает во время изменения значения.

kolobokus.
Ну, самое простое, это прибавлять/отнимать единицу, умноженную на 10 в степени значения мигающего разряда.
Аватара пользователя
kolobokus
Встал на лапы
Сообщения: 116
Зарегистрирован: Пн дек 29, 2014 19:51:49
Откуда: Санкт-Петербург

Re: алгоритм установки значения разряда числа в меню

Сообщение kolobokus »

ARV писал(а):с курсором проще и логичнее. крайне неудобно, когда средний разряд пропадает во время мигания - по личному опыту скажу. с курсором понятнее.
Пожалуй, я готов согласиться с вами. Однако я обнаружил пустоту в своих знаниях о способе модификации конкретного разряда переменной. Это сейчас общая проблема для обоих методов обозначения модифицируемого разряда
Что такое электроника?
Кажется, это то, что было перед фотоникой!
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: алгоритм установки значения разряда числа в меню

Сообщение Аlex »

kolobokus, посоветую Вам избавиться от плавающей точки и сделать её фиксированной.
Например, если у Вас точность до десятых, то храните целое значение, умноженное на 10. Работать с такими числами будет удобнее и "легче" для контроллера.
Аватара пользователя
kolobokus
Встал на лапы
Сообщения: 116
Зарегистрирован: Пн дек 29, 2014 19:51:49
Откуда: Санкт-Петербург

Re: алгоритм установки значения разряда числа в меню

Сообщение kolobokus »

Аlex писал(а): Ну, самое простое, это прибавлять/отнимать единицу, умноженную на 10 в степени значения мигающего разряда.

:shock: То есть, для младшего разряда числа 9.8 это будет:
степень.jpg
(1.63 КБ) 510 скачиваний
А, понял, в степени номера разряда, да? То есть 10 в минус первой для младшего.
Что такое электроника?
Кажется, это то, что было перед фотоникой!
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: алгоритм установки значения разряда числа в меню

Сообщение Аlex »

Не совсем.
Разрядность Вашего числа = 0.1 Значит нужно 0.1*10^x
При x=0 (первый разряд), число будет = 0.1
При x=1 (второй разряд), число будет = 1
И т.д...

Для целых чисел, умножать будем уже не 0.1, а 1.
А, понял, в степени номера разряда, да? То есть 10 в минус первой для младшего.
Пока писал, Вы уже ответили :)
Да, совершенно верно.
Можно брать множитель - единицу, а степень отрицательную (для десятых, сотых, ...). А можно множитель взять равный разрядности числа.
Аватара пользователя
kolobokus
Встал на лапы
Сообщения: 116
Зарегистрирован: Пн дек 29, 2014 19:51:49
Откуда: Санкт-Петербург

Re: алгоритм установки значения разряда числа в меню

Сообщение kolobokus »

Спасибо всем за помощь, сейчас замяучу меню.
Что такое электроника?
Кажется, это то, что было перед фотоникой!
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: алгоритм установки значения разряда числа в меню

Сообщение Аlex »

И всё-таки, посоветую Вам ещё раз - если есть возможность, избавьтесь от плавающей точки.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18629
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: алгоритм установки значения разряда числа в меню

Сообщение ARV »

а мой совет будет парадоксальным:
1. выводите число в строку
2. редактируйте строку на ЖКИ
3. преобразовывайте строку в число

чем этот вариант хорош по сравнению с вычислением разрядов и т.п.:
- каждый разряд редактируется абсолютно идентично: перебор символов от '0' до '9', если плавающая точка или еще что-то подобное, то при сдвиге редактируемой позиции надо проверить, что за символ в этой позиции и, если это точка или что-то "неизменное", сдвинуть курсор на 1 позицию дальше.
- вы отказываетесь от лишних вычислений, что, например, для чисел с плавающей или фиксированной точкой может быть опасным из-за накопления погрешности при редактировании малых значений.
- чисто функционально на дисплее логичнее работать именно с символами, поэтому в процессе редактирования нет ломки парадигмы число-символ (на ЖКИ строка и мы работаем со строкой, а при вашем подходе на ЖКИ строка, но мы работаем с числами)
- можно редактировать числа любой разрядности, при этом алгоритм не меняется вообще - просто задаете число допустимых позиций и все.
- можно редактировать незначащие левые нули, вводя или выводя пробелы

в общем, рекомендую :)))
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
kolobokus
Встал на лапы
Сообщения: 116
Зарегистрирован: Пн дек 29, 2014 19:51:49
Откуда: Санкт-Петербург

Re: алгоритм установки значения разряда числа в меню

Сообщение kolobokus »

To Alex: Да, я уже понял, что лучше работать с целыми числами int val=98; , а десятые отображать только на дисплее через sprintf(lcd_buf,"%02u.%u",val/10,val%10);
Последний раз редактировалось kolobokus Пн апр 20, 2015 22:25:06, всего редактировалось 1 раз.
Что такое электроника?
Кажется, это то, что было перед фотоникой!
Ответить

Вернуться в «Разные вопросы по МК»