Довелось тут в одном проекте поработать с графическим дисплеем RDX0120 днепропетровской фирмы "Гамма". Сам дисплей достаточно дешевый - около 3$. Во всех дисплеях RDX0032, RDX0048, RDX0077, RDX0120, RDX0154 встроен графический контроллер UC1601s.

Связь с контроллером осуществляется по шине I2C. Скорость I2С может быть до 400 кГц, что даже при неоптимальных алгоритмах, позволяет быстро отрисововать текст и изображения.

За основу библиотеки я взял код Геннадия Чернова, который разработал библиотечку для PIC. Я перепилил минимальный набор необходимых мне функций, среди которых: очистка дисплея и заполнение его черным/белым/серым цветом, вывод строк шрифтов включая кириллические строки в кодировке СР1251, черный по белому или инверсный, рисование простых линий с разными типами линий, прямоугольников с прямыми и скругленными углами и установкой ширины линии.

Собственно примерчик с библиотекой для STM32 вот: stm32_uc1601s. Вот немного документации по RDX0120 и контроллеру: datasheets . 

Подключение дисплейчика достаточно простое:

rdx120_conn.jpg

Отладка выполнялась на STM32VLDiscovery (чип STM32F100RBT6). Линии подключены следующим образом:

  • RST - PC0
  • SCK - PB6
  • SDA - PB7
  • GND
  • VCC

Для инициализации библиотеки используется функция LCD_init().

Вот некоторые примеры:

Строка шрифтом 10х15 в позиции (0, 0), без инверсии

LCD_string("10x15", 0, 0, FONT_TYPE_10x15, INVERSE_TYPE_NOINVERSE);

rdx120_10x15.jpg

Строка шрифтом 5х8 в позиции (0, 0), без инверсии

LCD_string("5x8", 0, 0, FONT_TYPE_5x8, INVERSE_TYPE_NOINVERSE);

rdx120_5x8.jpg

Строка шрифтом 5х15 в позиции (0, 0), без инверсии

LCD_string("5x15", 0, 0, FONT_TYPE_5x15, INVERSE_TYPE_NOINVERSE);

rdx120_5x15.jpg

Строка шрифтом 10х8 в позиции (0, 0), без инверсии

LCD_string("10x8", 0, 0, FONT_TYPE_10x8, INVERSE_TYPE_NOINVERSE);

rdx120_10x8.jpg

Строка шрифтом 5х8 в черном прямоугольнике с инверсией

char *string = "5x8i";
LCD_rect(LINE_TYPE_BLACK, ANGLE_TYPE_ROUNDED, 1, FILL_TYPE_BLACK, 8, 8,
      tool_strlen(string) * 6 + 5, 13); //tool_strlen(string) * 6 + 5 - calculate rect width for place str
LCD_string("5x8i", 10, 10, FONT_TYPE_5x8, INVERSE_TYPE_INVERSE);

rdx120_5x8_inrect(1).jpg

Несколько прямоугольников 20х10 разного типа

LCD_rect(LINE_TYPE_BLACK, ANGLE_TYPE_RECT, 1, FILL_TYPE_TRANSPARENT, 2, 2, 20, 10);
LCD_rect(LINE_TYPE_BLACK, ANGLE_TYPE_ROUNDED, 1, FILL_TYPE_TRANSPARENT, 8,  8, 20, 10);
LCD_rect(LINE_TYPE_DOT, ANGLE_TYPE_RECT, 1, FILL_TYPE_WHITE, 14, 14, 20, 10);
LCD_rect(LINE_TYPE_BLACK, ANGLE_TYPE_RECT, 1, FILL_TYPE_GRAY, 20, 20, 20,  10);

rdx120_rect(1).jpg

Заполнение вертикальными линиями через 2 пикселя:

uint8_t j;
for (j = 0; j <= LCD_WIDTH; j = j + 3) {
  LCD_line(LINE_TYPE_BLACK, j, 0, j, LCD_HEIGHT - 1);
}

rdx120_vertlines(1).jpg

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