AVR Урок 34. Дисплей TFT 240×320 8bit. Часть 1

 

 

 

 

Урок 34

Часть 1

 

Дисплей TFT 240×320 8bit

 

 

Сегодня мы вернёмся к Atmega8, так как что-то у меня случилось с моей Atmega328. Но для наших задач нам вполне подойдёт и восьмая серия.

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

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

Вот перечень режимов подключения

 

image00

 

Включить тот или иной режим удаётся благодаря упралению уровнем на ножках IM3:IM0.

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

Судя по технической документации, контроллер ILI9341 может управлять 262000 разновидностями цветов.

Вот схема подключения дисплея к контроллеру

 

image01_0500

 

А вот так схема выглядит на практике

 

image02

 

Мы видим также простенький стабилизатор, висящий на проводках, состоящий из микросхемы и конденсатора. Данный стабилизатор служит для подачи питания 3,3 вольта на модуль дисплея, так как такое напряжение для него также требуется. Некоторую информацию, возвращённую из контроллера дисплея мы будем отслеживать с помощью символьного дисплея 20х4, подключенного по интерфейсу i2c, который также мы видим на картинке.

А вот так выглядит модуль дисплея снизу

 

image03

 

Мы видим ещё на борту данного модуля картоприёмник для карты 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 2.0

Дисплей LCD 20×4

 

 

Смотреть ВИДЕОУРОК (нажмите на картинку)

 

AVR Дисплей TFT 240×320 8bit

9 комментариев на “AVR Урок 34. Дисплей TFT 240×320 8bit. Часть 1
  1. Роман:

    Добрый день. Есть экран HX8347 у него включение 8bit режима совсем по другому на IM3-IM0 0001 В Вашем коде где это можно изменить?

    • А зачем же менять в моём коде? Напишите свой. Ну, хотя, даже если и измените, авторство никакое не предъявлю. Так что дерзайте!

  2. Murz0id:

    Не могли бы Вы дать ссылку, на магазин, в котором покупали дисплей 320х240 ?

  3. Игорь:

    Здравствуйте.
    У меня tft c CD с маркирокой 3.97 для uno.
    Проверен на uno с MCUFRIEND_kbv-2.9.7.
    Работает,считывает bmp с cd,пишет ID-7793.
    Подскажите какой у него может быть контроллер,
    и возможно ли его использовать в вашем проекте.

    спасибо за внимание

  4. Игорь:

    Здравствуйте!
    подскажите пожалуйста как программно развести шину DATA_PORT с
    использованием #define на два порта: B,D для UNO
    СПАСИБО.

  5. Anrey:

    Автор урока на расписал какие ноги куда подключать

    На случай вопроса подключения у кого-то смотреть эту таблицу
    |_____________|
    |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 |
    |_____________|

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*