Библиотека для работы с 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

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

RSS свернуть / развернуть
// lcd.h
volatile uint8_t Video_buffer[8][128];

Что-то видео буфер в заголовочном файлике объявлен как-то не к месту.
0
cs = выбор чипа для записи cs1- первый чип,cs2-второй чип,cstwo-оба чипа.
cs_both лучше. cstwo знающими английский воспринимается как cs2.
+2
  • avatar
  • Vga
  • 16 сентября 2012, 01:28
есть какой-то глюк с Lcd_out. В массиве нужно указывать немного боьшую высоту изображения, иначе сниу картика обрезается. Примерно на 2-6 надо прибавить размер.
0
толи что-то с задвигом битов в массив, толи цикла не хватает.
0
не хочется разбиратья, чем нибудь другим хочется занятся.
0
автор, ну кто кроме тебя это сделает? Зачем кормить народ этим эээ… как бы выразиться помягче. Минусую.
0
Хочу немного покритиковать.
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 либо по прерываниям таймера. Для этого нужно сделать функцию вывода буффера по небольшим частям, которую можно пихнуть в обработчик прерывания.
Итого: если это одна из ваших первых работ с экраном, то получилось довольно неплохо.
+2
я тут подумал, а что если сэкономить на оперативке? Разрезать буфер на две половинки и выводить его по очереди, сначала один, потом другой.
1 берём часть изображения(массива) считываем его в буфер,
2 ждём пока Lcd_write_buffer не вернёт флаг 1 ( о готовности вывести второй кусок картинки)
3 снова считываем это же изображения(массив) но уже 2 -ю его часть
4 ждём пока Lcd_write_buffer не вернёт флаг 1 ( о готовности вывести второй кусок картинки)
5 конец вывода изображения
0
Наверное такой способ будет хорош для 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 циклы окончены, выставляем флаг готовности
0
а флаг готовности выводить когда закончится цикл записи массива из буфера.
0
Если хочешь заморочиться и выводить по полэкрана — попробуй. Когда изображение статичное, все будет нормально. Я имел в виду сделать вывод по одному байту, но часто (в прерывании, или, что лучше, DMA). Тогда можно будет увидеть сам процесс рисования. А чтобы этого избежать применяется двойная буферизация. Просто не хочется тратить время на работу долгой функции Lcd_write_buffer (даже на полэкрана). Пускай работает в фоне постоянно (или по запросу, но все равно в фоне).
0
Кто-нибудь подключал данный дисплей к stm32f4? Пробовал разные библиотеки, но что-нибудь вразумительное вывести не удалось, только кракозяблы всякие.
0
я подключал, но по своей библиотечке.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.