Библиотека для дисплея lph9135

Библиотека для дисплея LPH9135

Дисплеи LPH9135 широко применялись в телефонах бюджетных моделей Siemens, таких как  А31, C72, АХ72, АХ75 и С76.  

Данный дисплей имеет разрешение 128×128 пикселей и может работать с тремя цветовыми палитрами: 256 цветов (8 бит на пиксель), 4096 (12 бит на пиксель) и 65536 цветов (16 бит на пиксель).

В телефонах Siemens можно встретить четыре типа индикаторов с разрешением  128×128 пикселей – LPH9135 (контроллер Philips LDS183),  LM15SGFNZ20, LM15SGFNZ22 и какую-то «тёмную лошадку» CG151313-S604D. И если на первые три дисплеи найти какую-нибудь информацию можно, то нашедшему в своём телефоне 4-й экземпляр неутешительный совет – спрятать его подальше…

Дисплеи LPH9135, LM15SGFNZ20, LM15SGFNZ22 и CG151313-S604D.

Распиновка дисплея LPH9135:

1. CS – Chip Select. При установке в «0» контроллер дисплея принимает информацию;
2. RESET – вывод для сброса контроллера;
3. RS – вывод для определения типа передаваемых данных («0» – команда, «1» – данные);
4.

CLK – вывод тактового сигнала для передачи данных;
5. DAT – вывод передачи данных;
6. 2,9V – к источнику питания;
7. GND – общий провод (земля);
8. ID – не нужен;
9. LEDA – вывод анодов светодиодов подсветки;
10.

LEDC – вывод катодов светодиодов подсветки (к GND).

Схема подключения дисплея:

Подсветка дисплея начинает работать уже с 9 В, отрегулировать её яркость по желанию можно резистором R7. Максимальный ток светодиодов подсветки составляет 19 мА.

Для подключения дисплея к микроконтроллеру можно применить модуль, в котором применяется металлическая рамка-держатель, снятая с платы телефона, и SMD-компоненты:

Библиотеки для работы с дисплеями я постарался делать по одному шаблону, что позволит легко переориентироваться с одного дисплея на другой, библиотека для LPH9135 не исключение, она сохранила ту же функциональность, что и библиотека для дисплея LPH9157-2, этому также поспособствовала одинаковая система команд LCD-контроллеров данных дисплеев. В библиотеке реализована работа с 2 цветовыми палитрами – 256 и 65536 цветов.

Функционал библиотеки (для CodeVisionAVR) работы с LPH9135 содержит следующие пользовательские функции:

1. void LCD_init ()

Инициализация дисплея.

2. void Put_Pixel (char x, char y, unsigned int color)

Функция вывода точки (пикселя). x и y – координаты экрана, где будет отображён пиксель цветом color.

3. void LCD_Putchar (char symbol, char x, char y, int t_color, int b_color, char zoom_width, char zoom_height, int rot)   

Функция вывода одного символа ASCII-кода. Данная функция рассчитана на вывод символов размером 5х8 пикселей, библиотека которых находится в файле Symbols.h.

symbol – выводимый на экран символ в ASCII-кодировке; x и y – начальная координата вывода символа; t_color – цвет пикселя; b_color – цвет фона; переменные zoom_width и zoom_height увеличивают символ на экране в указанное число раз;  rot – угол поворота текста (0º , 90º, 180º, 270º).

4. void LCD_Putchar_Shadow (char symbol, char x, char y, int t_color, char zoom_width, char zoom_height, int rot)

То же, что и 3, только без цвета фона.

5. void LCD_Puts(char *str, int x, int y, int t_color, int b_color, char zoom_width, char zoom_height, int rot)

Функция вывода строки, расположенной в ram-памяти микроконтроллера. x и y – координаты пикселя начала вывода строки.

6. void LCD_Puts_Shadow (char *str, int x, int y, int t_color, char zoom_width, char zoom_height, int rot)

То же, что и 5, только без цвета фона.

7. void LCD_Putsf(flash char *str, int x, int y, int t_color, int b_color, char zoom_width, char zoom_height, int rot)

Функция вывода строки, расположенной во flash-памяти микроконтроллера.

8. void LCD_Putsf_Shadow (flash char *str, int x, int y, int t_color, char zoom_width, char zoom_height, int rot)

То же, что и 7, только без цвета фона.

9. void LCD_FillScreen (unsigned int color)

Функция заливки экрана цветом color.

10. void LCD_Output_image (char x, char y, char width, char height, flash char *img, int rot)

Функция вывода картинки.

x и y начальная позиция выводимого на экран изображения; width и height – ширина и высота изображения (в пикселях); *img – указатель на массив данных, составляющих изображение; rot – угол поворота изображения (0º , 90º, 180º, 270º). Данная функция предполагает, что массив данных изображения расположен во flash-памяти микроконтроллера. Для преобразования необходимого вам изображения в массив, содержащий цвет пикселей, можно воспользоваться программами Image2Lcd или Nokia Image Creator, которые несложно найти на просторах интернета. Единственное требование – направление вывода массива изображения должно выполняться слева-направо, сверху-вниз! При использовании 16-ти битной палитры, при преобразовании изображения в массив типа char, обязательно старший байт должен идти первым!

11. void LCD_DrawLine (char x1, char y1, char x2, char y2, int color)

Нарисовать линию. x1 и y1 – начальная позиция линии; x2 и y2 – конечная позиция линии.

12. void LCD_DrawRect (char x1, char y1, char width, char height, char size, int color)

Нарисовать рамку. size – толщина рамки.

13. void LCD_FillRect (char x1, char y1, char width, char height, int color);

Нарисовать прямоугольник.

14. void LCD_DrawCircle (char xcenter, char ycenter, char rad, int color);

Нарисовать окружность. rad – радиус окружности в пикселях.

15. void LCD_FillCircle (char xcenter, char ycenter, char rad, int color);

Нарисовать круг, заполненный цветом color.

16. void LCD_DrawTriangle (char x1, char y1, char x2, char y2, char x3, char y3, int color)

Нарисовать контуры треугольника.

17. void LCD_FillTriangle (char x1, char y1, char x2, char y2, char x3, char y3, int color)

Нарисовать треугольник, заполненный цветом color.

В самом начале библиотеки, если объявлен макрос _8_BIT_COLOR, то цветовая палитра дисплея будет составлять 256 цветов, иначе – 65536 цветов. Макрос _GEOMETRICAL позволяет использовать функции вывода линии, рамки, прямоугольника, окружности, круга и треугольника.

P.S. Контроллер Philips LDS183, применяемый в дисплее LPH9135, по командам совместим с LCD-контроллером Philips PCF8833, который применялся в телефонах Nokia 6100, 7210, 6610, 7250, 6220 (разрешение 132×132 пикселей, 4096 цветов), поэтому данная библиотека, с минимумом изменений, может обеспечить работу вышеперечисленных дисплеев в 8-ми битном режиме.

Прикрепленные файлы:

  • LPH9135 – Плата под ЛУТ.rar (19 Кб)
  • LPH9135.rar (7 Кб)

Источник: http://cxem.net/mc/mc223.php

Библиотека LCD5110_Graph

Размер символа: 6 х 8 пикселей

Размер символа: 12 х 16 пикселей

Размер символа: 14 х 24 пикселей

LCD5110(SCK, MOSI, DC, RST, CS);

Инициализация библиотеки с указанием выводов (пинов) подключения к Arduino

