Модераторы: PILOT, ManiaK, Mazzi
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с одноцветным графическим индикатором 
:(
    Опции темы
Ivan.
  Дата 10.8.2005, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 2.11.2004

Репутация: 1
Всего: 2



У кого нибудь есть наработки (функции) для работы с графическим одноцветным индикатором. Например вывод картинки в любую точку экрана с наложениями и ограничиванием области прорисовки. а также аналогичные функции вывода на экран текста?


--------------------
Я могу ВСЁ, вопрос - сколько времени у меня это займет!
PM MAIL ICQ   Вверх
ManiaK
Дата 10.8.2005, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Homo Sapience
***


Профиль
Группа: Комодератор
Сообщений: 1145
Регистрация: 3.8.2004
Где: ИУ5-93

Репутация: 2
Всего: 29



Какой индикатор? на чём делаешь? общие или конкретные функции нужны?..
По теории-то никаких проблем не должно быть: бери да рисуй...
PM MAIL WWW   Вверх
Ivan.
Дата 10.8.2005, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 2.11.2004

Репутация: 1
Всего: 2



Впринцыпе, конечно ничего сложного. На дисплей картинка передается в виде 1 байт=8 точек в ряд.
чтобы нарисовать картинку 8*8, надо передать 8 байт расположенных вертикально.
а если надо нарисовать картинку шириной не 8 точек а например 10, и позицию по X например 5. это нужно считать байт с экрана, взять байт картинки смещенный в право на 6 бит, сложить их и положить на экран. а тут еще надо наложить по XOR, а потом еще установить границы, за каторые залезать нельзя.
Если есть такие алгоритмы, то буду рад заполучить.
Я уже полтара дня пишу такие функции. функции желательно на C/C++, можно и на ASM.
Дисплей: WG320x240C.


--------------------
Я могу ВСЁ, вопрос - сколько времени у меня это займет!
PM MAIL ICQ   Вверх
maxim1000
Дата 10.8.2005, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 1
Всего: 110



когда-то занимался подобными вещами, исходников, конечно, не осталось, но принцип был такой:
делаем в памяти два массива:
1. изображение, которое должно быть на экране (массив байтов)
2. массив битов, который показывает, какие байты из первого массива надо передать на экран
алгоритм приблизительно такой:
1. начало работы: очищаем экран, заполняем нулями оба массива
2. рисование отдельного пиксела: берем байт из первого массива и меняем в нем бит, как нам надо, устанавливаем во втором массиве бит (типа, байт изменился, надо его передать)
3. синхронизация: идем по второму массиву, ищем 1-цы, как только нашли - берем из первого массива соответствующий байт и передаем

в общем на самом деле рисуем мы у себя в памяти и время от времени синхронизируем изображение на экране и в памяти
как часто - зависит от ситуации
если, например, надо нарисовать 1 пиксель, и пользователь должен сразу его увидеть, надо, конечно, вызывать синхронизацию после рисования пиксела, но если рисуется, например строка какая-то, то можно сначала ее нарисовать, а потом один раз синхронизировать, так быстрее получится (ведь обычно канал передачи медленнее скорости работы контроллера)


--------------------
qqq
PM WWW   Вверх
maxim1000
Дата 10.8.2005, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 1
Всего: 110



а функции, кстати, несложные...
Код

//просто константы
const int DisplayXSize=100;
const int DisplayYSize=200;
const int DisplayBufferSize=DisplayXSize*DisplayYSize;
//массивы
unsigned char DisplayImage[DisplayBufferSize/8];
bool DisplayImageDifferences[DisplayBufferSize/8];
//функции
void DisplayInit()
{
  ClearDisplay();//очистка экрана в начале работы
  for(int c=0;c<DisplayBufferSize;c++)
  {
    DisplayImage[c]=0;
    DisplayImageDifferences[c]=false;
  }
}
bool DisplaySetPixel(int x,int y,bool pixel)
{
  if(x<0 || x>=DisplayXSize)
    return false;
  if(y<0 || y>=DisplayYSize)
    return false;
  unsigned char *byte=&DisplayImage[x+(y/8)*DisplayXSize];//тут я предположил, что байты описывают вертикальные полоски
  if(pixel)
    *byte|=1<<(x%8);
  else
    *byte&=~(1<<(x%8);
  return true;
}
void DisplayUpdate()
{
  for(int c=0;c<DisplayBufferSize;c++)
    if(DisplayImageDifferences[c])
      DisplaySetByte(c,DisplayImage[c]);//эта функция должна писать в память экрана по адресу "c" значение DisplayImage[c]
}

Добавлено @ 14:11
кроме того, иногда контроллер дисплея сам переводит курсор на следующий байт для удобства записи последовательных блоков, тогда может оказаться выгоднее посылать изображение целыми кусками, а близлежащие куски даже специально соединять... но это все, если тормозит...


--------------------
qqq
PM WWW   Вверх
Ivan.
Дата 11.8.2005, 07:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 2.11.2004

Репутация: 1
Всего: 2



Ну вопервых у меня нет свободных 9 килобайт в оперативке, да я уже и смерился с тем, что я читаю информацию с индикатора. Мой вопрос не в этом.
Мне нужен алгоритм вычисления, как эту картинку обрезать, сжвинуть побитно и наложить на экран.
Вот например моя функция вывода картинки на экран в любую точку экрана, лубой ширины и с любым наложением.
Код

typedef enum
{
  el_NON,
  el_OR,
  el_XOR,
  el_AND,
} ELogic ;

void TWG::Pic(short X, short Y, short W, short H, const unsigned char *Pic, ELogic aAssociate){
    SetLayer(1);    // Выбор слоя (графический)
    lcd_command(cCSRDIR_R);    // Автосмещение курсора (вправо)
    int D;    // Переменная, где будут производиться вычисления
    char x=X&0x07;    // Вычисляем сдвиг в право каждого байта
    char nx=8-x;    // Обратный сдвиг
    short i, j;    // Переменные цыклов
    char d;    // Результат вычислений
    for (j=0; j<H; j++){    // Цикл по Y
        GotoXY(X, Y+j);    // Выставляем позицию курсора
        D=0;    // Очищаем переменную (назавем ее аккумулятор)
        if (aAssociate!=el_XOR){    // Если логика не сложение по модулю 2
            lcd_command(cMREAD);    // Переходим в режим чтения
            D=lcd_data_r();    // Читаем первый байт в аккумулятор
            GotoXY(X, Y+j);    // Восстанавливаем позицию курсора
        }
        lcd_command(cMWRITE);    // Переходим в режим записи
        for (i=W+x; i>0; i-=8){    // Цикл по X
            D<<=x;    // Смещаем акк. в лево
            D&=0xFF00;    // Очищаем ненужную часть
            if (i<8){    // Если это последний байт
                if (nx+i>8){    // Если в картинке еще осталась информация
                    D|=*Pic;    // Накладываем байт из картинки
                    Pic++;    // Смещаем адрес картинки
                }
                if (nx-8+i<0)    // Выравниваем акк. по правому краю
                    D>>=-(nx-8+i);
                else
                    D<<=nx-8+i;
                if (aAssociate!=el_XOR){    // Если логика не сложение по модулю 2
                    lcd_command(cMREAD);    // Накладываем по OR последний байт.
                    D|=(lcd_data_r()<<i)&0xFF;
                    GotoXY(X+W-i, Y+j);
                    lcd_command(cMWRITE);
                }
                D<<=8-i;    // Выравниваем акк. 
            }
            else {    // Если не последний байт
                D|=*Pic;    // Накладываем картинку
                Pic++;    // Смещаем адрес
                D<<=nx;    // Выравниваем акк.
            }
            d=D>>8;    // Получаем конечный результат
            if (aAssociate!=el_NON){    // Выполняем наложение по логике
                lcd_command(cMREAD);
                if (aAssociate==el_AND)
                    d&=lcd_data_r();
                else if (aAssociate==el_OR)
                    d|=lcd_data_r();
                else if (aAssociate==el_XOR)
                    d^=lcd_data_r();
                GotoXY(X+W-i, Y+j);
                lcd_command(cMWRITE);
            }
            lcd_data(d);    // Отправляем результат на экран
        }
    }
}
//---------------------------------------------------------------------------------------------------


Но эта функция на мой взгляд грамоска. Подобную функцию написал для вывода текста, еще побольше получилась. А когда написал обе функции с дополнительным параметром области разрешенной для рисования, они стали еще раза в полтора больше.
Вот я и подумал, неужели никто таких функций никогда не писал, и решил спросить.

Это сообщение отредактировал(а) Ivan. - 11.8.2005, 07:16


--------------------
Я могу ВСЁ, вопрос - сколько времени у меня это займет!
PM MAIL ICQ   Вверх
prottoss
Дата 11.8.2005, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 11.8.2005

Репутация: нет
Всего: нет



Привет!

Посмотри на моем сайте. Есть мои исходники под IAR C и ImageCraft C для AVR + LCD 122x32. Там четыре варианта - по 2 на каждый компилер. Для каждого компилера вариант с константами (знакогенератор, картинки) в памяти программ МК и вариант с внешней EEPROM AT25xxx.

Драйвер поддерживает:

1. Начальная инициализация дисплея;
2. Очистка произвольной области экрана;
3. Закраска произвольной области экрана;
4. Инвертирование произвольной области экрана;
5. Скроллинг произвольной области экрана (вверх, вниз, влево, вправо) с очисткой(закраской) освобождающейся области;
6. Скроллинг произвольной области экрана (вверх, вниз, влево, вправо) с заполнением рисунком освобождающейся области;
7. Циклический скроллинг произвольной области экрана (вверх, вниз, влево, вправо);
8. Вывод текста в произвольную область экрана;
9. Эффект бегущей строки в произвольной области экрана;
10. Рисование линий по алгоритму Брезенхема;
11. Закраска(очистка) пикселя в произвольном месте экрана.

Вообще организация дисплея 122х32 практически такая же как 320х240 + исходники на С - я думаю разобраться можно.

Одно НО. Архив на сайте запаролен. Пароль знаю я, и он стоит денег.
Пиши, может договоримся.

Это сообщение отредактировал(а) prottoss - 11.8.2005, 20:38
PM MAIL   Вверх
Ivan.
Дата 15.8.2005, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 2.11.2004

Репутация: 1
Всего: 2



спасибо, но пункты:1, 2, 3, 4, 10, 11 у меня уже есть, 8 - впринцыпе тоже есть, а функции, каторые я хотелбы найти - боюсь, что у тебя нет.


--------------------
Я могу ВСЁ, вопрос - сколько времени у меня это займет!
PM MAIL ICQ   Вверх
prottoss
Дата 15.8.2005, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 11.8.2005

Репутация: нет
Всего: нет



Цитата(Ivan @ 15.8.2005, 09:00)
спасибо, но пункты:1, 2, 3, 4, 10, 11 у меня уже есть, 8 - впринцыпе тоже есть, а функции, каторые я хотелбы найти - боюсь, что у тебя нет.

ну так скажи, что за функции?
PM MAIL   Вверх
Ivan.
Дата 16.8.2005, 08:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 2.11.2004

Репутация: 1
Всего: 2



Повторяю, нужны функции вывода на экран картинки в любую координату с любым наложением и ограничением в окно. Например: экран 320*240. мне нужно вывести картинку в координату (10, 10) размером (20*20) с наложением XOR и ограниченную окном (L:15, T:15, R:25, B:25).
И соответствующую функцию вывода текста. Естественно эти функции должны быть оптимизированы на скорость. Хоть у меня и контроллер 32х разрядный на 60 MHz.


--------------------
Я могу ВСЁ, вопрос - сколько времени у меня это займет!
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Микроконтроллеры (MCU) и микропроцессоры (MPU)"
PILOT ManiaK
UniBomb Mazzi

На данный раздел помимо Правил форума распространяются текже следующие правила:


  • Прежде чем создать тему воспользуйтесь поиском или посмотрите в faq. Возможно на форуме уже есть ответ на ваш или близкий к вашему вопрос.
  • В заголовке темы в квадратных скобках обозначьте используемое семейство микроконтроллера: [avr],[pic],[arm].
  • При создании темы с вопросом указывайте участок кода с ошибкой, версию компилятора, схемы подключения, fuse биты и прочие данные, которые помогут найти правильный ответ. Для форматирования текста программ используйте кнопку код.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Для флуда, просьб выполнить задание, поиска партнёров или исполнителей существуют свои разделы.
  • Если вы заметили несовместимое с правилами сообщение, то можете уведомить об этом модератора раздела нажав кнопку Репорт у соответствующего сообщения.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, PILOT, ManiaK, UniBomb, Mazzi.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Микроконтроллеры (MCU) и микропроцессоры (MPU) | Следующая тема »


 




[ Время генерации скрипта: 0.0790 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.