Страница 1 из 2
алгоритм установки значения разряда числа в меню
Добавлено: Пн апр 20, 2015 19:07:28
kolobokus
Прошу помощи. Не могу сообразить алгоритм установки значения числа по разрядам.
Задача такая: имеется модифицируемое в меню 3-х разрядное десятичное число (переменная в EEPROM), выводимое на индикатор. Например 09.8 (дробное, с одним знаком после запятой)
Требуется идея (алгоритм), как сделать так, чтобы короткими нажатиями кнопки можно было перебрать последовательно все значения одного (мигающего) разряда и длинным нажатием перейти к следующему.
Собственно, непонятно только как переходить от одного разряда к другому (по циклу). Если кто ткнет в пример - тоже буду очень благодарен.

Re: алгоритм установки значения разряда числа в меню
Добавлено: Пн апр 20, 2015 19:11:03
ARV
не, ну вы спросили!

пусть в переменной i хранится номер разряда вашего числа. всего разрядов 3. тогда переход от одного разряда к следующему по кругу будет делаться элементарным оператором
if(++i >= 3) i = 0;
какой алгоритм вы ждете?!
Re: алгоритм установки значения разряда числа в меню
Добавлено: Пн апр 20, 2015 19:36:33
kolobokus
ARV писал(а):не, ну вы спросили!

какой алгоритм вы ждете?!
Мне, наверное, тоже такая бритва нужна.... чтобы отсекать все лишнее....
Я не знаю, как "замигать" нужный разряд. Нужно их по одному выводить через sprintf() - lcd_puts(), или как-то сформировать все число и вывести за раз? (я почти "0" в СИ)
Re: алгоритм установки значения разряда числа в меню
Добавлено: Пн апр 20, 2015 19:40:04
ARV
на ЖКИ "замигать" будет сложновато, зато там есть режим курсора - включите его и все дела, он для того и нужен. в некоторых ЖКИ курсор и мигает, или знакместо под курсором мигает - это по даташиту на ЖКИ смотреть надо.
Re: алгоритм установки значения разряда числа в меню
Добавлено: Пн апр 20, 2015 19:50:59
kolobokus
Согласен, курсором гораздо проще. Спасибо, наверное это мое желание и было лишним, если не существует простого решения

Re: алгоритм установки значения разряда числа в меню
Добавлено: Пн апр 20, 2015 19:51:12
А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);
}
Re: алгоритм установки значения разряда числа в меню
Добавлено: Пн апр 20, 2015 19:58:39
kolobokus
Аlex писал(а):Примитивно
[/code]
Спасибо, только, наверное правильней lcd_gotoxy(sym_num,0);
А как в val менять соответствующий разряд?
Re: алгоритм установки значения разряда числа в меню
Добавлено: Пн апр 20, 2015 20:00:14
А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;
}
}
Re: алгоритм установки значения разряда числа в меню
Добавлено: Пн апр 20, 2015 20:03:08
Аlex
kolobokus писал(а):только, наверное правильней lcd_gotoxy(sym_num,0);
Ну или так. Не знаю как у Вас происходит адресация на дисплее.
Я написал для примера.
kolobokus писал(а):А как в val менять соответствующий разряд?
В
val хранится значение, которое выводится на дисплей. А мигаем мы через
lcd_gotoxy, смещая разряд по
x и выводя на это знакоместо "пустоту".
Извиняюсь, надо так делать :
Чтобы выводился 0 в десятках. Иначе, при значении меньше 10, мигать будет нечем