Параметры:

   SCK (CLK): Тактирующий вывод для последовательного интерфейса SPI

   MOSI (Din): Вход данных последовательного интерфейса SPI 

   DC (DC):  Вывод выбора режима ввода данных – Данные/Команды

   RST (RST ): Вывод для перезагрузки контроллера дисплея

   CS (CE): Состояние данного вывода разрешает или запрещает ввод данных в контроллер дисплея

Пример: LCD5110 myGLCD(3, 4, 5, 6, 7); // Инициализация библиотеки с указанием пинов подключения к Arduino

Примечания: В скобках подписаны выводы так же как они подписаны на дисплее.

InitLCD([contrast]);

Инициализация дисплея

Параметры:

contrast:<\p>

Указание значения контраста дисплея (0-127). По умолчанию 70

Пример: myGLCD.InitLCD(); // Инициализация дисплея

Примечания: Данная функция выполняет сброс и очистку дисплея.

setContrast(contrast);

Установка контрастности дисплея

Параметры:

contrast: Указание значения контраста дисплея (0-127)

Пример: myGLCD.setContrast(70); // Установка значения контраста, равным 70 (значение  по умолчанию)

enableSleep();

Перевод дисплея в режим ожидания.

Параметры: нет

Пример: myGLCD.enableSleep(); // Перевод дисплея в режим ожидания

Примечания: Перевод дисплея в режим ожидания не отключает подсветку, т.к. подсветка управляется аппаратно.

disableSleep();

Вывод дисплея из режима ожидания

Параметры: нет

Пример: myGLCD.disableSleep(); // Вывод дисплея из режима ожидания

Примечания: При выходе из режима ожидания происходит очистка экрана. Выход из режима ожидания не включает подсветку, т.к. подсветка управляется аппаратно.

update();

Копирование содержимого буфера экрана на экран.

Параметры: нет

Пример: myGLCD.update();  // Копирование содержимого буфера экрана на экран

Примечания: Необходимо выполнять команду update() после каждого обновления буфера экрана.

Вызов команды update(), если дисплей находится в спящем режиме, не будет иметь никакого эффекта.

clrScr();

Очистка буфера экрана.

Параметры: нет

Пример: myGLCD.clrScr();  // Очистка буфера экрана

fillScr();

Заполнение буфера экрана.

Параметры: нет

Пример: myGLCD.fillScr();  // Заполнение буфера экрана

invert(mode);

Инвертировать изображение на экране

Параметры:

mode – true – инверсное изображение

              false – нормальное изображение

Пример: myGLCD.invert(true); // Изображение на экране инвертное

setPixel(x, y);

Включение указанного пикселя в буфере экрана,

Параметры: 

     х: координата пикселя по горизонтали

     y: координата пикселя по вертикали

Пример: myGLCD.setPixel (0,0); // Включить верхний левый пиксель (в буфере экрана)

clrPixel(x,y);

Выключение указанного пикселя в буфере экрана,

Параметры: 

     х: координата пикселя по горизонтали

     y: координата пикселя по вертикали

Пример: myGLCD.clrPixel(0,0); // Выключить верхний левый пиксель (в буфере экрана)

invPixel(x,y);

Инвертировать состояние указанного пикселя в буфере экрана

Параметры: 

     х: координата пикселя по горизонтали

     y: координата пикселя по вертикали

Пример: myGLCD.invPixel(0, 0); // Инвертировать верхний левый пиксель (в буфере экрана)

print(st, x, y);

Распечатать строку в указанных координатах

Можно использовать как литералы LEFT, CENTER и RIGHT, так и числовые координаты, чтобы выровнять строку на экране.

Параметры:

     st: строка для печати

     x: координата верхнего левого угла первого символа по горизонтали

     y: координата верхнего левого угла первого символа по вертикали

Пример: myGLCD.print(“Hello World”,CENTER,0); // Печать строки “Hello World” по центру в верхней части экрана

Примечания: координата по вертикали должна быть кратной 8-ми пикселям. Только 0, 8, 16, 24, 32 и 40 могут быть использованы в качестве координат по вертикали.

Строка для печати может быть либо массив символов или строковый объект

printNumI(num, x, y[, length[, filler]]);

Распечатать целое число в указанных координатах.

Можно использовать как литералы LEFT, CENTER и RIGHT, так и числовые координаты, чтобы выровнять строку с числом на экране.

Параметры:

     num: Число для вывода на экран (от -2147483648 до 2147483647). Допускаются только ЦЕЛЫЕ числа

     x: координата верхнего левого угла первой цифры/знака по горизонтали

     y: координата верхнего левого угла первой цифры/знака по вертикали

     length: минимальное количество цифр / символов (включая знак) для отображения на экране

     filler: Символ для заполнения, чтобы получить минимальную длину.Символ будет вставлен перед номером, но после знака. Умолчанию '' ” (пробел).

Пример: myGLCD.printNumI(num,CENTER,0); // Печать значения переменной “num” по центру в верхней части экрана

Примечания: координата по вертикали должна быть кратной 8-ми пикселям. Только 0, 8, 16, 24, 32 и 40 могут быть использованы в качестве координат по вертикали.

printNumF(num, dec, x, y[, divider[, length[, filler]]]);

Распечатать число с плавающей точкой в указанных координатах.

Можно использовать как литералы LEFT, CENTER и RIGHT, так и числовые координаты, чтобы выровнять строку с числом на экране.

Параметры:

     num: Число для вывода на экран

     Dec: количество цифр после запятой (в дробной части) (допустимые значения 1-5). Число 0 не поддерживается, для этого используйте printNumI ()

     x: координата верхнего левого угла первой цифры/знака по горизонтали

     y: координата верхнего левого угла первой цифры/знака по вертикали

     divider: Одиночный символ для использования в качестве десятичной точки. По умолчанию '.'

     length: минимальное количество цифр / символов (включая знак) для отображения на экране

     filler: Символ для заполнения, чтобы получить минимальную длину.Символ будет вставлен перед номером, но после знака. Умолчанию '' ” (пробел).

Пример: myGLCD.printNumF(num, 3, CENTER,0); // Печать значения переменной “num” с 3-мя знаками после запятой по центру в верхней части экрана

Примечания: Поддерживаемые диапазон зависит от количества цифр в дробной части.

Диапазон приблизительный +/- 2 * (10 в степени 9) – для десятичной системы.

Координата по вертикали должна быть кратной 8-ми пикселям. Только 0, 8, 16, 24, 32 и 40 могут быть использованы в качестве координат по вертикали.

invertText(mode);

Инвертировать текст на экране

Параметры:

     mode – true – инверсное изображение

                  false – нормальное изображение

Пример: myGLCD.invertText(true); // Изображение текста инвертное

Примечания: функция SetFont() отключает инвертный режим

setFont(fontname);

Выбор шрифта для использования совместно с Print(), printNumI() и printNumF()

Параметры:

     fontname: Имя массива, содержащий шрифт, для использования

Пример: myGLCD.setFont(SmallFont); // Выбор шрифт под названием SmallFont

Примечания: Перед использованием необходимо объявить массив со шрифтом  в качестве внешнего или включить его в свой скетч.

drawLine(x1, y1, x2, y2);

Рисование линии между двумя точками в буфере экрана

Параметры: 

     x1: координата начальной точки по горизонтали

     y1: координата начальной точки по вертикали

     x2: координата конечной точки по горизонтали

     y2: координата конечной точки по вертикали

Пример: myGLCD.drawLine(0,0,83,47); // Рисуем линию от верхнего левого в нижний правый угол

