Урок 34
Часть 1
Дисплей TFT 240×320 8bit
Сегодня мы вернёмся к Atmega8, так как что-то у меня случилось с моей Atmega328. Но для наших задач нам вполне подойдёт и восьмая серия.
Сегодня мы попробуем подключить к нашему контроллеру дисплей уже графический цветной разрешением 320 на 240 точек, управляемый по восьмибитному параллельному интерфейсу, Дисплей выполнен с помощью модуля и управляется контроллером ILI9341.
Вообще, у данного контроллера дисплея существует несколько режимов подключения к управляющему микроконтроллеру, в том числе есть и SPI, но мне попался дисплей именно с параллельным способом подключения, о чём я нисколько не жалею. С таким интерфейсом также немало дисплеев, но что обидно, очень мало информации по реализации кода для дисплеев именно с таким интерфейсом. Поэтому наша задача – данный информационный пробел устранить на корню.
Вот перечень режимов подключения
Включить тот или иной режим удаётся благодаря управлению уровнем на ножках IM3:IM0.
Наш режим, которым мы будем пользоваться — самый первый. Чтобы его включить, нужно на всех данных ножках инициировать низкоуровневой сигнал.
Судя по технической документации, контроллер ILI9341 может управлять 262000 разновидностями цветов.
Вот схема подключения дисплея к контроллеру
А вот так схема выглядит на практике
Мы видим также простенький стабилизатор, висящий на проводках, состоящий из микросхемы и конденсатора. Данный стабилизатор служит для подачи питания 3,3 вольта на модуль дисплея, так как такое напряжение для него также требуется. Некоторую информацию, возвращённую из контроллера дисплея мы будем отслеживать с помощью символьного дисплея 20х4, подключенного по интерфейсу i2c, который также мы видим на картинке.
А вот так выглядит модуль дисплея снизу
Мы видим ещё на борту данного модуля картоприёмник для карты Micro SD, которая подключается по интерфейсу SPI.
Также мы видим, что все контакты у дисплея подписаны, поэтому с подключением, я думаю сложностей не возникнет.
Первые снизу справа четыре ножки служат для того, чтобы общаться с картой памяти, поэтому они у нас свободные. Используем мы следующие ножки дисплея:
LCD_RST — ножка для перезагрузки дисплея;
LCD_CS — Chip Select (выбор), активный уровень низкий;
LCD_RS — данные/команда, для передачи данных высокий уровень, для передачи команды — низкий;
LCD_WR — включение режима записи, активный уровень низкий;
LCD_RD — включение режима чтения, активный уровень низкий;
GND — общий провод;
5V — питание 5 вольт;
3V3 — питание 3,3 вольта;
LCD_D0:LCD_D7 — параллельная 8-разрядная шина данных.
Управление контроллером дисплея происходит посредством команд или другими словами отправкой в определённый регистр определённых величин. В технической документации очень подробно расписаны все регистры, причём есть и краткий перечень команд регистров, а есть и подробный для каждой команды. Техническая документация на контроллер ILI9341 прикреплена внизу данной страницы. Сначала мы отправляем адрес регистра, а затем шлём параметры команды. Причём количество параметров в различных командах также различается, что накладывает некоторые трудности для создания универсальной функции отправки команды. Но ничего, что-нибудь придумаем.
У нас создан проект TFT9341. Проект вполне стандартный, подключены к нему наши библиотек, написанные на прошлых занятиях – это twi и lcdtwi.
Также мы создадим и подключим к проекту ещё 2 файла для библиотеки уже непосредственно нашего нового дисплея – это файлы ili9341.h и ili9341.c.
Вот так выглядит главный заголовочный файл main.h
#ifndef MAIN_H_
#define MAIN_H_
#define F_CPU 16000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <avr/pgmspace.h>
#include «twi.h»
#include «lcdtwi.h»
#include «ili9341.h»
#endif /* MAIN_H_ */
В файле ili9341.h подключим
#ifndef ILI9341_H_
#define ILI9341_H_
#include <stdlib.h>
#include <string.h>
#include «main.h»
#include «twi.h»
#include «lcdtwi.h»
Ну и, как вы все знаете, чтобы любой дисплей подключить и его заставить что-то показывать, необходимо пройти определённую процедуру инициализации. По большому счёту это относится не только к дисплеям.
В файле ili9341.c подключим заголовочный файл и напишем каркас для функции инициализации дисплея
#include «ili9341.h»
//—————————————————————
void TFT9341_ini(void)
{
}
Не забываем на данную функцию добавить прототип в хедер-файле, а также напишем некоторые макроподстановки, которые нам потребуются в процессе работы с дисплеем
#include «lcdtwi.h»
#define swap(a,b) {int16_t t=a;a=b;b=t;}
#define DATA_DDR DDRD
#define DATA_PORT PORTD
#define DATA_PIN PIND
#define COMMAND_DDR DDRB
#define COMMAND_PORT PORTB
#define LCD_CS 2//Chip Select
#define LCD_CD 1//Command/Data
#define LCD_WR 3//LCD Write
#define LCD_RD 4//LCD Read
#define LCD_RESET 0//LCD Reset
#define RESET_IDLE COMMAND_PORT|=(1<<LCD_RESET)
#define CS_IDLE COMMAND_PORT|=(1<<LCD_CS)
#define WR_IDLE COMMAND_PORT|=(1<<LCD_WR)
#define RD_IDLE COMMAND_PORT|=(1<<LCD_RD)
#define RESET_ACTIVE COMMAND_PORT&=~(1<<LCD_RESET)
#define CS_ACTIVE COMMAND_PORT&=~(1<<LCD_CS)
#define WR_ACTIVE COMMAND_PORT&=~(1<<LCD_WR)
#define RD_ACTIVE COMMAND_PORT&=~(1<<LCD_RD)
#define CD_COMMAND COMMAND_PORT&=~(1<<LCD_CD)
#define CD_DATA COMMAND_PORT|=(1<<LCD_CD)
#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0x0F800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF
#define setReadDir() DATA_DDR=0x00
#define setWriteDir() DATA_DDR=0xFF
#define WR_STROBE {WR_ACTIVE;WR_IDLE;}
void TFT9341_ini(void);
#endif /* ILI9341_H_ */
Я думаю, назначение каждого макроса объяснять нет смысла, так как всё ясно из наименований. Но если вдруг кому-то что-то непонятно, то посмотрите видеоурок, кликнув по картинке внизу страницы, там объяснение более подробное.
В следующей части нашего занятия мы попытаемся написать ещё некоторые важные функции для работы с контроллером дисплея, а также считать его идентификатор, что позволит нам убедиться, что мы работаем именно с таким контроллером.
Предыдущий урок Программирование МК AVR Следующая часть
Техническая документация на контроллер дисплея ILI9341
Программатор, символьный дисплей LCD 20×4 и переходник для него можно приобрести здесь:
Программатор USBASP USBISP с адаптером USBASP USBISP 3.3 с адаптером
Смотреть ВИДЕОУРОК (нажмите на картинку)
Добрый день. Есть экран HX8347 у него включение 8bit режима совсем по другому на IM3-IM0 0001 В Вашем коде где это можно изменить?
А зачем же менять в моём коде? Напишите свой. Ну, хотя, даже если и измените, авторство никакое не предъявлю. Так что дерзайте!
Не могли бы Вы дать ссылку, на магазин, в котором покупали дисплей 320х240 ?
Я бы дал, но ссылка уже не существует. И искал такие дисплеи, не попадаются нигде, либо 16-битные, либо SPI.
Здравствуйте.
У меня tft c CD с маркирокой 3.97 для uno.
Проверен на uno с MCUFRIEND_kbv-2.9.7.
Работает,считывает bmp с cd,пишет ID-7793.
Подскажите какой у него может быть контроллер,
и возможно ли его использовать в вашем проекте.
спасибо за внимание
Здравствуйте! может быть какой угодно контроллер. Есть какая-то библиотека к ардуино, помогающая определить его тип. Но сейчас я уже не помню какая.
спасибо.
Здравствуйте!
подскажите пожалуйста как программно развести шину DATA_PORT с
использованием #define на два порта: B,D для UNO
СПАСИБО.
Автор урока на расписал какие ноги куда подключать
На случай вопроса подключения у кого-то смотреть эту таблицу
|_____________|
|STM ->LCD |
|_____________|
|3V ->3V3 |
|5V ->5V |
|GND ->GND |
|PD4 ->LCD_RD |
|PD5 ->LCD_WR |
|PD6 ->LCD_RST|
|PD7 ->LCD_CS |
|PD11->LCD_RS |
|_____________|
|PD14->LCD_D0 |
|PD15->LCD_D1 |
|PD0 ->LCD_D2 |
|PD1 ->LCD_D3 |
|PE7 ->LCD_D4 |
|PE8 ->LCD_D5 |
|PE9 ->LCD_D6 |
|PE10->LCD_D7 |
|_____________|
Здравствуйте, а почему нет негативных комментариев? Вы их удаляете?
Здравствуйте!
А Вы с какой целью интересуетесь?
Если честно, то удаляю комментарии, в которых есть сторонние ссылки, нецензурные слова, разжигание национальной розни, призывы к насилию, религиозному превосходству и т.д. Вы такие хотите увидеть комментарии? Думаю, если они будут, то тогда будет жалоба со стороны надзорных служб моему хостодателю и сайт будет эффективно удалён и домен занесен в черный список.
А если Вы про комментарии, что я что-то не так сделал, и также, что где-то допустил ошибку, либо как-то неполно изложил материал, я, конечно их не удаляю. И прислушиваюсь к любой критике, а также устраняю ошибки. Вы, видимо, не все комментарии читали.
Вот народ… Человек старается, разжевывает, а им негативные коменты подавай.
Здравствуйте!
Искал на сайте информацию по подключению OLED дисплея SSD1306 к AVR, но что то не нашел, хотя дисплейчик весьма популярен. В разделе SPI и I2C смотрел. Ткните пальцем, пожалуйста. Либо я не там ищу, либо автор почему то обошел его стороной.
Заранее спасибо!
Скачал исходный код в седьмой части, попробовал в протеусе, после сменяющихся цветных прямоугольников — черный экран и все. Символьный дисплей молчит. Я ожидал увидеть последний скриншот из части 7 с выводом нулей и единиц.
У всех так или только у меня?