Подскажите пожалуйста, как избавиться от delay() в моем коде. Нужно чтобы мерцали 2 сегмента на дисплее, нажал кнопку и эти сегменты начали мерцать чтобы выделить это значение для изменения вручную.
if (ekran == 3 && metka3 == 2)
{
lcd.setCursor(14, 1);
lcd.print(obduv_off);
if (millis() - timer >= 500)
{
lcd.setCursor(14, 1);
lcd.print(" ");
timer = millis();
delay(100);
}
}
Очевидно, что бы получить мигание текста, нужно его половину времени выводить, а вторую половину времени выводить на месте этого текста “ничего”
Все секретные технологии раpболтал
Так там в самом дисплее вроде и мигание и инверсия есть, но это ж читать надоть.
И никто не обратил внимание что в 1602 нет сегментов)))
Если вы про lcd.blink(), то разве он умеет мигать одним символом?
А инверсию я вообще не нашёл. Где это?
Емнип, там мигает курсор
Именно.
Причём курсор, который совсем не курсор (в виде “чёрточки”), а целое знакоместо.
Уродство, одним словом.
А ТС-у нужно мигать символом.
Собственно, эту задачу он решил, за исключением того, что испытывает сильный личный неприязнь к delay.
Ну и оговорился с “сегментами”.
На что некоторые не преминули съязвить, хотя и прекрасно поняли, про что речь.
P.S. У себя я “мигаю” вот так (без delay).
if ((millis() / 500) & 1)
{
lcd.print("ERR");
} else {
lcd.print(" ");
}
На графических На символьных тоже не нашёл. Отложился в памяти какой то аппарат, но, походу, там был как раз графический в формфакторе1602.
Хрена-се!
Вы, надеюсь, понимаете, что Вы выводите информацию на экран ПРИ КАЖДОМ проходе loop
?
Ещё и деление на 500 не комильфо.
А где Вы увидели loop?
Это всего лишь кусочек кода “мигалки”.
Естественно, этот код находится внутри условия. Типа так
if (err)
{
lcd.setCursor(0,7);
if ((millis() / 500) & 1)
{
lcd.print("ERR");
} else {
lcd.print(" ");
}
}
И вообще, эта “мигалка” у меня находится в подпрограмме вывода на дисплей,
которая, в свою очередь, вызывается из loop по таймингу, либо при выходе из меню.
Так-что, совсем НЕ хрена-се!
Интересно, почему?
Но деление всё равно лишнее. Не проще флагом работать?
В смысле почему? Туева хуча тактов впустую.
Если извращаться, то можно проверять нулевой бит второго байта миллиса, что даст 2 Гц.
Нуууу… Если честно, то это не мой код. Я его спи…копировал из скетча синтезатора для трансивера.
Кстати, у автора было деление не на 500, а на 700. Я уже не помню, чем мне 700 не понравилось.
Возможно, медленно мигало.
Тогда это ниюха не мигалка ибо мигать её или застыть в каком-то положении, зависит от err
.
В любом случае, оно не должно выводить когда ничего не поменялось. Впрочем, это не моё дело. Если Вы считаете, что знаете, что делаете, то и флаг Вам в руки!
Мне предстоит в своей библиотечке внедрять мигание. Будет функция куда передавать координаты начала и кол-во знаков подлежащих миганию. Внутри запускаем таймер на запись-стирание нужной области в видеопамять.
Либо можно ещё внедрить функционал непосредственно в блок отображения(что лучше, так как не нужен лишний таймер и мигающая область не стирается из видеопамяти). При очередном “прогоне” при отображении, просто пишем пробел в нужную область.
От застывания на “ERR”, ничего не мешает добавить “затиралку”
if (err)
{
lcd.setCursor(0,7);
if ((millis() / 500) & 1)
{
lcd.print("ERR");
} else {
lcd.print(" ");
}
} else {
lcd.setCursor(0,7);
lcd.print(" ");
}
Вообщем, рабочее решение задачи ТС-а я предложил, ну а дальше уж как хотитЁ.
Кстати… Критикуя - предлагай! Неча бубенцами впустую звенеть!
Ну, я же Вам уже сказал:
ставьте затиралки или ещё чего-нибудь, мне без разницы.
если заменить первую строку на if (millis() & 512)
то вычисление условия будет в несколько сотен раз быстрее (частота мигания изменится на 2%). Ну где и как расположить - отдельный вопрос.