clrLine(x1, y1, x2, y2);

Стирание линии между двумя точками в буфере экрана.

Параметры: 

     x1: координата начальной точки по горизонтали

     y1: координата начальной точки по вертикали

     x2: координата конечной точки по горизонтали

     y2: координата конечной точки по вертикали

Пример: myGLCD.clrLine(0,0,83,47) // Стираем линию от верхнего левого в нижний правый угол

drawRect(x1, y1, x2, y2);

Рисование прямоугольника между двумя точками в буфере экрана.

Параметры:

     x1: координата начального угла по горизонтали

     y1: координата начального угла по вертикали

     х2: координата конечного угла по горизонтали

     y2: координата конечного угла по вертикали

Пример: myGLCD.drawRect (42,24,83,47); // Рисуем прямоугольник в правом нижнем углу экрана

clrRect(x1, y1, x2, y2);

Стирание прямоугольника между двумя точками в буфере экрана.

Параметры:

     x1: координата начального угла по горизонтали

     y1: координата начального угла по вертикали

     х2: координата конечного угла по горизонтали

     y2: координата конечного угла по вертикали

Пример: myGLCD.clrRect(42,24,83,47); // Стираем прямоугольник в правом нижнем углу экрана

drawRoundRect(x1, y1, x2, y2);

Нарисовать прямоугольник со слегка закругленными углами между двумя точками в экранном буфере.

Минимальный размер прямоугольника составляет 5 пикселей в любых направлениях. Если размер меньше рекомендуемого прямоугольник не будет нарисован.

Параметры:

     x1: координата начального угла по горизонтали

     y1: координата начального угла по вертикали

     х2: координата конечного угла по горизонтали

     y2: координата конечного угла по вертикали

Пример: myGLCD.drawRoundRect(0,0,41,23); // Нарисовать прямоугольник с закругленными углами в левом верхнем углу экрана

clrRoundRect(x1, y1, x2, y2);

Стереть прямоугольник со слегка закругленными углами между двумя точками в экранном буфере.

Минимальный размер прямоугольника составляет 5 пикселей в любых направлениях. Если размер меньше рекомендуемого прямоугольник не будет удален/стерт.

Параметры:

     x1: координата начального угла по горизонтали

     y1: координата начального угла по вертикали

     х2: координата конечного угла по горизонтали

     y2: координата конечного угла по вертикали

Пример: myGLCD.clrRoundRect(0,0,41,23); // Стереть прямоугольник с закругленными углами в левом верхнем углу экрана

drawCircle(x, y, radius);

Нарисовать круг с заданным радиусом в буфере экрана.

Параметры:

     х: координата центра окружности по горизонтали

     y: координата центра окружности по вертикали

     radius: радиус окружности в пикселях

Пример: myGLCD.DrawCircle (41,23,20); // Рисуем круг в центре экрана с радиусом 20 пикселей

clrCircle(x, y, radius);

Стереть круг с заданным радиусом в буфере экрана.

Параметры:

     х: координата центра окружности по горизонтали

     y: координата центра окружности по вертикали

     radius: радиус окружности в пикселях

Пример: myGLCD.clrCircle(41,23,20); // Рисуем круг в центре экрана с радиусом 20 пикселей

Источник: http://mynobook.blogspot.com/2015/02/lcd5110graph.html

Библиотека для работы с дисплеем 1602

Моя реализация библиотеки для дисплея 16х2 под управлением HD44780.

Описывать протокол и особенности управления, пайки и настройки не буду.

Краткие возможности:

  • управление отображением курсора;
  • вкл/выкл дисплея;
  • вывод текста в любое место;
  • поддержка специальных символов
    и ;
  • вывод числа с преобразованием его в строку;
  • и др.

Особенности:

  • используется исключительно 4 битный режим;
  • данные из дисплея не читаются, используются задержки силами RTOS или циклом;
  • все сигналы DATA расположены в одном порту.

Зависимости: 

  • stdint.h – обязательно;
  • string.h – обязательно;
  • stdio.h – обязательно;
  • stm32f2xx.h – определения макросов GPIO_Pin_8, GPIOC и тп, в зависимости от контроллера файл может быть stm32f10x.h, stm32f40x.h и др;
  • FreeRTOS.h – опционально, если используется в проекте, то лучше включить;
  • task.h – обязательно если используется FreeRTOS.h;

Описание функций.

void LCD1602_Init( void );

Сама важная функция, должна быть запущена перед первым использование дисплея. Инициализирует дисплей для работы:

  • 4-битный режим работы;
  • инкремент курсора;
  • курсор невидимый;

void LCD1602_WriteUserSymbol( const uint8_t number, const uint8_t *data );

Используется для записи пользовательского символа в память дисплея в ячейку указанную в аргументе number. 

Пример использования:

// Массив определяется следующим образом:
// 00001110 – 0x0E
// 00011111 – 0x1F
// 00010001 – 0x11
// 00010001 – 0x11
// 00011111 – 0x1F
// 00011111 – 0x1F
// 00011111 – 0x1F
// 00000000 – ОБЯЗАТЕЛЬНО должно быть 0x00
uint8_t symbol[] = {0x0E, 0x1F, 0x11, 0x11, 0x1F, 0x1F, 0x1F, 0x00}; LCD1602_WriteUserSymbol( 1, symbol);

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

void LCD1602_CursorToHome( void );

Устанавливает курсор в начальное положение координаты (0; 0).

0 1 2 3 4 5 6 7 8 9 A B C D E F
┌———————————————–┐
| | | | | | | | | | | | | | | | | 0
—+–+–+–+–+–+–+–+–+–+–+–+–+–+–+—
| | | | | | | | | | | | | | | | | 1
└———————————————–┘
┌———————————————–┐
|0 |1 |2 |3 |4 |5 |6 |7 |8 |9 |10|11|12|13|14|15|
—+–+–+–+–+–+–+–+–+–+–+–+–+–+–+—
|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|
└———————————————–┘

void LCD1602_CursorToPosition( const uint8_t position );

Устанавливает курсор в позицию указанную в аргументе position, который может принимать значения от 0 до 31 (от 0 до 1F).

void LCD1602_CursorToPositionXY( const uint8_t X, const uint8_t Y );

Устанавливает курсор в строку Y и ячейку X.

void LCD1602_CursorMode( const CursoreMode cursor );

Устанавливает режим отображения курсора:

  • CURSOR_HIDE – выключает вывод курсора;
  • CURSOR_STATIC – отображается статичным подчеркиванием;
  • CURSOR_BLINK – отображается мигающим прямоугольником

void LCD1602_ClearScreen( void );

Очищает дисплей.

void LCD1602_ScreenOnOff( const FunctionalState NewState );

Включает или отключает дисплей:

  • ENABLE – дисплей включен;
  • DISABLE – дисплей выключен

void LCD1602_PrintCharOfPosition( const uint8_t position, const char symbol );

Печатает символ в выбранной позиции.

void LCD1602_PrintStringOfPosition( const uint8_t position, const char *str );

Печатает нультерминальную строку начиная с выбранной позиции. При достижении конца текущей строки текст переносится на новую. Поддерживаются символы:

  • – Переносит текст на новую строку;
  • – Вставляет два пробела (пока так).

void LCD1602_PrintNumberOfPosition( const uint8_t position, const int32_t number );

Печатает число, переведенное в строку. Переводит с помощью функции sprintf.

void LCD1602_PrintCharOfPositionXY( const uint8_t X, const uint8_t Y, const char symbol );

