Мерцание LCD

AS31979
Offline
Зарегистрирован: 22.12.2015

Помогите пожайлуста:

Проблемма мерцает 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
/////////////////////////////////////////////////////////////////
 } 

 

Клапауций 322
Offline
Зарегистрирован: 31.12.2015

 

09  // lcd.print("           ");
24  // lcd.print("           "); 

 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

В строке 2 логическая ошибка, отображаться будет только если сменились ОБА значения. Если это правильно, то нормально, иначе вместо И нужно ИЛИ.
Текст не меняется, можно его вывести один раз, а потом менять только числа.
Моргает, потому что стирается текст, а потом по тому же месту отображается, плюс пауза между сменой значений маленькая. Грубо говоря, если после отображения делать паузу, например, секунду, то моргать будет меньше. Я не говорю, что эта пауза нужна.
Далее, чтобы не стирать место под числом, можно отвести под число буфер, выводить в него, а потом на экран, т.е. буфер должен содержать пробелы и само число, тогда не будет стирания, а потом вывода. Стирание будет одновременно с выводом в один приём, а не в два.

AS31979
Offline
Зарегистрирован: 22.12.2015

"отображаться будет только если сменились ОБА значения" - прощелкал клювом, действительно правильнее  переписывать когда сменилось хотя бы одно. Только вот беда в том что эта зараза перезаписывает независимо от того меняется что или нет!!!

 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

AS31979 пишет:

"отображаться будет только если сменились ОБА значения" - прощелкал клювом, действительно правильнее  переписывать когда сменилось хотя бы одно. Только вот беда в том что эта зараза перезаписывает независимо от того меняется что или нет!!!

 

Предполагаю, что у Вас перепутано StepFreq & StepFreq2, аналогично freq & freq2, Вы отображаете StepFreq2 & freq2, подозреваю, что это не правильно. Поэтому лучше всегда называть переменные корректно, например LastStep, а не StepFreq2, lastFreq, а не freq2, тогда ошибок будет меньше.

Всё, всем до следующего года ;) С наступающим!

 

AS31979
Offline
Зарегистрирован: 22.12.2015

Увы не перепутанно StepFreq и freq - шаг частоты и сама частота, а  freq2 и StepFreq2 это переменные исключительно для этого цикла проверки. freq2 и StepFreq2 - используются ИСКЛЮЧИТЕЛЬНО в этом куске скеча и больше нигде не участвуют...

Возможно я неправильно выразился вначале - хотелось бы обновлять дисплей только если изменилась одна из переменных StepFreq или freq, все остальное я накрутил как умел именно для этой цели.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

StepFreq2 и freq2 в этом куске кода не меняются. Значит не участвуют.

 

AS31979
Offline
Зарегистрирован: 22.12.2015

Эту лажу я уже нашол и исправил - правильно. Только все равно обновляется гад!!!

freq2 = freq;

StepFred2 = StepFred

 

Клапауций 322
Offline
Зарегистрирован: 31.12.2015

AS31979 пишет:

Эту лажу я уже нашол и исправил - правильно. Только все равно обновляется гад!!!

freq2 = freq;

StepFred2 = StepFred

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

что бы не обновлялось - это тараканы твоего кода.

что бы не мерцало - я тебе показал, в какую строну копать: не печатай пробелы.

AS31979
Offline
Зарегистрирован: 22.12.2015

Не печатать пробелы нельзя, старое значение в некоторых случаях полностью затиратся не будет.

Я хочу чтобы процедура вывода на LCD работала только в том случае если изменится одна из переменных StepFreq или freq.

Проверять клавиши и энкодер нужно постоянно, а вот изменение переменных  может происходить при настройке несколько раз в секунду(тут мерцание неизбежное зло) или при подстройке, а подстройка может быть 1 раз  в 10 - 30 минут...

Вот меня и достает то что LCD мерцает даже в том случае если StepFreq или freq не меняются!!!!!!!

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Я ещё в сообщении #2 в последнем абзаце написал вариант решения

Клапауций 322
Offline
Зарегистрирован: 31.12.2015

AS31979 пишет:

Не печатать пробелы нельзя, старое значение в некоторых случаях полностью затиратся не будет.

можно

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(" ");}

AS31979 пишет:

Я хочу чтобы процедура вывода на LCD работала только в том случае если изменится одна из переменных StepFreq или freq.

лови тараканов в коде - почему у тебя обновляется, если не должно обновляться

AS31979 пишет:

Вот меня и достает то что LCD мерцает даже в том случае если StepFreq или freq не меняются!!!!!!!

а, меня достаёт, что ты не желаешь ловить тараканов.

AS31979
Offline
Зарегистрирован: 22.12.2015

С посимвольным затиранием надписи не подумал, безусловно интересный вариант если нужно менять цифры непрерывно. Тут парадокс в другом - если не трогать кнопку или энкодер переменные 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
   /////////////////////////////////////////////////////////////////
   }

 

Клапауций 322
Offline
Зарегистрирован: 31.12.2015

AS31979 пишет:

С посимвольным затиранием надписи не подумал, безусловно интересный вариант если нужно менять цифры непрерывно. Тут парадокс в другом - если не трогать кнопку или энкодер переменные StepFred  и fred не меняются!!!

слушай, тебе нужно было, что бы не мерцало? - я тебе показал, как.

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

Alexino
Offline
Зарегистрирован: 29.12.2015

AS31979 пишет:

В коде больше нет НИКАКИХ обращений к LCD кроме прилагающего куска.
Зато в коде есть изменение переменных freq и StepFred.
Причём тут обращения к LCD ?