Мерцание 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.setCursor(0, 0); lcd.print(n); if (n < 10) {lcd.print(" ");} if (n < 100) {lcd.print(" ");} if (n < 1000) {lcd.print(" ");} if (n < 10000) {lcd.print(" ");} if (n < 100000) {lcd.print(" ");} if (n < 1000000) {lcd.print(" ");}Я хочу чтобы процедура вывода на LCD работала только в том случае если изменится одна из переменных StepFreq или freq.
лови тараканов в коде - почему у тебя обновляется, если не должно обновляться
Вот меня и достает то что LCD мерцает даже в том случае если StepFreq или freq не меняются!!!!!!!
а, меня достаёт, что ты не желаешь ловить тараканов.
С посимвольным затиранием надписи не подумал, безусловно интересный вариант если нужно менять цифры непрерывно. Тут парадокс в другом - если не трогать кнопку или энкодер переменные StepFred и fred не меняются!!!
StepFred2 и fred2 задаются при обьявлении переменных равными нулю, надписи тоже делаются в самом начале и в основном цикле их нет, да и не мерцают они.
Вопрос заключается не в том почему мерцает в момент изменения переменных - значения переменных мерцают ВСЕГДА!!!! даже если на экран выводится одно и то же число. Я конечно далеко не знаток програмирования, но вроде как в том случае если StepFred = StepFred2 и fred = fred2 все что внутри фигурных скобок должно просто пропускатся?
В коде больше нет НИКАКИХ обращений к LCD кроме прилагающего куска.
Вот последний код который я пробывал вставить в скеч:
/////////////////////////////////////////////////////////////////////// if ((StepFred!=StepFred2)||(freq!=freq2)) { //Вывод на LCD текущего значения частоты и шага изменения частоты //Частота lcd.setCursor(6,0); lcd.print(" "); lcd.setCursor(6,0); lcd.print(freq); freq2 = freq; //Шаг изменения частоты 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");} StepFred2 = StepFred ///////////////////////////////////////////////////////////////// }С посимвольным затиранием надписи не подумал, безусловно интересный вариант если нужно менять цифры непрерывно. Тут парадокс в другом - если не трогать кнопку или энкодер переменные StepFred и fred не меняются!!!
слушай, тебе нужно было, что бы не мерцало? - я тебе показал, как.
что у тебя там непрерывно долбит индикатор - нет желания разбираться.
В коде больше нет НИКАКИХ обращений к LCD кроме прилагающего куска.
Причём тут обращения к LCD ?