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

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

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

В том способе, который я предложил, мерцаний практически нет.

Зато нужно отслеживать изменения и хранить в ОЗУ буфер экрана.
Не пойму только, зачем решать элементарную задачу столь сложными способами?


Так запись в LCD жутко тормозная, можно сэконмить кучу времени!

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

В том способе, который я предложил, мерцаний практически нет.

Зато нужно отслеживать изменения и хранить в ОЗУ буфер экрана.
Не пойму только, зачем решать элементарную задачу столь сложными способами?

Абсолютно согласен. Скорость вывода и инерционность экрана, все равно не заметны на глаз (все происходит как бы мгновенно), так что нормально всегда обновлять строки индикатора целиком слева на право или наоборот в зависимости от дизайна изделия. Другое дело с какой частотой выводить данные буфера? Лучший способ это обновление при наличии изменения. Т.е. необходимо все время работать с буфером и выставлять флажек на отрисовку, если изменяется его состояние. После отрисовки флажек - сбрасывать.
Serg79
Данная затея уже реализованна в библиотеке для LCD.
Функция нызывается:
void lcdProgressBar(u16 progress, u16 maxprogress, u08 length);
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.