Дисплей 128х64, библиотека


Собственно сама библиотека была разработана товарищем Михаилом, за что ему большое спасибо.
Потом долгое время она лежала без практического применения.
Но библиотека оказалась настолько хорошей, что я все же решился ее выложить на пользу общественности, да и самому не потерять )
Особенности:
— подключение к любым пинам контроллера;
— графика;
— вывод текста (кириллица, английский), при желании можно использовать свой шрифт, и т.д.)

Для преобразования растровой графики в готовый массив данных, был быстренько накидан проект в Qt

Ему скармливается Image в формате PNG, размером не более 128х64 пик.(я нарезал в Gimp-е).
Далее просто создается массив, куда помещается сгенерированный пример:
const uint8_t Che_Guevara[] ={
                0x80, 0x8, // Размер
                0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0x80, 0xc0, 0xc0, 0xe0, 0xe0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0x78, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xe0, 0xe0, 0xe0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x80, 0x80, 0x80, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
                0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0xf0, 0xf8, 0xfc, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7c, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfc, 0xfc, 0xf8, 0xf0, 0xe0, 0xc0, 0x80, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
                0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x3, 0x81, 0xc1, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0xc0, 0xc0, 0xc0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xf1, 0xf1, 0xe3, 0xe3, 0xc3, 0xc7, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
                0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, 0x10, 0x90, 0xb8, 0x38, 0xf8, 0xfc, 0xfc, 0xfc, 0xfc, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x1, 0xd, 0xf, 0xe, 0xf, 0xb, 0xb, 0xf, 0xf, 0xb, 0xb, 0xf, 0x7, 0x3, 0x3, 0x3, 0x0, 0x0, 0x0, 0x0, 0x8, 0x7e, 0x7f, 0x7f, 0xdf, 0x8b, 0x3, 0x5, 0x7, 0x3, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0x8f, 0x8f, 0xcf, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xef, 0xf2, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
                0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0x0, 0x0, 0x0, 0x3, 0x83, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xe0, 0xc0, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0x80, 0x0, 0xc0, 0xc0, 0xe7, 0xf7, 0xb7, 0x93, 0x86, 0x86, 0x86, 0x87, 0xff, 0xff, 0xff, 0xff, 0xef, 0xee, 0xe0, 0xe0, 0xc0, 0xc0, 0x80, 0xbc, 0xbc, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x74, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
                0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x3, 0x3, 0x9b, 0xb3, 0xe1, 0xe1, 0xe1, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfd, 0xf8, 0xf0, 0x80, 0x80, 0xcc, 0xcf, 0x87, 0x1, 0x0, 0x3, 0x3, 0x1, 0x9, 0xd, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1f, 0x9f, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0x3f, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
                0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x3, 0x3, 0x3, 0x1f, 0xf, 0x1f, 0x1f, 0xf, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x7f, 0x37, 0x1f, 0x1f, 0x1f, 0x3f, 0x3f, 0x3f, 0x1f, 0xf, 0x3, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
                0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x3, 0x3, 0x7, 0x7, 0xf, 0xf, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0xf, 0xf, 0xf, 0x7, 0x7, 0x3, 0x3, 0x3, 0xf, 0x7, 0x1f, 0x3f, 0x1f, 0x1f, 0x1, 0x7, 0xf, 0xf, 0xf, 0x1f, 0x1f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3d, 0x30, 0x60, 0x60, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
};

Программа выводящая изображение на первой картинке выглядит так:
GPIO_Peripheral_Init();
        Init_LCD();
        SetFont(font8);
        ClearScreen();
        DrawPicture(0,0,Che_Guevara);
        while (1)
  {
  }

Ну и список функции целиком:
void Init_LCD(void);
void SetFont(const uint8_t Font[]);
void GotoXY(uint8_t x, uint8_t y);
uint8_t GetX(void);
void PrintChar(char ascii);
void PrintText(char*);
void PrintInt(int32_t a);
void PrintFloat(float a, uint8_t digit_after_point);
void DrawPicture(uint8_t x, uint8_t y, const uint8_t data[]);
void ClearToX(uint8_t x);
void ClearScreen(void);
void SetStyle(uint8_t Style);
uint8_t CharWidth(char ascii);
uint8_t TextWidth(char* message);
void PrintIntflag(int32_t a,uint8_t flag);

ICQ 603310012
ВК
  • +1
  • 23 марта 2014, 19:23
  • khomin
  • 2
Файлы в топике: Generator_Pic_128x64_Display.zip, WG64128A.zip

Комментарии (19)