Аналогично функции LCD1602_PrintCharOfPosition, только вместо позиции используются координаты.

void LCD1602_PrintStringOfPositionXY( const uint8_t X, const uint8_t Y, const char *str );

Аналогично функции LCD1602_PrintStringOfPosition, только вместо позиции используются координаты.

void LCD1602_PrintNumberOfPositionXY( const uint8_t X, const uint8_t Y, const int32_t number );

Аналогично функции LCD1602_PrintNumberOfPosition, только вместо позиции используются координаты.

void LCD1602_AppendChar( const char symbol );

Добавляет символ в конец последнего вывода.

void LCD1602_AppendString( const char *str );

Дописывает нультерминальную строку, не поддерживает
и .

void LCD1602_AppendNumber( const int32_t number );

Дописывает число.

Настройка библиотеки

Перед использованием необходимо в файле lcd1602.h определить макросы:

#define LCD1602_USE_FREERTOS 1 ///< Определяет будет ли использоваться FREERTOS #define MCU_CLOCK_USECOND (1

Источник: http://cdeblog.ru/lcd-1602-driver-library

Подключение цветного дисплея от телефона

Источник: http://radio-bes.do.am/publ/ustrojstva_na_mk/podkljuchenie_cvetnogo_displeja_ot_telefona/2-1-0-373

Интерфейс QWERTY-клавиатуры для TFT дисплея на контроллере ILI9325

Источник: http://AVRproject.ru/publ/interfejs_qwerty_klaviatury_dlja_tft_displeja_na_kontrollere_ili9325/1-1-0-162

Дисплей Nokia 1202 и подобные, библиотека Си. – IVANelectronics

Описание функций графической библиотеки для LCD-экрана от Nokia 1100

void nlcd_Init(void);
Инициализация контроллера PCF8814, очистка экрана, инициализация библиотеки.

void nlcd_Clear(void);
Очистка экрана. Очищает экран (и видеобуфер) и устанавливает текущие координаты в нулевые координаты (левый верхний угол).

void nlcd_SendByte(char mode,unsigned char c); Отправляет байт в контроллер PCF8814. Если передаются данные, то они также сохраняются в видеобуфере.

Параметры:

mode: — CMD_LCD_MODE — передается команда контроллеру — DATA_LCD_MODE — передаются данные

с: передаваемый байт

void nlcd_Putc(unsigned char c);
Выводит знак с кодом C в текущее место

void nlcd_Print(char * message);
Выводит строку символов из оперативной памяти, начиная с текущего знакоместа.

void nlcd_PrintF(unsigned char * message);
Выводит строку символов из программной памяти, начиная с текущего знакоместа.

void nlcd_GotoXY(char x,char y); Устанавливает текущие координаты. Отсчет идет в знакоместах 5×8.

Параметры:

x: 0..15 — координата по оси X

y: 0..7 — координата по оси Y

void nlcd_Inverse(unsigned char mode); Устанавливает режим инверсии для всего экрана.

Параметры:

mode: — INV_MODE_ON — инверсия включена

— INV_MODE_OFF — инверсия выключена

void nlcd_Pixel (unsigned char x,unsigned char y, unsigned char pixel_mode); Выводит пиксель в указанные координаты.

Параметры:

x: 0..95 — координата по оси X y: 0..64 — координата по оси Y Отсчет ведется от верхнего левого угла. pixel_mode: — PIXEL_ON — пиксель устанавливается — PIXEL_OFF — пиксель сбрасывается (стирается)

— PIXEL_INV — пиксель инвертируется

void nlcd_Line (unsigned char x1,unsigned char y1, unsigned char x2,unsigned char y2, unsigned char pixel_mode); Рисует линию. Линия рисуется из точки с координатами x1, y1 в точку с координатами x2,y2.

Параметры:

x1, x2: 0..95 y1,y2: 0..64

pixel_mode: такой же как и в функции nlcd_Pixel.

void nlcd_Circle(unsigned char x, unsigned char y, unsigned char radius, unsigned char fill, unsigned char pixel_mode);
Рисует закрашенную или нет окружность с координатами центра x, y и радиусом radius.
Параметры: x: 0..95 y: 0..64 fill: — FILL_ON — заливка выполняется — FILL_OFF — заливка не выполняется

pixel_mode: такой же как и в функции nlcd_Pixel.

void nlcd_Rect (unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, unsigned char fill, unsigned char pixel_mode);
Рисует прямоугольник. Пары значений x1, y1 и x2, y2 задают координаты противоположных углов по диагонали. Прямоугольник может иметь заливку.
Параметры: x1, x2: 0..95 y1, y2: 0..64

fill: такой же как и в функции nlcd_Circle

pixel_mode: такой же как и в функции nlcd_Pixel.

Работаем с дисплеем от Nokia 1100 в графическом режиме

Во второй части поста про подключение дисплея от Nokia 1100 была приведена небольшая библиотека по работе с этим экраном в текстовом режиме.

После того, как  я опубликовал пост, возникла небольшая переписка с пользователем под ником -Валера-. Он просил помочь реализовать графический вывод на экран от Nokia1100.

После некоторого размышления над этим, я приступил к написанию второй версии библиотеки для работы с дисплеем Nokia 1100 в графическом режиме. И вот результат моей работы.

Первая версия библиотеки работала только в текстовом режиме. Вторая версия библиотеки по функционалу частично повторяет библиотеку версии 1, но она имеет и кардинальное отличие. В этой версии библиотеки используется видеобуфер в оперативной памяти.

Без этого буфера реализовать работу с графикой не представляется возможным, так как дисплей от Nokia 1100 позволяет только записывать данные в память контроллера экрана PCF8814, считать данные из него невозможно, хотя контроллер PCF8814 это и позволяет.

Чем руководствовались разработчики этого экрана непонятно, какие задачи стояли неизвестно, но что имеем, то имеем.

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

Буфер организован как массив размерностью 96×8 значений unsigned char. То есть массив соответствует организации видеопамяти в контроллере экрана PCF8814 — 8 банков по 96 байт (столбец из 8 пикселей)  в каждом. Т.е. по горизонтали отсчет идет в пикселях, а по вертикали в блоках по 8 пикселей.

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

Берем данные из буфера, производим соответствующую битовую операцию над  полученным значением. Затем записываем результат обратно в видеобуфер.

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

Как все работает, можно посмотреть в самой библиотеке. Код я постарался максимально прокомментировать. Затруднений в понимании возникнуть недолжно. Но если будут вопросы, пишите в комменты, попробую помочь.

Для демонстрации работы с библиотекой я написал небольшой тестовый проект. Быдлокод, но для демонстрации библиотеки пойдет. Все линейно и крутится в бесконечном цикле. Вот код:

 #include
