Библиотека графического LCD 128x64

Просмотров: 22247Комментарии: 4
Электроника. СхемотехникаAVR.Начинающим

Решил тут недавно поработать с экранчиком WG12864 и оформил результаты в виде небольшой библиотеки для WinAVR. Используя эту библиотеку можно рисовать точку, линию, прямоугольник, круг, символ и строку на экране (поддержка английских и русских символов), можно настроить, чтобы графика выводилась на белом фоне или на черном. Конечно, можно еще совершенствовать эту библиотеку, но это буду делать по мере использования дисплея.
Итак, эта библиотека подходит для ЖКИ с управляющим контроллером KS0108. Состоит из трех файлов - lcd12864.h, lcd12864.c, chars.h. Файл chars.h содержит коды символов, а файлы lcd12864.h и lcd12864.c и есть собственно библиотека для работы с дисплеем. Подключается аналогично библиотеке символьного ЖКИ - Подключение библиотеки символьного ЖКИ в WinAVR
Хотя, кратко и здесь опишу подключение:
  1. Создаем проект в WinAVR и копируем файлы библиотеки в папку с проектом.
  2. Добавляем в основном файле программы заголовочный файл lcd12864.h.
  3. В Makefile, в разделе SRC=$(TARGET).c добавляем через пробел файл lcd12864.c. Должно получиться так: SRC=$(TARGET).c lcd12864.c.
  4. Теперь можем работать с функциями дисплея.
В конце статьи можно скачать библиотеку и пример подключения дисплея в Proteus'e. Библиотеку подключили, теперь нужно разобраться к каким ножкам МК подключать дисплей. Для этого в файле lcd12864.h есть такие строчки
#define LCD_PORT PORTD
#define LCD_DDR DDRD
#define LCD_PIN PIND
#define CMD_PORT PORTC
#define CMD_DDR DDRC
#define DI 0
#define RW 1
#define E 2
#define RST 3
#define CS1 4
#define CS2 5
#define CS 0//0 или 1 - в зависимости от уровня которым включается контроллер 
#define MODE 0// 0 - белый фон и черная графика, 1 - черный фон и белая графика
Порт помеченный LCD_ подключается к шине данных дисплея, а c порта CMD_ подаются управляющие сигналы. Дальше перечисляются биты управляющего порта МК, к которым подключены управляющие сигналы. 
Так как включаться  управляющий контроллер может разным уровнем сигнала на CS1 и CS2, ввел параметр CS, которым мы и будем определять каким уровнем включить контроллер дисплея. Параметр MODE служит для определения фона рисования. MODE=0 - белый фон и черная графика, MODE=1 - черный фон и белая графика. Дальше в заголовочном файле lcd12864.h перечисляются функции для работы с дисплеем, реализацию которых можно посмотреть в lcd12864.c. 
Рассмотрим все функции:

void LCD12864_Com(unsigned char cmd) - посылка команды ЖКИ.
void LCD12864_Data(unsigned char data) - посылка данных ЖКИ.
void LCD12864_Clr() - очистка экрана.
void LCD12864_GotoXY(unsigned char x, unsigned char y) - установка координат, x - строка(0..8), y - столбец(0..127).
void LCD12864_Init() - инициализация ЖКИ.
void LCD12864_Point(unsigned char x, unsigned char y) - рисование точки на экране, x - координата х (0..63), y - координата y (0..127).
int LCD12864_abs(int x) - возвращает абсолютное значение числа.
int LCD12864_sign(int x) - возвращает знак числа.
void LCD12864_Line(unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2) - рисование линии, используется алгоритм Брэзенхема. (x1,y1) - координаты начальной точки (x1 - 0..64, y1 - 0..127), (x2,y2) - координаты конечной точки.
void LCD12864_Rect(unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2) - рисование квадрата по координатам двух точек
void LCD12864_Ellipse(unsigned char x0, unsigned char y0, unsigned char radius) - рисование круга - x0, y0 - координаты центра, r - радиус круга.
void LCD12864_Char(unsigned char x0, unsigned char y0, unsigned char code) - x0 - строка(0..8), y0 - столбец(0..127), code - символ.
void LCD12864_String(unsigned char x0,unsigned char y0,char* buffer, unsigned char count) - функция выводит строку на экран. x0 - строка(0..8), y0 - столбец, buffer - текст, count - длина текста.

В общем-то, многие управляющие функции совпадают с функциями описанными в статье - Работа с графическим LCD  WG12864C. Для рисования линии и круга используется алгоритм Брэзенхема. В википедии можно найти уже готовые функции реализации алгоритма на языке С. Для адаптирования этих функций под WinAVR требуются минимальные изменения. Для проверки этой библиотеки использовал дисплей WG12864C. У этого дисплея точки на экране вытянуты по вертикали, поэтому рисовать круг не получается - рисуется вытянутый по вертикали эллипс. Если взять дисплей с квадратными пикселями, получится довольно красивый круг.

Важно!!!
  1. Библиотека проверена на частотах работы микроконтроллера от 1 до 4 МГц. При других частотах нужно подбираться другие задержки в функциях.
  2. При работе библиотеки в Proteus'e и в реальном железе есть отличия в задержках в функции вывода точки на экран. В модели - перед считыванием данных с дисплея достаточно задержки 1мкс, а в реальном устройстве - задержка увеличивается до 10мкс, иначе не читает данные и на экране выводятся точки в разных местах дисплея. Эта строка помечена комментарием в файле lcd12864.c.
Вот собственно и все. Пишите отзывы, пожелания, что работает, что нет.
В ближайших планах:
  1. Хочу сделать отдельную функцию, чтобы в нее передавался параметр MODE, чтобы, например, вся графика выводится на белом фоне, а какой-то кусок графики на черном.
  2. Рисование дуги.
  3. При выходе строки за пределы экрана, строка переносится на следующую строку. Сейчас этого нет.

Комментариев: 4 RSS

1 Grygoryi 21-08-2011 10:51

Подключил библиотеку к avr studio на atmega128 12Мгц

Работает очень медленно, приведенный пример отрисовывается почти за 3 секунды. Что можно сделать чтоб ускорить?

2 Виктор 08-01-2012 23:10

Подскажите, почему написано что это библиотека для WinAVR, неужели её нельзя использовать для CVAVR или аврстудии?

3 Dmitry 09-01-2012 17:57

думаю с незначительными изменениями можно, но я не проверял

4 H`UGO Сайт 30-04-2013 14:12

поставьте внешний кварц на 16мгц и прошейте бит фьюзы соответственно

Оставьте комментарий!

grin LOL cheese smile wink smirk rolleyes confused surprised big surprise tongue laugh tongue rolleye tongue wink raspberry blank stare long face ohh grrr gulp oh oh downer red face sick shut eye hmmm mad angry zipper kiss shock cool smile cool smirk cool grin cool hmm cool mad cool cheese vampire snake excaim question

Используйте нормальные имена. Ваш комментарий будет опубликован после проверки.

Вы можете войти под своим логином или зарегистрироваться на сайте.

(обязательно)