Библиотека для работы с wg12864b на stm32

Библиотека состоит из файлов: lcd.h,lcd.c,Delay.h,Delay.с
Функции библиотеки.
Lcd_init(); — инициализация дисплея
Lcd_write_str(x,y,”строка”); — Вывод строки в произвольной координате. x – начало строки по высоте, y – начало строки по ширине.
Lcd_line(x1,y1,x2,y2); -Вывод линии. x1y1 – начало лини, x2y2 – конец линии
Lcd_circle(x,y,r); — Вывод окружности. x1y1- координаты центра окружности, r – радиус окружности.
Lcd_write(mode,data,cs); — Запись данных или комманд в дисплей. mode вид данных = cmd — команды управления, dat — данные.data = данные. cs = выбор чипа для записи cs1- первый чип,cs2-второй чип,cstwo-оба чипа.
Lcd_out(x,y,buffer); — Запись данных изображения в массив видеобуфера uint8_t Video_buffer[8][128]; x = координата 0...63.y = координата 0...127. buffer = массив с изображением. Масив изображения готовится с помощью программы GLCDFontCreator2 от библиотеки для работы с дисплеем от arduino. Массив изображения имеет формат: static unsigned char image[]={, размер изображения, размер изображения, далее распологаются данные изображения}
Lcd_write_buffer(); — Вывод видеобуфера(содержимого uint8_t Video_buffer[8][128]) на экран.
Lcd_xy(x,y,cs); — Выбор строки и колонны для записи данных в дисплей, x = номер строки 0...7, y = номер колонны, cs = выбор чипа для записи cs1- первый чип,cs2-второй чип, cstwo-оба чипа.
Lcd_clear(); — Очитска выдеобуфера(зануление массива uint8_t Video_buffer[8][128])
Lcd_set_pixel(x, y); — Вывод пикселя на экран. x = координата 0...63, y = координата 0...127.
Подключения дисплея
В библиотеки вывод изображения организован через видео буфер Lcd_write_buffer();
Пины управления дисплея подключаются к старшим разрядом порта 8..15.
Выбор пинов осущетсявляется c помощью изменения настроек control_MODE_pin и control_CNF_pin путём выбора GPIO_CRH_MODEx где x = пины порта от 8 до 15.
Пины порта данных и команд подключаются к младшим пина порта от 0 до 7.
Например, пин дисплея DB7 подключается к 7 выводу порта микроконтроллера, пин дисплея DB6 подключается к 6 выводу порта микроконтроллера и.т.д.
Пример вывода алфавита русского языка.
#include "stm32f10x.h"
#include "lcd.h"
int main(void)
{
Lcd_init();
while(1)
{
Lcd_write_str(0,0,"Аа Бб Вв Гг Дд Ее Ёё Жж Зз Ии Йй Кк Лл Мм Нн Оо Пп Рр Сс Тт Уу Фф Хх Цц Чч Шш Щщ Ъъ Ыы Ьь Ээ Юю Яя");
Lcd_write_buffer();
}
}
А вот пример для вывода окна с заголовком *title и двумя строками в окне.
const char s[] = {
59,
40,
255, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 255,
255, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 255,
255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255,
255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255,
7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7
};
void draw_window(uint8_t x,uint8_t y,uint8_t *title, uint8_t *str1, uint8_t *str2)
{
Lcd_out(x,y,s);
Lcd_write_str(x+2,y+2,title );
Lcd_write_str(x+12,y+2,str1);
Lcd_write_str(x+24,y+2,str2);
}
Скачать библиотеку
Буду рад доработкам, подсказкам и исправлениям. А так же любой критике.
Прикрепил софтину для конвертации изображения.
запускать надо \glcd\bitmaps\utils\Java\glcdMakeBitmap.java
- -1
- 15 сентября 2012, 19:20
- sasha85ru
- 1
Файлы в топике:
glcd.zip
есть какой-то глюк с Lcd_out. В массиве нужно указывать немного боьшую высоту изображения, иначе сниу картика обрезается. Примерно на 2-6 надо прибавить размер.
Хочу немного покритиковать.
1. При осмотре кода, комментариев в нем и ваших комментариев здесь понятно, что библиотека не доведена до ума и делалась наспех. Наверное стоит сначала все опробовать, исправить, а потом уже предлагать другим.
2. Библиотека называется lcd.c, хотя она представлена здесь для конкретного экрана wg12864b. Назовите её wg12864.c или NT7108.c (или другой совместимый контроллер).
3. Вообще лучше делать абстракцию графической библиотеки от работы с устройством. То есть разбить вашу библиотеку на две: первая (например graphic.с) работает только с видеобуффером, очищает, чертит линии фигуры и др. Она не должна зависеть ни от разрешений ни от организации битов. Вторая (NT7108.c) выводит видеобуффер на устройство (Lcd_init, Lcd_strob,nop18,Lcd_write,Lcd_reset,Init_pin_out,Lcd_write_buffer в вашем случае). Смешивать работу с устройством и памятью не стоит.
4. Посмотри C Coding Standard Application Note AN-2000 от Micrium. Там много полезного по оформлению кода.
Из опыта, на будущее — хотелось бы сделать вывод на экран либо через DMA либо по прерываниям таймера. Для этого нужно сделать функцию вывода буффера по небольшим частям, которую можно пихнуть в обработчик прерывания.
Итого: если это одна из ваших первых работ с экраном, то получилось довольно неплохо.
1. При осмотре кода, комментариев в нем и ваших комментариев здесь понятно, что библиотека не доведена до ума и делалась наспех. Наверное стоит сначала все опробовать, исправить, а потом уже предлагать другим.
2. Библиотека называется lcd.c, хотя она представлена здесь для конкретного экрана wg12864b. Назовите её wg12864.c или NT7108.c (или другой совместимый контроллер).
3. Вообще лучше делать абстракцию графической библиотеки от работы с устройством. То есть разбить вашу библиотеку на две: первая (например graphic.с) работает только с видеобуффером, очищает, чертит линии фигуры и др. Она не должна зависеть ни от разрешений ни от организации битов. Вторая (NT7108.c) выводит видеобуффер на устройство (Lcd_init, Lcd_strob,nop18,Lcd_write,Lcd_reset,Init_pin_out,Lcd_write_buffer в вашем случае). Смешивать работу с устройством и памятью не стоит.
4. Посмотри C Coding Standard Application Note AN-2000 от Micrium. Там много полезного по оформлению кода.
Из опыта, на будущее — хотелось бы сделать вывод на экран либо через DMA либо по прерываниям таймера. Для этого нужно сделать функцию вывода буффера по небольшим частям, которую можно пихнуть в обработчик прерывания.
Итого: если это одна из ваших первых работ с экраном, то получилось довольно неплохо.
я тут подумал, а что если сэкономить на оперативке? Разрезать буфер на две половинки и выводить его по очереди, сначала один, потом другой.
1 берём часть изображения(массива) считываем его в буфер,
2 ждём пока Lcd_write_buffer не вернёт флаг 1 ( о готовности вывести второй кусок картинки)
3 снова считываем это же изображения(массив) но уже 2 -ю его часть
4 ждём пока Lcd_write_buffer не вернёт флаг 1 ( о готовности вывести второй кусок картинки)
5 конец вывода изображения
1 берём часть изображения(массива) считываем его в буфер,
2 ждём пока Lcd_write_buffer не вернёт флаг 1 ( о готовности вывести второй кусок картинки)
3 снова считываем это же изображения(массив) но уже 2 -ю его часть
4 ждём пока Lcd_write_buffer не вернёт флаг 1 ( о готовности вывести второй кусок картинки)
5 конец вывода изображения
Наверное такой способ будет хорош для 8 битника с малым озу, но в плане скорости это будет не лучшим решением.
То есть получается:
1 цикл вывода от 0 до 8
2 цикл вывода от 0 до 64
3 выводим массив[от 0 до 512] — вывод 1 час. изображения
4 циклы окончены
5 выставляем глобальный флаг готовности
6 так как выставлен глобальный флаг готовности то внешняя функция должна отправить сюда вторую порцию изображения. (наверное придется вызывать эту фкнция в цикле до 2 повторов)
1 цикл вывода от 0 до 8
2 цикл вывода от 0 до 64
3 выводим массив[от 0 до 512] — вывод 2 час. изображения
4 циклы окончены, выставляем флаг готовности
То есть получается:
1 цикл вывода от 0 до 8
2 цикл вывода от 0 до 64
3 выводим массив[от 0 до 512] — вывод 1 час. изображения
4 циклы окончены
5 выставляем глобальный флаг готовности
6 так как выставлен глобальный флаг готовности то внешняя функция должна отправить сюда вторую порцию изображения. (наверное придется вызывать эту фкнция в цикле до 2 повторов)
1 цикл вывода от 0 до 8
2 цикл вывода от 0 до 64
3 выводим массив[от 0 до 512] — вывод 2 час. изображения
4 циклы окончены, выставляем флаг готовности
Если хочешь заморочиться и выводить по полэкрана — попробуй. Когда изображение статичное, все будет нормально. Я имел в виду сделать вывод по одному байту, но часто (в прерывании, или, что лучше, DMA). Тогда можно будет увидеть сам процесс рисования. А чтобы этого избежать применяется двойная буферизация. Просто не хочется тратить время на работу долгой функции Lcd_write_buffer (даже на полэкрана). Пускай работает в фоне постоянно (или по запросу, но все равно в фоне).
Кто-нибудь подключал данный дисплей к stm32f4? Пробовал разные библиотеки, но что-нибудь вразумительное вывести не удалось, только кракозяблы всякие.
- vasapetrov
- 27 мая 2015, 19:34
- ↓
Комментарии (13)
RSS свернуть / развернуть