Вывод картинки на TFT дисплей c SD карты на примере SSD1289( преобразование картинки в массив)

Вывод картинки на TFT дисплей c SD карты на примере SSD1289( преобразование картинки в массив)

В прошлых статьях мы разбирались с TFT дисплеем и резистивной панелью, для того чтобы освоить все возможности, которые предоставляет модуль, давайте попробуем подключить карту памяти. А именно записать на SD карту картинку и вывести её на дисплей. Забегая немного вперёд, скажу, что размер бинарника картинки получился 150К, размер флэша Atmega16 – 16K, а размер оперативки 1K, поэтому как бы мы ни старались, картинку в этот микроконтроллер загрузить не получиться.

Для работы с картой памяти на колодку выведены следующие выводы:
SD_DO – чтение/запись данных.
SD_SCK – линия тактирования.
SD_DIN – запись/чтение данных.
SD_CS – активация SD карты, flash-память при этом должна быть дезактивирована.
Из названия выводов становится понятно, что карта управляется по SPI (положительный синхроимпульс, защёлкивание по переднему фронту, сдвиг по заднему фронту).
Также на плате есть площадка для припаивания 16Мб чипа памяти.
F_CS – активация flash-памяти, SD-карта при этом должна быть дезактивирована.
 
Для того чтобы вывести на TFT дисплей картинку, надо преобразовать её в массив, где каждое значение массива кодирует цвет, соответствующего пикселя, в формате B5G6R5.
Для преобразования воспользуемся программой, которая называется lcd-image-converter, скачать её можно тут.
Итак начнём, после установки программы открываем картинку, которую хотим преобразовать(файл→открыть), затем заходим в меню настройки и выбираем пункт преобразование.
Устанавливаем в пункте предустановка формат R5G6B5, и открываем вкладку подготовка. Тип изображения — цветное, основное сканирование — сверху вниз, сканирование линий — прямое.
Вывод картинки на TFT дисплей c SD карты на примере SSD1289( преобразование картинки в массив)

Открываем вкладку матрица и так, как у нас формат B5G6R5, с помощью сдвигов меняем R5 и B5 местами.
Вывод картинки на TFT дисплей c SD карты на примере SSD1289( преобразование картинки в массив)

Дальше открываем вкладку изображение, в поле префикс и разделитель всё удаляем, в выпадающем списке блок данных выбираем 16 бит, порядок байт выбираем Big-Endian
Вывод картинки на TFT дисплей c SD карты на примере SSD1289( преобразование картинки в массив)

На самом деле порядок байт у 8-битных AVR Low-Endian, но заработало именно так, позже буду разбираться почему. Если выбрать Low-Endian, то изображение получится как будто в негативе.
Порядок байт, определяет как данные буду храниться в памяти, это видно на картинке ниже.
Вывод картинки на TFT дисплей c SD карты на примере SSD1289( преобразование картинки в массив)

Открываем вкладку шрифт и выставляем кодировку.
Вывод картинки на TFT дисплей c SD карты на примере SSD1289( преобразование картинки в массив)

Теперь если нажать предпросмотр увидим во, что преобразуется наша картинка.
Вывод картинки на TFT дисплей c SD карты на примере SSD1289( преобразование картинки в массив)
Нажимаем кнопку "сохранить как", вводим новое название предустановки.
Вывод картинки на TFT дисплей c SD карты на примере SSD1289( преобразование картинки в массив)

Далее, для сохранения настроек нажимаем кнопку "ОК" в правом нижнем углу и во вкладке файл выбираем пункт преобразовать, программа сгенерирует файл с расширением .С, в котором храниться массив.
Вывод картинки на TFT дисплей c SD карты на примере SSD1289( преобразование картинки в массив)

Если взять микроконтроллер с большей памятью и загрузить в него этот массив, то компилятор сделает из него бинарник, но так, как мы будем передавать данные с карточки частями, эту работу вместо компилятора должны сделать мы.
Создаём файл с расширением txt, копируем туда содержимое массива и удаляем все лишние пробелы, для этого можно воспользоваться Gvim, скачать его можно тут. Открываем файл и видим, что сначала каждой строки 4 пробела нам их надо удалить, нажимаем двоеточие(shift+;), чтобы перейти в командный режим и набираем
:%s/4_пробела //g
Вывод картинки на TFT дисплей c SD карты на примере SSD1289( преобразование картинки в массив)

Давайте рассмотрим подробнее, что делает эта команда. С помощью ключа s(substitute), осуществляется поиск и замена, общий вид команды выглядит следующим образом.
:{пределы}s/{что заменяем}/{на что заменяем}/{опции}
Теперь давайте разберём, что мы написали.
% — выполнить команду во всех строках, “от первой до последней строки”
g —  от слова global, для замены каждого вхождения во всех строках
Тогда команда :%s/4_пробела//g можно трактовать следующим образом, в каждой строке, от начала и до конца заменить 4 пробела пустым местом. Заменить все пробелы, не гадая 4 их там или 5, можно специальной командой
:%s/ $*//g
но её нашёл под конец написания статьи.
Вывод картинки на TFT дисплей c SD карты на примере SSD1289( преобразование картинки в массив)

С помощью команды wqa сохраняем файл и закрываем Gvim.
Теперь файл подготовлен для преобразования в бинарник. Конвертировать в бинарник будем тоже с помощью Gvim, для конвертирования запускаем командную строку и перемещаемся туда где установлен Gvim, далее во внутренних папках находим файл xxd.exe и уже от туда выполняем следующую команду
xxd. exe -r -ps (путь1)picture.txt (путь2)picture.bin
Вывод картинки на TFT дисплей c SD карты на примере SSD1289( преобразование картинки в массив)

Теперь у нас есть бинарник, который нужно записать на SD карту, предварительно отформатировав её в FAT16. 

Не так давно появилась возможность преобразовывать hex в bin средствами программы lcd-image-converter, что значительно облегчило задачу. Для этого, кроме тех настроек, которые делали мы, дополнительно надо создать текстовый файл с приведенным ниже кодом.

$(start_block_images_table)
le
uint16 $(out_image_width)
uint16 $(out_image_height)
uint16 $(out_blocks_count)
uint$(img_data_block_size) $(out_image_data)
$(end_block_images_table)

И выбрать этот файл во вкладке шаблоны.
Вывод картинки на TFT дисплей c SD карты на примере SSD1289( преобразование картинки в массив)

Ещё надо поменять Big-Endian на Low_Endian, в поле префикс написать и в качестве разделителя указать пробел.
Вывод картинки на TFT дисплей c SD карты на примере SSD1289( преобразование картинки в массив)

Дальше всё как обычно, файл→преобразовать, сгенерированный файл будет иметь следующий вид.
Вывод картинки на TFT дисплей c SD карты на примере SSD1289( преобразование картинки в массив)

Запускаем командную строку и перемешаемся в папку где находится lcd-image-converter.exe, от туда выполняем следующую команду
lcd-image-converter --mode=hex2bin --input=(путь1)file.c --output=(путь2)file.bin
В результате мы получим бинарник, надо сказать, что такой способ гораздо удобней потому, что всё преобразование делается средствами одной программы.
В следующей статье мы выведем эту картинку на дисплей. Исходную картинку и получившийся бинарник можно скачать в архиве.picture.rar [265,74 Kb] (cкачиваний: 211).
комментарии
14