Полная версия этой страницы:
Индикатор типа "полоса".
Возникла необходимость в индикаторе типа выдвигающейся слева полоски. Точнее двух полосок, типа как раньше делали индикаторы уровня в бытовой аппаратуре. ЖКИ 4х20, две нижние строки будут индикатором.
Сначала сделал: перед записью "квадратиков" очищал обе строки справа-налево, записывая пробел 19 раз(первые сегменты пусть остаются). Потом как обычно записывал "квадратик"(0xFF) N раз, где N - уровень сигнала от 1 до 20. Но так как то плохо на железе, как то мигает неправильно.
Потом переделал: сначала справа-налево записывается пробел (20-N) раз, потом квадратик слева-направо N раз. Стало заметно лучше. А вот как бы сделать что б какой то уровень показал, а потом медленно гасил бы полоску справа-налево, как в настоящих индикаторах? Драйвер LCD только пишет в LCD, не читает, пока.
Nanobyte
Jul 17 2006, 14:09
В свободные ячейки ОЗУ знакогенератора запишите 5 разновидностей зачернённого знакоместа - одна вертикальная полоска (шириной в 1 пиксел), 2 полоски и т.д. Поочерёдно выводите их в одно и то-же знакоместо.
И ещё. Стирать все знакоместа перед выводом на дисплей необходимости нет. Сначала сделайте все изменения в буферном ОЗУ, затем поочерёдно выводите только изменённые данные, используя функцию установки адреса знакоместа.
aaarrr
Jul 17 2006, 14:20
Цитата(Коляй @ Jul 17 2006, 17:35)

Потом переделал: сначала справа-налево записывается пробел (20-N) раз, потом квадратик слева-направо N раз.

А почему бы не писать все слева-направо, сначала N квадратов, а затем 20-N пробелов. При этом не придется постоянно дергать позицию курсора.
Nanobyte
Jul 17 2006, 14:33
Курсором управлять всё равно придётся, хотя бы для того, чтобы установить его на начало строки. В том способе, который я предложил, мерцаний практически нет.
aaarrr
Jul 17 2006, 14:45
Цитата(Nanobyte @ Jul 17 2006, 18:33)

В том способе, который я предложил, мерцаний практически нет.
Зато нужно отслеживать изменения и хранить в ОЗУ буфер экрана.
Не пойму только, зачем решать
элементарную задачу столь сложными способами?
Цитата(aaarrr @ Jul 17 2006, 18:45)

Цитата(Nanobyte @ Jul 17 2006, 18:33)

В том способе, который я предложил, мерцаний практически нет.
Зато нужно отслеживать изменения и хранить в ОЗУ буфер экрана.
Не пойму только, зачем решать
элементарную задачу столь сложными способами?
Так запись в LCD жутко тормозная, можно сэконмить кучу времени!
И потом в этой задаче достаточно знать только значение преыдущего уровоня, что бы расчитать изменения (добавить пробелов или квадратиков в нужное место)
Nanobyte
Jul 17 2006, 15:14
Совершенно верно, изменения вывести гораздо проще и быстрее. А расход 40 байтов ОЗУ (даже меньше, если одним байтом отображать состояние нескольких знакомкст) - небольшая цена за гладкий вывод на LCD.
aaarrr
Jul 17 2006, 15:32
Вы издеваетесь, да? Обновление 40 символов займет максимум 3-5 мс, это "жутко медленно"? А если уж хотите хранить изменения, то наверное для этого будет достаточно и двух байт.
Цитата(aaarrr @ Jul 17 2006, 18:45)

Цитата(Nanobyte @ Jul 17 2006, 18:33)

В том способе, который я предложил, мерцаний практически нет.
Зато нужно отслеживать изменения и хранить в ОЗУ буфер экрана.
Не пойму только, зачем решать
элементарную задачу столь сложными способами?
Абсолютно согласен. Скорость вывода и инерционность экрана, все равно не заметны на глаз (все происходит как бы мгновенно), так что нормально всегда обновлять строки индикатора целиком слева на право или наоборот в зависимости от дизайна изделия. Другое дело с какой частотой выводить данные буфера? Лучший способ это обновление при наличии изменения. Т.е. необходимо все время работать с буфером и выставлять флажек на отрисовку, если изменяется его состояние. После отрисовки флажек - сбрасывать.
Serg79
Jul 18 2006, 07:19
Данная затея уже реализованна в библиотеке для LCD.
Функция нызывается:
void lcdProgressBar(u16 progress, u16 maxprogress, u08 length);
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.