[Интерфейс аппаратуры]
Код интерфейса находится в файлах DEV_Config.c и DEV_Config.h.
Raspberry Pi и Jetson Nano. Код интерфейса находится в каталоге RaspberryPi&JetsonNano\c\lib\Config. Здесь используются 2 библиотеки: bcm2835 и wiringPi. По умолчанию используется WiringPi. Если необходимо использовать bcm2835, то надо просто модифицировать строку "USELIB_RPI =" файла RaspberryPi&JetsonNano\c\Makefile следующим образом:
...
USELIB_RPI = USE_BCM2835_LIB
# USELIB_RPI = USE_WIRINGPI_LIB
# USELIB_RPI = USE_DEV_LIB
...
STM32. Файлы драйвера интерфейса находятся в каталоге STM32\STM32-F103ZET6\User\Config.
Используемые типы данных:
#define UBYTE uint8_t
#define UWORD uint16_t
#define UDOUBLE uint32_t
Функции инициализации и деинициализации модуля экрана:
void DEV_Module_Init(void);
void DEV_Module_Exit(void);
Эти функции используются перед работой с экраном e-Paper (DEV_Module_Init) и после работы с ним (DEV_Module_Exit). Если на Вашей плате дисплея напечатана версия Rev2.1, модуль войдет в режим сверхнизкого потребления мощности (low-ultra mode) после вызова DEV_Module_Exit(). Тесты показали, что ток потребления в этом режиме практически нулевой.
Функции чтения/записи через GPIO (программная реализация SPI):
void DEV_Digital_Write(UWORD Pin, UBYTE Value);
UBYTE DEV_Digital_Read(UWORD Pin);
Функция записи через аппаратный SPI:
void DEV_SPI_WriteByte(UBYTE Value);
[Драйвер EPD]
Для Raspberry Pi и Jetson Nano драйвер epd сохранен в каталоге RaspberryPi&JetsonNano\c\lib\e-Paper. Для STM32 драйвер epd находится в каталоге STM32\STM32-F103ZET6\User\e-Paper.
EPD_1in02d.c
EPD_1in02d.h
EPD_1in54.c
EPD_1in54.h
EPD_1in54b.c
EPD_1in54b.h
EPD_1in54c.c
EPD_1in54c.h
EPD_1in54_V2.c
EPD_1in54_V2.h
EPD_2in13.c
EPD_2in13.h
EPD_2in13bc.c
EPD_2in13bc.h
EPD_2in13d.c
EPD_2in13d.h
EPD_2in13_V2.c
EPD_2in13_V2.h
EPD_2in7.c
EPD_2in7.h
EPD_2in7b.c
EPD_2in7b.h
EPD_2in9.c
EPD_2in9.h
EPD_2in9bc.c
EPD_2in9bc.h
EPD_2in9d.c
EPD_2in9d.h
EPD_4in2.c
EPD_4in2.h
EPD_4in2bc.c
EPD_4in2bc.h
EPD_5in83.c
EPD_5in83.h
EPD_5in83bc.c
EPD_5in83bc.h
EPD_7in5.c
EPD_7in5.h
EPD_7in5bc.c
EPD_7in5bc.h
EPD_7in5b_V2.c
EPD_7in5b_V2.h
EPD_7in5_V2.c
EPD_7in5_V2.h
Декларация функций находится в соответствующем (типу индикатора) файле заголовка (с расширением *.h). Буквы XXX в имени функции должны быть заменены на обозначение типа индикатора. Например, если это индикатор 4.2inch e-Paper, то XXX нужно заменить на 4IN2.
Инициализация. Эта функция должна использоваться для инициализации или вывода из режима сна экрана E-Paper.
// Инициализация индикаторов 1.54inch e-Paper, 1.54inch e-Paper V2,
// 2.13inch e-Paper, 2.13inch e-Paper V2, 2.13inch e-Paper (D),
// 2.9inch e-Paper,2.9inch e-Paper (D).
// Параметр Mode выбирает тип обновления:
// = 0 для инициализации полного обновления (full refresh)
// = 1 для инициализации частичного обновления (partial refresh)
void EPD_xxx_Init(UBYTE Mode);
// Инициализация других типов экранов:
void EPD_xxx_Init(void);
Очистка. Эта функция используется для заполнения экрана белым цветом:
void EPD_xxx_Clear(void);
Передача образа экрана и отображение.
// Черно/белый экран e-Paper:
void EPD_xxx_Display(UBYTE *Image);
// Трехцветный экран e-Paper:
void EPD_xxx_Display(const UBYTE *blackimage, const UBYTE *ryimage);
Имеются следующие исключения:
// Частичное обновление 2.13inch e-paper (D), 2.9inch e-paper (D):
void EPD_2IN13D_DisplayPart(UBYTE *Image);
void EPD_2IN9D_DisplayPart(UBYTE *Image);
// Из-за того, что контроллеры 1.54inch e-Paper V2
// и 2.13inch e-Paper V2 были обновлены, нужно использовать
// EPD_xxx_DisplayPartBaseImage для отображения статической
// картинки, и затем использовать EPD_xxx_displayPart()
// для динамического отображения при частичном обновлении.
void EPD_1IN54_V2_DisplayPartBaseImage(UBYTE *Image);
void EPD_1IN54_V2_DisplayPart(UBYTE *Image);
void EPD_2IN13_V2_DisplayPart(UBYTE *Image);
void EPD_2IN13_V2_DisplayPartBaseImage(UBYTE *Image);
// Из-за того, что у микроконтроллера STM32103ZET5 недостаточно
// RAM для образа экрана, так что 7.5B, 7.5C, 5.83B, 5.83C могут
// отобразить только половину экрана.
void EPD_7IN5BC_DisplayHalfScreen (const UBYTE *blackimage, const UBYTE *ryimage);
void EPD_5IN83BC_DisplayHalfScreen (const UBYTE *blackimage, const UBYTE *ryimage);
Вход режим сна.
void EPD_xxx_Sleep(void);
Имейте в виду, что для пробуждения индикатора следует выполнять аппаратный сброс индикатора, или использовать функцию инициализации.
[Функции приложения]
Рисование. Предоставляются базовые функции рисования, их можно найти в каталоге RaspberryPi&JetsonNano\c\lib\GUI (для Raspbian Pi & Jetson Nano) и в каталоге STM32\STM32-F103ZET6\User\GUI (для STM32):
GUI_BMPfile.c
GUI_BMPfile.h
GUI_Paint.c
GUI_Paint.h
Шрифты. Шрифты находятся в каталогах RaspberryPi&JetsonNano\c\lib\Fonts (для Raspbian Pi & Jetson Nano) и STM32\STM32-F103ZET6\User\Fonts (для STM32).
font12.c
font12CN.c
font16.c
font20.c
font24.c
font24CN.c
font8.c
fonts.h
[Как использовать]
1. Создание буфера картинки. Создайте новый буфер образа экрана (image buffer) с помощью функции Paint_NewImage. В параметрах функции указывается ширина, высота, поворот изображения и его цвет.
void Paint_NewImage(UBYTE *image, UWORD Width, UWORD Height, UWORD Rotate, UWORD Color);
image: указатель на место в памяти, где находится буфер.
Width: ширина экрана картинки.
Height: высота картинки.
Rotate: на сколько градусов повернуть изображение.
Color: первичный цвет картинки.
2. Выбор буфера. Выберите буфер экрана с помощью функции Paint_SelectImage. Можно создать несколько буферов изображения, и затем выбирать нужный буфер для каждого изображения. В параметре функции находится указатель на начало предварительно созданного буфера.
void Paint_SelectImage(UBYTE *image);
3. Поворот. Установите ориентацию дисплея функцией Paint_SetRotate.
void Paint_SetRotate(UWORD Rotate);
В параметре Rotate можно указать 4 варианта поворота картинки ROTATE_0, ROTATE_90, ROTATE_180, ROTATE_270, что соответствует 0, 90, 180 и 270 градусам. Обычно эта функция используется для изменения угла вывода изображения, после вызова Paint_SelectImage().
На картинке ниже демонстрируется начало координат X, Y и направление их увеличения для разных вариантов параметра Rotate.
4. Зеркалирование. Зеркалирование вывода производится с помощью функции Paint_SetMirroring. В параметре mirror указывается 4 варианта зеркалирования MIRROR_NONE, MIRROR_HORIZONTAL, MIRROR_VERTICAL, MIRROR_ORIGIN.
void Paint_SetMirroring(UBYTE mirror);
5. Рисование точки. Точка в буфере рисуется с помощью функции Paint_DrawPoint.
void Paint_DrawPoint(UWORD Xpoint,
UWORD Ypoint,
UWORD Color,
DOT_PIXEL Dot_Pixel,
DOT_STYLE Dot_Style);
Параметрами Xpoint, Ypoint указывается координата точки, параметр Color задает цвет. Параметр Dot_Pixel задает размер точки, доступно 8 вариантов:
typedef enum
{
DOT_PIXEL_1X1 = 1, // 1 x 1
DOT_PIXEL_2X2, // 2 X 2
DOT_PIXEL_3X3, // 3 X 3
DOT_PIXEL_4X4, // 4 X 4
DOT_PIXEL_5X5, // 5 X 5
DOT_PIXEL_6X6, // 6 X 6
DOT_PIXEL_7X7, // 7 X 7
DOT_PIXEL_8X8, // 8 X 8
}DOT_PIXEL;
Параметр Dot_Style задает стиль точки:
typedef enum
{
DOT_FILL_AROUND = 1,
DOT_FILL_RIGHTUP,
}DOT_STYLE;
6. Рисование линии. Для этой цели используется функция Paint_DrawLine.
void Paint_DrawLine(UWORD Xstart,
UWORD Ystart,
UWORD Xend,
UWORD Yend,
UWORD Color,
DOT_PIXEL Line_width,
LINE_STYLE Line_Style);
Параметры Xstart, Ystart, Xend, Yend задают координаты начала и конца линии. Параметр Line_width задает ширину линии (один из 8 вариантов, см. описание функции Paint_DrawPoint). Параметр Line_Style задает тип линии:
typedef enum
{
LINE_STYLE_SOLID = 0,
LINE_STYLE_DOTTED,
}LINE_STYLE;
7. Прямоугольник.
void Paint_DrawRectangle(UWORD Xstart,
UWORD Ystart,
UWORD Xend,
UWORD Yend,
UWORD Color,
DOT_PIXEL Line_width,
DRAW_FILL Draw_Fill);
Параметры Xstart, Ystart, Xend, Yend задают координаты начала и конца линии, параметр Color задает цвет. Параметр Line_width задает ширину линии (один из 8 вариантов, см. описание функции Paint_DrawPoint). Параметр Draw_Fill задает заливку прямоугольника:
typedef enum
{
DRAW_FILL_EMPTY = 0,
DRAW_FILL_FULL,
}DRAW_FILL;
8. Окружность, круг.
void Paint_DrawCircle(UWORD X_Center,
UWORD Y_Center,
UWORD Radius,
UWORD Color,
DOT_PIXEL Line_width,
DRAW_FILL Draw_Fill);
Параметры X_Center, Y_Center задают координаты центра, параметр Radius задает радиус, параметр Color задает цвет. Параметр Line_width задает ширину линии (один из 8 вариантов, см. описание функции Paint_DrawPoint). Параметр Draw_Fill задает заливку прямоугольника, так же как в функции Paint_DrawRectangle.
9. Символ текста. Вывод одиночного символа текста в 8-битной кодировке ASCII выполняется функцией Paint_DrawChar.
void Paint_DrawChar(UWORD Xstart,
UWORD Ystart,
const char Ascii_Char,
sFONT* Font,
UWORD Color_Foreground,
UWORD Color_Background);
Параметры Xstart, Ystart задают положение верхнего левого угла выводимого символа. Параметр Ascii_Char задает код символа, параметр Font указывает на начало шрифта в памяти. Параметры Color_Foreground и Color_Background задают соответственно цвет чернил и цвет фона символа.
Всего в библиотеке есть 5 готовых шрифтов:
Имя |
Размер символа (x*y) |
font8 |
5*8 |
font12 |
7*12 |
font16 |
11*16 |
font20 |
14*20 |
font24 |
17*24 |
10. Строка ASCII. Строка текста рисуется относительно левой верхней позиции (параметры Xstart, Ystart).
void Paint_DrawString_EN(UWORD Xstart,
UWORD Ystart,
const char* pString,
sFONT* Font,
UWORD Color_Foreground,
UWORD Color_Background);
Параметр pString указывает на строку текста. Остальные параметры такие же, как у функции Paint_DrawChar.
Строка китайского текста может быть выведена помощью функции Paint_DrawString_CN. Осуществляется вывод китайских символов, основанных на шрифтах ON GB2312 (есть 2 китайских шрифта: font12CN 11*21 ascii, 16*21 Chinese, font24CN:24*41 ascii, 32*41 Chinese).
11. Число.
void Paint_DrawNum(UWORD Xpoint,
UWORD Ypoint,
int32_t Number,
sFONT* Font,
UWORD Color_Foreground,
UWORD Color_Background);
В параметре Number указывается выводимое число. Остальные параметры те же самые, что и функции Paint_DrawString_EN.
12. Время.
void Paint_DrawTime(UWORD Xstart,
UWORD Ystart,
PAINT_TIME* pTime,
sFONT* Font,
UWORD Color_Background,
UWORD Color_Foreground);
В параметре pTime задается указатель на выводимое время. Остальные параметры те же самые, что и функции Paint_DrawString_EN.
13. Растровая картинка. В параметре image_buffer указывается начальный адрес буфера в памяти, где расположены данные выводимая картинка.
void Paint_DrawBitMap(const unsigned char* image_buffer);
14. Вывод файла BMP. Linux-платформы наподобие Jetson Nano и Raspberry Pi поддерживают непосредственную обработку и вывод картинок в файлах формата BMP.
UBYTE GUI_ReadBmp(const char *path, UWORD Xstart, UWORD Ystart);
В параметре path указывается полное имя файла картинки, параметры Xstart, Ystart задают положение верхнего левого угла отображаемой картинки.
[Тестирование функций]
Примеры кода, реализующего вывод на экран, можно найти в каталоге RaspberryPi&JetsonNano\c\examples. Следует модифицировать определения в модуле main.c, чтобы можно было работать с различными типами индикаторов e-Paper.
int main(void)
{
// Обработка исключения: Ctrl + C
signal(SIGINT, Handler);
// EPD_1in02d_test();
// EPD_1in54_test();
// EPD_1in54_V2_test();
// EPD_1in54b_test();
// EPD_1in54c_test();
// EPD_2in7_test();
// EPD_2in7b_test();
// EPD_2in9_test();
// EPD_2in9bc_test();
// EPD_2in9d_test();
// EPD_2in13_test();
// EPD_2in13_V2_test();
// EPD_2in13bc_test();
// EPD_2in13d_test();
EPD_4in2_test();
// EPD_4in2bc_test();
// EPD_5in83_test();
// EPD_5in83bc_test();
// EPD_7in5_test();
// EPD_7in5_V2_test();
// EPD_7in5bc_test();
// EPD_7in5bc_V2_test();
return 0;
}
Например, если Вы хотите проверить вывод на индикатор 7.5inch E-paper, нужно раскомментировать строку:
Затем скомпилируйте и запустите код:
make clean
make
sudo ./epd
Аналогичный пример кода для STM32 находится в каталоге STM32\STM32-F103ZET6\User\Examples. Откройте в Keil проект STM32\STM32-F103ZET6\MDK-ARM\epd-demo.uvprojx, измените определения в файле main.c для выбора нужно типа индикатора. Далее расскомментируйте нужную строку теста, скомпилируйте и запустите код.