RSS свернуть / развернуть
Дисплей действительно ужасен, в темноте еще более менее, на свету вообще невозможно разглядеть
0
Я использовал такой дисплей, контраст был очень хорош. Мне попался с термокомпенсацией, но без индекса Т.
0
Если говорить о качестве исполнения девайса — то изготовителям следовало бы посидеть на уроках Электромагнитной совместимости, поскольку их детище весьма восприимчиво к помехам. Часто бывает, что часть или полностью индикатор отваливается (т.е. зависает) от каких нибудь незначительных переходных процессах на основной плате. Например, при коммутации реле… Основная схема работает стабильно, а вот индикатору все время «не везет».
0
повесь резисторы на шину данных, у китайцев такое тоже бывает. Мб щас стали гнать Г, но я мэлт-овские дисплеи юзал года 3-4 назад плотно и все было норм.
0
Переключение реле — это, мягко говоря, «шумный» процесс. Если надлежащие меры помехозащиты не приняты, то подвисание индикатора не удивительно.
0
меры приняты. Параллельно контактам ставил RC цепочки. Помогло. Но проблема не ушла. Все равно иногда происходит подвисание. Сама то схема пашет, а вот индикатор — зависает.
0
Насколько я понял, картинки и текст выводятся только с выравниванием по 8 пикселов по вертикали (по строкам дисплея). Это так? А еще, за какое время выводится картинка размером с дисплей?
0
да, по вертикали с выравниванием в 8 пикселов. Если делать с точностью до точки — будет сопрягаться с большим гемороем. В моем случае небыло нужды так сильно заморачиваться. Зато вывод на экран оптимизирован максимально. Избыточные манипуляции с экраном отсекаются, поэтому скорость вывода текста и изображения — максимально возможное. Ограничение только со стороны самого индикатора.
0
Вывод картинок с точностью до точки не такая уж сложная вещь. Зато очень полезная. Например, шрифт высотой 8 слишком мелкий, 16 — слишком крупный, а 12 — в самый раз. Короче, это ограничение сильно тормозит полёт фантазии.
Есть несколько способов добиться нужного функционала:
1 — часто применяемый простой, но «расточительный». Берём буфер на 1К и рисуем все в нем. Потом одним махом выводим весь буфер на дисплей. Работает очень быстро, нет мерцания на дисплее. Вывод буфера в дисплей можно поручить таймеру и DMA, если железо позволяет. Платим за удобство килобайтом оперативы.
2 — буфера нет, рисуем сразу на дисплее. Если выводится не полная по высоте строка, то она обрабатывается специальным образом. Прочитали байт из дисплея, поменяли нужные биты и вывели обратно. Будут также дополнительные манипуляции с внутренним указателем дисплея, его надо будет переставлять ибо автоинкремент. Тем не менее вывод не полной строки будет всего где-то вдвое медленнее, чем полной. Чтоб в Ввашей драйвере это реализовать, потребуется добавить всего 20-30 строк кода.
0
согласен. Раньше я делал так для старых компьютеров, где организация памяти приблизительно похоже, как на этом индикаторе. При выводе нужно будет сдвигать байтик и обрабатывать данные в буфере по маске. Это понятно… Просто говорю — не заморачивался, поскольку не было нужды особой. Автоинкремент у меня учитывается. У меня есть глобальные переменные globalx globaly а так же x_1 x_2 y_1 y_2. Это координаты отдельных контроллеров. Соответственно, переназначение адреса происходит только если возникает в этом необходимость. 1 вариант — расточительный, 2 — длительный, поэтому и было принято решение этого не делать. Тем более, если нет особой нужды.
0
ну ежели вам будет нужно, дожмите либу и выложите где-нить. Будет интересно такое у себя иметь. Хотя, в данный момент по роду своих занятий — мне вряд ли это понадобится…
0
думаю что достаточно быстро, но если часто и полностью перерисовывать, будет сильно заметно
0
заметно только в том случае, если изображение перерисовывать с подтиранием «подложки»
Специально для вывода текста без перерисовки подложки в определенном окне по размерности — используется функция ClearToX(x). Суть ее в следующем: поскольку текст может менять свою длину, есть необходимость затереть хвосты старого более длинного текста. Функция затирает от текущего положения по X до указанного вправо.
К примеру, у вас выделено окно в 64 пиксела под вывод какого-то текста. координаты окна по Х — 5..68 по Y — 1
Выводим текст:
GotoXY(5,1);
PrintText(text);
ClearToX(68);

Таким образом мы выведем текст в нужном положении, потом затрем оставшееся поле до координаты 68.
В этом случае ничего нигде мерцать не будет, поскольку основная картинка не перерисовывается.
0
Ну надо же, как все знакомо)))
0
да )) спасибо тебе за либу ))
авторство указал
0
Зачем в примере повторная инициализация дисплея перед
DrawPicture(0,0,Che_Guevara);
?
0
опечатка, подправил
0
Попытался привязать к f100rb и столкнулся с проблемой. Часть подгружаемой либы не приложили. Где найти остатки? А именно globals.h
parameters.h
0
  • avatar
  • Geek
  • 23 сентября 2014, 19:07
в «globals.h» — _delay_us (если не ошибаюсь), это элементарная задержка
а из «Parameters.h» — флаг управления подсветкой:
Main_Setting.Backlight== LCD_BACKLIGHT_AUT
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.