#include
#include #include “nokia1100_lcd_lib.h”    // Подключаем драйвер LCD-контроллера NOKIA1100 char Text[] PROGMEM = “GRAPH DEMO INIT”; int main(void)
{     nlcd_Init();
    _delay_ms(100);   while(1)
  {
    nlcd_GotoXY(1,4);
    nlcd_PrintF(Text); // Выводим строку из программной памяти     _delay_ms(4000);     nlcd_GotoXY(0,0);     nlcd_PrintF(PSTR(” GRAPH MODE DEMO”)); // Другой способ задания строк в программной памяти
    nlcd_PrintF(PSTR(“—————-“));
    nlcd_PrintF(PSTR(” DigitalChip.ru “));
    nlcd_PrintF(PSTR(”    present     “));
    nlcd_PrintF(PSTR(” NOKIA 1100 LCD “));
    nlcd_PrintF(PSTR(”  demonstration “));
    nlcd_PrintF(PSTR(“—————-“));     _delay_ms(8000);
//
    nlcd_GotoXY(2,7);
    nlcd_PrintF(PSTR(“Clear screen”));
    _delay_ms(4000);
    nlcd_Clear();
//
    nlcd_GotoXY(1,7);
    nlcd_PrintF(PSTR(“Pixel function”));     for (unsigned char i = 0; i

Источник: http://www.ivanelectronics.ru/blog/displey-nokia-1202-i-podobnye-biblioteka-si/

Использование библиотеки для работы с LCD HD44780

Дата публикации: 07 февраля 2012.

Рейтинг:  5 / 5

lcd_com – посылка команды в LCDПример:

lcd_com(0x01); // очистка дисплея

lcd_com(0x38); // интерфейс 8 бит 2 строки

lcd_dat – вывод одного символа в текущую позициюПример:

lcd_dat(“U”); // вывод символа “U”

lcd_dat(0xB0); // вывод символа “Ю”(В соответствие с таблицей символов дисплея)

lcd_init – Инициализация LCDВот пример широко распространенной последовательности для инициализации LCD: 0x38, 0xOC, 0x06 .0x38 устанавливает режим отображения 2-х строк с матрицей 5 х 8 точек и работу с 8-ми разрядной шиной данных;0xOC включает отображение на экране ЖКИ-можуля, без отображения курсоров;

0x06 устанавливает режим автоматического перемещения курсора слева-направо после вывода каждого символа.

lcd_clr – очистка LCD

lcd_home – переводит курсор в начало

lcd_string – вывод строки указанной длинны в текущую позицию

Пример: lcd_string(“TEST”,4); // вывод строки TEST длиной 4 символа

lcd_gotoxy – перемещает курсор в указанную позицию

Пример: lcd_gotoxy(12, 1); // курсор в позиции тринадцатый разряд второй строки

copy_string_to_lcd – вывод строки из флеш-памяти в указанную позицию дисплея

Пример: copy_string_to_lcd(“TEST”,4,0); // вывод строки TEST в позицию пятый разряд первой строки

lcd_definechar – записывает пользовательское изображение символа в память дисплея

Чтобы вывести на экран дисплея собственный символ необходимо знать код символа, прописать этот код в памяти программ микроконтроллера (PROGMEM),  затем поместить его в свободную ячейку памяти LCD (CGRAM) и выводить его на экран при помощи функции lcd_dat().

Для программирования доступны 8 переопределяемых символов в режиме с матрицей 5х7 точек и 4 с матрицей 5х10 (в режиме 5х10 переопределяемые символы адресуются кодами DDRAM через один: 0x00, 0x02, 0x04, 0x06).

Для кодирования матрицы используются горизонтально “уложенные” байты, пять младших битов которых несут информацию о рисунке (причем 1(единица) означает, что сегмент будет включен), 4-й разряд каждого из 8-ми (или 11-ти в режиме 5 х 10) байтов матрицы определяет левую колонку символа, а 0-й – правую. Старшие три бита не используются, равно как и старшие пять байтов, составляющих полную область матрицы символа (16 байтов) в режиме 5х10 (обратите внимание, что матрица программируемых символов допускает использование полной высоты строки (8 строчек для режима 5х7 и 11 строчек для режима 5х10), то есть можно размещать точки в области подчеркивающего курсора).

Создавать символ более удобно в двоичном формате, к примеру создадим символ прямоугольника, код будет таким:

const uint8_t pryamougolnik[] PROGMEM= { 0b11111, 0b10001, 0b10001, 0b10001, 0b10001, 0b10001, 0b11111, 0b0 };

lcd_shift_right – перемещает изображение на указанное число символов вправо

lcd_shift_Left – перемещает изображение на указанное число символов влево

lcd_cursor_on – включает курсор подчеркивание

lcd_cursor_blink – включает мигающий курсор

lcd_cursor_off – выключает курсор

lcd_blank – отключает изображение, но не очищает

lcd_visible – включает изображение

lcd_cursor_left – перемещает курсор на указанное число символов влево

lcd_cursor_right – перемещает курсор на указанное число символов вправо

lcd_progress_bar – позволяет выводить на дисплей динамическую шкалу, об этой функции поговорим более подробней на практическом примере.

lcd_num_to_str – позволяет выводить на дисплей переменную до 4 разрядов

Пример: void lcd_num_to_str(ADC, 4); // Выводим переменную АЦП 4 разряда

Сделаем проект “Аналоговый вольтметр” в котором информация об измеренном напряжении будет выводится на экран в виде горизонтальной динамической шкалы. Измеряемое напряжение подается на вход ADC0, максимум 5В. без использования делителя.

Используем для этого проекта микроконтроллер atmega8, который тактируется от внутреннего генератора частотой 8МГц. Дисплей подключаем по четырехбитной шине в соответствие с настройками из файла lcd_lib.h.

При создании проекта в AVRSTUDIO копируем 2 файла библиотеки в папку нашего проекта, а в дереве проекта добавляем эти файлы(lcd_lib.c и lcd_lib.h).

За вывод динамической шкалы отвечает функция lcd_progress_bar(uint8_t progress, uint8_t maxprogress, uint8_t length), в зависимости от состояния переменных этой функции, шкала меняет свой уровень, progress – уровень от 0 до 255, maxprogress – максимальный уровень ограничивается числом от 0 до 255, length – длина шкалы от 0 до 16 ячеек(в зависимости от типа дисплея). Так как при максимальном напряжении на входе значение ADC равно 1024, делим это значение на 4 и присваиваем его переменной “u”, а переменную “u” используем в функции вывода динамической шкалы void progress().

Полный текст программы выкладываю ниже:

//******Применение библиотек для работы с LCD HD44780***** #include #include #include #include “lcd_lib.h” const uint8_t simbol_1[] PROGMEM= {0b00000,0b10001,0b01010,0b00100,0b01010,0b10001,0b00000,0b0}; const uint8_t simbol_2[] PROGMEM= {0b00100,0b00100,0b00100,0b11111,0b00100,0b00100,0b00100,0b0}; char u; //******************************************************** void progress(void) // функция вывода шкалы { lcd_gotoxy(0, 0); lcd_string(“0……05……1”,16); lcd_gotoxy(0, 1); lcd_progress_bar(u, 255, 16); } //******************************************************** int main(void) { /***Настройка АЦП***/ ADCSRA |= (1

Источник: https://radioparty.ru/prog-avr/program-c/361-lesson-lib-lcd

Как подключить LCD дисплей с I2C модулем к Arduino

В статье будем подключать к Ардуино жидкокристаллический дисплей 1602 с I2C модулем FC-113, благодаря чему подключение будет осуществляться всего по 2 проводам данных + 2 проводам питания.

  • Arduino;
  • LCD 1602 дисплей (16 символов, 02 строки);
  • I2C адаптер FC-113;
  • соединительные провода.
  • Модуль FC-113 сделан на базе микросхемы PCF8574T, которая представляет собой 8-битный сдвиговый регистр – «расширитель» входов-выходов для последовательной шины I2C. На рисунке микросхема обозначена DD1.
  • R1 – подстроечный резистор для регулировки контрастности ЖК дисплея.
  • Джампер J1 используется для включения подсветки дисплея.
  • Выводы 1…16 служат для подключения модуля к выводам LCD дисплея.
  • Контактные площадки А1…А3 нужны для изменения адреса I2C устройства. Запаивая соответствующие перемычки, можно менять адрес устройства. В таблице приведено соответствие адресов и перемычек: “0” соответствует разрыву цепи, “1” – установленной перемычке. По умолчанию все 3 перемычки разомкнуты и адрес устройства 0x27.

I2C модуль FC-113 для подключения ЖК экрана

Подключение модуля к Arduino осуществляется стандартно для шины I2C: вывод SDA модуля подключается к аналоговому порту A4, вывод SCL – к аналоговому порту A5 Ардуино. Питание модуля осуществляется напряжением +5 В от Arduino. Сам модуль соединяется выводами 1…16 с соответствующими выводами 1…16 на ЖК дисплее.

Схема подключения ЖК дисплея к Arduino по протоколу I2C

3Библиотека для работы по протоколу I2C

Теперь нужна библиотека для работы с LCD по интерфейсу I2C. Можно воспользоваться, например, вот этой (ссылка в строке “Download Sample code and library”).

Библиотека для работы по протоколу I2C

Скачанный архив LiquidCrystal_I2Cv1-1.rar разархивируем в папку libraries, которая находится в директории Arduino IDE.

Библиотека поддерживает набор стандартных функций для LCD экранов:

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

Добавим мало красок в нашу не легкую жизнь!

   Распределение дисплея 128 на 128 пикселей. В принципе не важно с какого телефона дисплей, а какой контроллер в нем стоит. Мной был использован экземпляр с контроллером LPH9135. Шина у него последовательная, а значит он довольно медленный.

Но для нашего проекта в самый раз. Внешний вид и цоколевку дисплея смотрите на фото.

   Так же была разработана и испытана плата для устройства. Точнее это немного подправленная печатка из предыдущего варианта. Теперь переменные резисторы находятся сверху. На мой взгляд это намного упростит регулировку показаний прямо в корпусе используемого прибора.

С органов управления осталось все по прежнему. Правда теперь нет переключения между «меню». Переменным резистором устанавливаем нужный ток прямо на «ходу». После срабатывания защиты, реле отключится. Включить его можно только нажатием на кнопку.

Так же кнопкой можно просто включать и отключать реле.

   На счет датчика температуры. Если датчик будет отключен, то ШИМ будет включен на 100%. При подключенном – обороты кулера будут меняться в зависимости от температуры. При температуре ниже 40 градусов цифры на дисплее будут синие, если больше 40 градусов – надпись будет красной.

   Полевые транзисторы для коммутации реле и кулера нужно применять с буквой «L». Им не нужно большого напряжения для открытия. Хочу сказать пару слов по поводу ОУ.

Применял LM358, но желательно ставить «rail-to-rail». Испробованные экземпляры MCP6002 работали неадекватно, хотя именно они там должны чувствовать себя наилучше.

Наверно купил какие-то перемаркированные. Смотрите не ошибитесь, как я.

   Подсветка питается напряжением от 9 до 12 вольт. Резистор подбираем в зависимости от требуемой яркости. У себя поставил 680 ом. Смотрите не переусердствуйте, а то сгорит.

   Здесь межете скачать прошивку контроллера. В будущем хочу еще добавить пару «цветовых схем», чтоб каждый пользователь мог подобрать для себя наилучший вариант отображения информации на дисплее. Так что следите за форумом. Как только появится желание сделать, когда еще и сделаю, то выложу там. Спасибо всем за внимание. С вами был Бухарь.

Источник: http://radioskot.ru/publ/izmeriteli/podkljuchenie_cvetnogo_displeja_ot_telefona/15-1-0-853

 Уже давно у меня лежит TFT дисплей на контроллере ILI9325, разрешением 240х320 пикселей, купленный на ebay. Вот такой

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

 Для одной из моих задумок понадобился интерфейс ввода текста, проще говоря нужна была полнораскладная клавиатура, позволяющая вводить любой текст.  С результатом моих трудов я сейчас вас и познакомлю.

 Начнем со схемы. Этот дисплей поддерживает 8-и и 16-и битное подключение. Для более шустрого отображения данных, был выбран 16-и битный режим. Чтобы для начала хотя бы запустить дисплей и проверить его работоспособность собрал вот такую схему с микроконтроллером ATMega128A и минимальной обвязкой.

  Питание схемы строго в диапазоне 2,8 – 3,3 вольта.  Кварцевый резонатор у меня применен на 11,0592 МГц, но рекомендую ставить с максимально возможной частотой. От этого напрямую зависит скорость отображения данных на дисплее.

  Вытравленная платка под дисплей вышла двухсторонней, на ней у меня еще стоят подстроечный резистор и пара дополнительных разъемов. В схеме их нет, так они пока нам не нужны, заложил на будущее.

  В схеме, как я уже писал, применен микроконтроллер ATMega128A, с использованием библиотек дисплея и клавиатуры у него остается меньше половины программной памяти (не более 35%), поэтому для больших проектов лучше сразу закладывать камень с 256 кб флэша. 

  Теперь немного о программной части. Клавиатура реализована в виде подключаемой библиотеки keyboard ILI9325.inc в которой находится подпрограмма Send. При переходе на эту подпрограмму отобразится клавиатура и появится возможность набрать текст. По возвращении набранный текст будет  храниться в текстовой переменной Text.

  Для примера привожу тестовый код

  Результатом работы программы будет нарисованный посередине дисплея прямоугольник. В главном цикле программы идет постоянное сканирование ножки Touch_irq. При нажатии на тачскрин на этой ножке появляется низкий уровень. Если нажать по области внутри прямоугольника произойдет переход в подпрограмму Send и отрисовка клавиатуры.

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

 Вот такая вот клавиатура в итоге получилась.

 И для наглядности записал видео работы программы.

Библиотека и тестовый код

Печатная плата (DipTrace)

Ссылка где приобретался дисплей

LiquidCrystal() создаёт переменную типа LiquidCrystal и принимает параметры подключения дисплея (номера выводов);
begin() инициализация LCD дисплея, задание параметров (кол-во строк и символов);
clear() очистка экрана и возврат курсора в начальную позицию;
home() возврат курсора в начальную позицию;
setCursor() установка курсора на заданную позицию;
write() выводит символ на ЖК экран;
print() выводит текст на ЖК экран;
cursor() показывает курсор, т.е. подчёркивание под местом следующего символа;
noCursor() прячет курсор;
blink() мигание курсора;
noBlink() отмена мигания;
noDisplay() выключение дисплея с сохранением всей отображаемой информации;
display() включение дисплея с сохранением всей отображаемой информации;
scrollDisplayLeft() прокрутка содержимого дисплея на 1 позицию влево;
scrollDisplayRight() прокрутка содержимого дисплея на 1 позицию вправо;
autoscroll() включение автопрокрутки;
noAutoscroll() выключение автопрокрутки;
leftToRight() задаёт направление текста слева направо;
rightToLeft() направление текста справа налево;
createChar() создаёт пользовательский символ для LCD-экрана.

4Скетч для вывода текста на LCD экран по шине I2C

Откроем образец: Файл Образцы LiquidCrystal_I2C CustomChars и немного его переделаем. Выведем сообщение, в конце которого будет находиться мигающий символ. В комментариях к коду прокомментированы все нюансы скетча.

#include // подключаем библиотеку Wire #include // подключаем библиотеку ЖКИ #define printByte(args) write(args); // uint8_t heart[8] = {0x0,0xa,0x1f,0x1f,0xe,0x4,0x0}; // битовая маска символа «сердце» LiquidCrystal_I2C lcd(0x27, 16, 2); // Задаём адрес 0x27 для LCD дисплея 16×2 void setup() { lcd.init(); // инициализация ЖК дисплея lcd.backlight(); // включение подсветки дисплея lcd.createChar(3, heart); // создаём символ «сердце» в 3 ячейке памяти lcd.home(); // ставим курсор в левый верхний угол, в позицию (0,0) lcd.print(“Hello SolTau.ru!”); // печатаем строку текста lcd.setCursor(0, 1); // перевод курсора на строку 2, символ 1 lcd.print(” i “); // печатаем сообщение на строке 2 lcd.printByte(3); // печатаем символ «сердце», находящийся в 3-ей ячейке lcd.print(” Arduino “); } void loop() { // мигание последнего символа lcd.setCursor(13, 1); // перевод курсора на строку 2, символ 1 lcd.print(” “); delay(500); lcd.setCursor(13, 1); // перевод курсора на строку 2, символ 1 lcd.print(” “); delay(500); }

Кстати, символы, записанные командой lcd.createChar();, остаются в памяти дисплея даже после выключения питания, т.к. записываются в ПЗУ дисплея 1602.

5Создание собственных символов для ЖК дисплея

Немного подробнее рассмотрим вопрос создания собственных символов для ЖК экранов. Каждый символ на экране состоит из 35-ти точек: 5 в ширину и 7 в высоту (+1 резервная строка для подчёркивания). В строке 6 приведённого скетча мы задаём массив из 7-ми чисел: {0x0, 0xa, 0x1f, 0x1f, 0xe, 0x4, 0x0}.

Преобразуем 16-ричные числа в бинарные: {00000, 01010, 11111, 11111, 01110, 00100, 00000}. Эти числа – не что иное, как битовые маски для каждой из 7-ми строк символа, где “0” обозначают светлую точку, а “1” – тёмную.

Например, символ сердца, заданный в виде битовой маски, будет выглядеть на экране так, как показано на рисунке.

Создание собственного символа для LCD экрана

6Управление ЖК экраном по шине I2C

Загрузим скетч в Arduino. На экране появится заданная нами надпись с мигающим курсором в конце.

Управление ЖК экраном с помощью Arduino по шине I2C

7Что находится «за» шиной I2C

В качестве бонуса рассмотрим временную диаграмму вывода латинских символов “A”, “B” и “С” на ЖК дисплей. Эти символы имеются в ПЗУ дисплея и выводятся на экран просто передачей дисплею их адреса. Диаграмма снята с выводов RS, RW, E, D4, D5, D6 и D7 дисплея, т.е. уже после преобразователя FC-113 «I2C параллельная шина». Можно сказать, что мы погружаемся немного «глубже» в «железо».

Временная диаграмма вывода латинских символов “A”, “B” и “С” на LCD дисплей 1602

На диаграмме видно, что символы, которые имеются в ПЗУ дисплея (см. стр.11 даташита, ссылка ниже), передаются двумя полубайтами, первый из которых определяет номер столбца таблицы, а второй – номер строки.

При этом данные «защёлкиваются» по фронту сигнала на линии E (Enable), а линия RS (Register select, выбор регистра) находится в состоянии логической единицы, что означает передачу данных. Низкое состояние линии RS означает передачу инструкций, что мы и видим перед передачей каждого символа.

В данном случае передаётся код инструкции возврата каретки на позицию (0, 0) ЖК дисплея, о чём также можно узнать, изучив техническое описание дисплея.

И ещё один пример. На этой временной диаграмме показан вывод символа «Сердце» на ЖК дисплей.

Временная диаграмма вывода символа «Сердце» из ПЗУ на ЖК дисплей 1602

Опять, первые два импульса Enable соответствуют инструкции Home() (0000 00102) – возврат каретки на позицию (0; 0), а вторые два – вывод на ЖК дисплей хранящийся в ячейке памяти 310 (0000 00112) символ «Сердце» (инструкция lcd.createChar(3, heart); скетча).

Скачать LCD 1602 datasheet

  • Скачать техническое описание на LCD дисплей 1602.

Источник: https://soltau.ru/index.php/arduino/item/372-kak-podklyuchit-lcd

Библиотека для цветного OLED дисплея

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

Начнем сразу с печальки, мой дисплейчик называется UG-6028GDEBF02, мне он достался по работе и я не представляю, где его можно купить и достать, поэтому не спрашивайте. Производитель WiseChip, можете у них запросить напрямую. Какой смысл тогда о нем писать? Общие принципы одни и те же, поэтому приладить какой то свой дисплей не составит труда.

Из интересного: диагональ 1.7, количество цветов 262к, разрешение 160×128 точек.

Чем не порадовал этот дисплей, это тем, что у него болтается гибкий шлейф, поэтому не имея 35-Pin ZIF разъема, не представляю как еще его можно подключить. Учитывая то, что такие разъемы не продаются на каждом углу, да и шаг 0.5мм, то дисплей никак нельзя назвать радиолюбительским.

Но могу сказать на этом минусы заканчиваются. Сам по себе дисплейчик легкий и тонкий. От какой то определеннной тактовой частоты микроконтроллера, дисплей никак не зависит. Отослал ему данные и они будут на дисплее, пока их не затрешь.

Про саму технологию OLED очень много написано в гугле. Основные моменты: большой угол обзора, быстрый отклик, отсутствие подсветки, хорошая контрастность, малое токопотребление. Из минусов — не большой срок работы (выцветание).

Субъективное мнение, оставшееся от дисплея — контрастность очень хорошая, там где черное, там действительно черное, хорошая яркость, нет бликов.

К зеленому и синему нет претензий, а вот «ядовитый» красный мне так и не удалось получить. Красный мог бы быть поярче.

BMP я не выводил, поэтому за качество картинки не могу сказать, а вот надписи и линии полным ходом, впечателение осталось очень приятное, для этого он годится.

Подключиться можно по нескольким интерфейсам.

Я использовал параллельный, по той причине, что переносил либу с другой платформы. Писал либу сам, но с оглядкой, некоторые вещи вроде таблицы символов, я оставил в неизменном виде.

Инициализация есть в даташите, все довольно прозрачно.

Работать с дисплеем тоже довольно просто. Ножкой RS выбираем, что это будет команда или данные, выставляем 8 бит данных на ножках D17-D10 и подаем синхру ногой WRB. Все данные ушли.

Для того, чтобы закрасить один пиксель, нужно запихнуть в регистр DDRAM 18 бит. Для режима 65к цветов, каждый цвет кодируется 6 битами, поэтому чтобы закрасить 1 пиксель, потребуется две посылки по 8 бит, по хитрой схеме

Заливать каждый пиксель отдельно геморно, поэтому присутствуют регистры MX1, MY1, MX2, MY2 которыми задается заливаемая область.

Направление заливки справа налево, сверху вниз меняется как угодно. Стартовая точка указывается в координатах MEMORY_ACCESSPOINTER_X и MEMORY_ACCESSPOINTER_Y. Итого, указали область, стартовую точку, а дальше просто шлете цвета в регистр DDRAM, количество пикселей высчитываете сами. Если пошлете больше нужного, он их просто не выведет. В общем, что касается низкого уровня, то вроде все.

А вот следующий момент меня немного смутил, дело в том, что таблица кодировки для дисплея сделана в win1251, про которую keil ничего не знает.

Я не придумал ничего лучше, чем переключиться в настройках кейла на utf и сделать функцию, которая переводит из UTF-8 в WIN1251. Также для вывода кирилицы сделал используется отдельная функция.

Мне не кажется это решение хорошим, но лучше ничего в голову не пришло.

Теперь к самой библиотеке, если кому то удастся найти этот дисплей

Источник: http://avr-start.ru/?p=4487

Ссылка на основную публикацию
Adblock
detector
",css:{backgroundColor:"#000",opacity:.6}},container:{block:void 0,tpl:"
"},wrap:void 0,body:void 0,errors:{tpl:"
",autoclose_delay:2e3,ajax_unsuccessful_load:"Error"},openEffect:{type:"fade",speed:400},closeEffect:{type:"fade",speed:400},beforeOpen:n.noop,afterOpen:n.noop,beforeClose:n.noop,afterClose:n.noop,afterLoading:n.noop,afterLoadingOnShow:n.noop,errorLoading:n.noop},o=0,p=n([]),h={isEventOut:function(a,b){var c=!0;return n(a).each(function(){n(b.target).get(0)==n(this).get(0)&&(c=!1),0==n(b.target).closest("HTML",n(this).get(0)).length&&(c=!1)}),c}},q={getParentEl:function(a){var b=n(a);return b.data("arcticmodal")?b:(b=n(a).closest(".arcticmodal-container").data("arcticmodalParentEl"),!!b&&b)},transition:function(a,b,c,d){switch(d=null==d?n.noop:d,c.type){case"fade":"show"==b?a.fadeIn(c.speed,d):a.fadeOut(c.speed,d);break;case"none":"show"==b?a.show():a.hide(),d();}},prepare_body:function(a,b){n(".arcticmodal-close",a.body).unbind("click.arcticmodal").bind("click.arcticmodal",function(){return b.arcticmodal("close"),!1})},init_el:function(d,a){var b=d.data("arcticmodal");if(!b){if(b=a,o++,b.modalID=o,b.overlay.block=n(b.overlay.tpl),b.overlay.block.css(b.overlay.css),b.container.block=n(b.container.tpl),b.body=n(".arcticmodal-container_i2",b.container.block),a.clone?b.body.html(d.clone(!0)):(d.before("
"),b.body.html(d)),q.prepare_body(b,d),b.closeOnOverlayClick&&b.overlay.block.add(b.container.block).click(function(a){h.isEventOut(n(">*",b.body),a)&&d.arcticmodal("close")}),b.container.block.data("arcticmodalParentEl",d),d.data("arcticmodal",b),p=n.merge(p,d),n.proxy(e.show,d)(),"html"==b.type)return d;if(null!=b.ajax.beforeSend){var c=b.ajax.beforeSend;delete b.ajax.beforeSend}if(null!=b.ajax.success){var f=b.ajax.success;delete b.ajax.success}if(null!=b.ajax.error){var g=b.ajax.error;delete b.ajax.error}var j=n.extend(!0,{url:b.url,beforeSend:function(){null==c?b.body.html("
"):c(b,d)},success:function(c){d.trigger("afterLoading"),b.afterLoading(b,d,c),null==f?b.body.html(c):f(b,d,c),q.prepare_body(b,d),d.trigger("afterLoadingOnShow"),b.afterLoadingOnShow(b,d,c)},error:function(){d.trigger("errorLoading"),b.errorLoading(b,d),null==g?(b.body.html(b.errors.tpl),n(".arcticmodal-error",b.body).html(b.errors.ajax_unsuccessful_load),n(".arcticmodal-close",b.body).click(function(){return d.arcticmodal("close"),!1}),b.errors.autoclose_delay&&setTimeout(function(){d.arcticmodal("close")},b.errors.autoclose_delay)):g(b,d)}},b.ajax);b.ajax_request=n.ajax(j),d.data("arcticmodal",b)}},init:function(b){if(b=n.extend(!0,{},a,b),!n.isFunction(this))return this.each(function(){q.init_el(n(this),n.extend(!0,{},b))});if(null==b)return void n.error("jquery.arcticmodal: Uncorrect parameters");if(""==b.type)return void n.error("jquery.arcticmodal: Don't set parameter \"type\"");switch(b.type){case"html":if(""==b.content)return void n.error("jquery.arcticmodal: Don't set parameter \"content\"");var e=b.content;return b.content="",q.init_el(n(e),b);case"ajax":return""==b.url?void n.error("jquery.arcticmodal: Don't set parameter \"url\""):q.init_el(n("
"),b);}}},e={show:function(){var a=q.getParentEl(this);if(!1===a)return void n.error("jquery.arcticmodal: Uncorrect call");var b=a.data("arcticmodal");if(b.overlay.block.hide(),b.container.block.hide(),n("BODY").append(b.overlay.block),n("BODY").append(b.container.block),b.beforeOpen(b,a),a.trigger("beforeOpen"),"hidden"!=b.wrap.css("overflow")){b.wrap.data("arcticmodalOverflow",b.wrap.css("overflow"));var c=b.wrap.outerWidth(!0);b.wrap.css("overflow","hidden");var d=b.wrap.outerWidth(!0);d!=c&&b.wrap.css("marginRight",d-c+"px")}return p.not(a).each(function(){var a=n(this).data("arcticmodal");a.overlay.block.hide()}),q.transition(b.overlay.block,"show",1*")),b.overlay.block.remove(),b.container.block.remove(),a.data("arcticmodal",null),n(".arcticmodal-container").length||(b.wrap.data("arcticmodalOverflow")&&b.wrap.css("overflow",b.wrap.data("arcticmodalOverflow")),b.wrap.css("marginRight",0))}),"ajax"==b.type&&b.ajax_request.abort(),p=p.not(a))})},setDefault:function(b){n.extend(!0,a,b)}};n(function(){a.wrap=n(document.all&&!document.querySelector?"html":"body")}),n(document).bind("keyup.arcticmodal",function(d){var a=p.last();if(a.length){var b=a.data("arcticmodal");b.closeOnEsc&&27===d.keyCode&&a.arcticmodal("close")}}),n.arcticmodal=n.fn.arcticmodal=function(a){return e[a]?e[a].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof a&&a?void n.error("jquery.arcticmodal: Method "+a+" does not exist"):q.init.apply(this,arguments)}}(jQuery)}var debugMode="undefined"!=typeof debugFlatPM&&debugFlatPM,duplicateMode="undefined"!=typeof duplicateFlatPM&&duplicateFlatPM,countMode="undefined"!=typeof countFlatPM&&countFlatPM;document["wri"+"te"]=function(a){let b=document.createElement("div");jQuery(document.currentScript).after(b),flatPM_setHTML(b,a),jQuery(b).contents().unwrap()};function flatPM_sticky(c,d,e=0){function f(){if(null==a){let b=getComputedStyle(g,""),c="";for(let a=0;a=b.top-h?b.top-h{const d=c.split("=");return d[0]===a?decodeURIComponent(d[1]):b},""),c=""==b?void 0:b;return c}function flatPM_testCookie(){let a="test_56445";try{return localStorage.setItem(a,a),localStorage.removeItem(a),!0}catch(a){return!1}}function flatPM_grep(a,b,c){return jQuery.grep(a,(a,d)=>c?d==b:0==(d+1)%b)}function flatPM_random(a,b){return Math.floor(Math.random()*(b-a+1))+a}