Мерцание LCD
- Войдите на сайт для отправки комментариев
Чт, 31/12/2015 - 20:15
Помогите пожайлуста:
Проблемма мерцает LCD, не так чтобы особо, но если присмотрется мерцание видно. Кусок кода отвечающий за вывод на экран ниже - как я понимаю если смомента последнего вывода на экран переменные StepFred и fred не изменят своего значения к LCD обращения не должно быть вообще.
Все компилируется и прекрасно работает.
По факту надписи Fred и Step совершенно не мерцают, а цифры довольно сильно(особенно если сбоку смотреть)...
/////////////////////////////////////////////////////////////////////// if ((StepFred!=StepFred2)&&(freq!=freq2)) { //Вывод на LCD текущего значения частоты и шага изменения частоты //Частота lcd.setCursor(0,0); // Далее вывод текущего значения частоты lcd.print("Freq: "); lcd.setCursor(6,0); lcd.print(" "); lcd.setCursor(6,0); if (freq<1000){lcd.print(freq); lcd.print("Hz");} if ((freq>=1000)&&(freq<1000000)){lcd.print(freq / 1000); lcd.print("kHz");} if ((freq>=1000000)&&(freq<50000000)){lcd.print(freq / 1000000); lcd.print("MHz");} freq = freq2; //Шаг изменения частоты lcd.setCursor(0,1); // Далее вывод текущего значения частоты lcd.print("Step: "); lcd.setCursor(6,1); lcd.print(" "); lcd.setCursor(6,1); if (StepFred<1000){lcd.print(StepFred); lcd.print("Hz");} if ((StepFred>=1000)&&(StepFred<1000000)){lcd.print(StepFred / 1000); lcd.print("kHz");} if ((StepFred>=1000000)&&(StepFred<50000000)){lcd.print(StepFred / 1000000); lcd.print("MHz");} StepFred = StepFred2 ///////////////////////////////////////////////////////////////// }
09
//
lcd.print(
" "
);
24
//
lcd.print(
" "
);
В строке 2 логическая ошибка, отображаться будет только если сменились ОБА значения. Если это правильно, то нормально, иначе вместо И нужно ИЛИ.
Текст не меняется, можно его вывести один раз, а потом менять только числа.
Моргает, потому что стирается текст, а потом по тому же месту отображается, плюс пауза между сменой значений маленькая. Грубо говоря, если после отображения делать паузу, например, секунду, то моргать будет меньше. Я не говорю, что эта пауза нужна.
Далее, чтобы не стирать место под числом, можно отвести под число буфер, выводить в него, а потом на экран, т.е. буфер должен содержать пробелы и само число, тогда не будет стирания, а потом вывода. Стирание будет одновременно с выводом в один приём, а не в два.
"отображаться будет только если сменились ОБА значения" - прощелкал клювом, действительно правильнее переписывать когда сменилось хотя бы одно. Только вот беда в том что эта зараза перезаписывает независимо от того меняется что или нет!!!
"отображаться будет только если сменились ОБА значения" - прощелкал клювом, действительно правильнее переписывать когда сменилось хотя бы одно. Только вот беда в том что эта зараза перезаписывает независимо от того меняется что или нет!!!
Предполагаю, что у Вас перепутано StepFreq & StepFreq2, аналогично freq & freq2, Вы отображаете StepFreq2 & freq2, подозреваю, что это не правильно. Поэтому лучше всегда называть переменные корректно, например LastStep, а не StepFreq2, lastFreq, а не freq2, тогда ошибок будет меньше.
Всё, всем до следующего года ;) С наступающим!
Увы не перепутанно StepFreq и freq - шаг частоты и сама частота, а freq2 и StepFreq2 это переменные исключительно для этого цикла проверки. freq2 и StepFreq2 - используются ИСКЛЮЧИТЕЛЬНО в этом куске скеча и больше нигде не участвуют...
Возможно я неправильно выразился вначале - хотелось бы обновлять дисплей только если изменилась одна из переменных StepFreq или freq, все остальное я накрутил как умел именно для этой цели.
StepFreq2 и freq2 в этом куске кода не меняются. Значит не участвуют.
Эту лажу я уже нашол и исправил - правильно. Только все равно обновляется гад!!!
Эту лажу я уже нашол и исправил - правильно. Только все равно обновляется гад!!!
ну, ты как-то определись - тебе нужно, что бы не обновлялось или, что бы не мерцало.
что бы не обновлялось - это тараканы твоего кода.
что бы не мерцало - я тебе показал, в какую строну копать: не печатай пробелы.
Не печатать пробелы нельзя, старое значение в некоторых случаях полностью затиратся не будет.
Я хочу чтобы процедура вывода на LCD работала только в том случае если изменится одна из переменных StepFreq или freq.
Проверять клавиши и энкодер нужно постоянно, а вот изменение переменных может происходить при настройке несколько раз в секунду(тут мерцание неизбежное зло) или при подстройке, а подстройка может быть 1 раз в 10 - 30 минут...
Вот меня и достает то что LCD мерцает даже в том случае если StepFreq или freq не меняются!!!!!!!
Я ещё в сообщении #2 в последнем абзаце написал вариант решения
Не печатать пробелы нельзя, старое значение в некоторых случаях полностью затиратся не будет.
можно
Я хочу чтобы процедура вывода на LCD работала только в том случае если изменится одна из переменных StepFreq или freq.
лови тараканов в коде - почему у тебя обновляется, если не должно обновляться
Вот меня и достает то что LCD мерцает даже в том случае если StepFreq или freq не меняются!!!!!!!
а, меня достаёт, что ты не желаешь ловить тараканов.
С посимвольным затиранием надписи не подумал, безусловно интересный вариант если нужно менять цифры непрерывно. Тут парадокс в другом - если не трогать кнопку или энкодер переменные StepFred и fred не меняются!!!
StepFred2 и fred2 задаются при обьявлении переменных равными нулю, надписи тоже делаются в самом начале и в основном цикле их нет, да и не мерцают они.
Вопрос заключается не в том почему мерцает в момент изменения переменных - значения переменных мерцают ВСЕГДА!!!! даже если на экран выводится одно и то же число. Я конечно далеко не знаток програмирования, но вроде как в том случае если StepFred = StepFred2 и fred = fred2 все что внутри фигурных скобок должно просто пропускатся?
В коде больше нет НИКАКИХ обращений к LCD кроме прилагающего куска.
Вот последний код который я пробывал вставить в скеч:
С посимвольным затиранием надписи не подумал, безусловно интересный вариант если нужно менять цифры непрерывно. Тут парадокс в другом - если не трогать кнопку или энкодер переменные StepFred и fred не меняются!!!
слушай, тебе нужно было, что бы не мерцало? - я тебе показал, как.
что у тебя там непрерывно долбит индикатор - нет желания разбираться.
В коде больше нет НИКАКИХ обращений к LCD кроме прилагающего куска.
Причём тут обращения к LCD ?