Re: алгоритм установки значения разряда числа в меню
Добавлено: Пн апр 20, 2015 20:42:38
ARV
с курсором проще и логичнее. крайне неудобно, когда средний разряд пропадает во время мигания - по личному опыту скажу. с курсором понятнее.
Re: алгоритм установки значения разряда числа в меню
Добавлено: Пн апр 20, 2015 20:47:18
kolobokus
Alex, спасибо еще раз. Я понял как "замигать" соответствующий разряд и как сформировать его номер. Но я не понимаю, как в имеющейся float переменной, значение которой выводится на дисплей, менять конкретный разряд. Не на дисплее, а в самой переменной.
Вот объявил ее и установил в прошивке начальное значение eeprom float val=9.8;
В меню надо как-то выделить один разряд этого числа, чтобы его модифицировать, потом следующий... А как это сделать? Мне не само меню нужно, с этим я разберусь. Не понимаю сам принцип выделения нужного (очередного) разряда переменной для его модификации. Просьба подсказать.
Re: алгоритм установки значения разряда числа в меню
Добавлено: Пн апр 20, 2015 20:47:56
Аlex
ARV. Согласен.
Я вообще всегда делаю мигающим всё значение. Если оно слишком большое (долго перебирать), то добавляю изменение скорости перебора, зависящее от длительности нажатия кнопки. Плюс мигание пропадает во время изменения значения.
kolobokus.
Ну, самое простое, это прибавлять/отнимать единицу, умноженную на 10 в степени значения мигающего разряда.
Re: алгоритм установки значения разряда числа в меню
Добавлено: Пн апр 20, 2015 20:50:54
kolobokus
ARV писал(а):с курсором проще и логичнее. крайне неудобно, когда средний разряд пропадает во время мигания - по личному опыту скажу. с курсором понятнее.
Пожалуй, я готов согласиться с вами. Однако я обнаружил пустоту в своих знаниях о способе модификации конкретного разряда переменной. Это сейчас общая проблема для обоих методов обозначения модифицируемого разряда
Re: алгоритм установки значения разряда числа в меню
Добавлено: Пн апр 20, 2015 21:03:11
Аlex
kolobokus, посоветую Вам избавиться от плавающей точки и сделать её фиксированной.
Например, если у Вас точность до десятых, то храните целое значение, умноженное на 10. Работать с такими числами будет удобнее и "легче" для контроллера.
Re: алгоритм установки значения разряда числа в меню
Добавлено: Пн апр 20, 2015 21:07:05
kolobokus
Аlex писал(а):
Ну, самое простое, это прибавлять/отнимать единицу, умноженную на 10 в степени значения мигающего разряда.

То есть, для младшего разряда числа 9.8 это будет:
А, понял, в степени номера разряда, да? То есть 10 в минус первой для младшего.
Re: алгоритм установки значения разряда числа в меню
Добавлено: Пн апр 20, 2015 21:12:45
Аlex
Не совсем.
Разрядность Вашего числа = 0.1 Значит нужно 0.1*10^x
При x=0 (первый разряд), число будет = 0.1
При x=1 (второй разряд), число будет = 1
И т.д...
Для целых чисел, умножать будем уже не 0.1, а 1.
А, понял, в степени номера разряда, да? То есть 10 в минус первой для младшего.
Пока писал, Вы уже ответили

Да, совершенно верно.
Можно брать множитель - единицу, а степень отрицательную (для десятых, сотых, ...). А можно множитель взять равный разрядности числа.
Re: алгоритм установки значения разряда числа в меню
Добавлено: Пн апр 20, 2015 21:24:15
kolobokus
Спасибо всем за помощь, сейчас замяучу меню.
Re: алгоритм установки значения разряда числа в меню
Добавлено: Пн апр 20, 2015 21:25:56
Аlex
И всё-таки, посоветую Вам ещё раз - если есть возможность, избавьтесь от плавающей точки.
Re: алгоритм установки значения разряда числа в меню
Добавлено: Пн апр 20, 2015 22:05:41
ARV
а мой совет будет парадоксальным:
1. выводите число в строку
2. редактируйте строку на ЖКИ
3. преобразовывайте строку в число
чем этот вариант хорош по сравнению с вычислением разрядов и т.п.:
- каждый разряд редактируется абсолютно идентично: перебор символов от '0' до '9', если плавающая точка или еще что-то подобное, то при сдвиге редактируемой позиции надо проверить, что за символ в этой позиции и, если это точка или что-то "неизменное", сдвинуть курсор на 1 позицию дальше.
- вы отказываетесь от лишних вычислений, что, например, для чисел с плавающей или фиксированной точкой может быть опасным из-за накопления погрешности при редактировании малых значений.
- чисто функционально на дисплее логичнее работать именно с символами, поэтому в процессе редактирования нет ломки парадигмы число-символ (на ЖКИ строка и мы работаем со строкой, а при вашем подходе на ЖКИ строка, но мы работаем с числами)
- можно редактировать числа любой разрядности, при этом алгоритм не меняется вообще - просто задаете число допустимых позиций и все.
- можно редактировать незначащие левые нули, вводя или выводя пробелы
в общем, рекомендую

Re: алгоритм установки значения разряда числа в меню
Добавлено: Пн апр 20, 2015 22:22:41
kolobokus
To Alex: Да, я уже понял, что лучше работать с целыми числами int val=98; , а десятые отображать только на дисплее через sprintf(lcd_buf,"%02u.%u",val/10,val%10);