TFT shield 2.4.Предназначен для Arduino,контролер ILI9325.Подключение по 8-ми битной шине.
В прошлой статье мы поключали даный LCD к STM32L.Сейчас-же остановимся на вопросе подключения дисплея к микроконтролеру Atmega32.
За основу взяты те-же примеры ,что и в предыдущей статье.Библиотека была подправлена, в плане перехода на Atmega32.
Подключение .Пины прописываются в файле TFT_lcd.h :
//шина управления
#define LCD_CS_BIT PC2
#define LCD_RS_BIT PC3
#define LCD_WR_BIT PC4
#define LCD_RD_BIT PC5
#define LCD_REST_BIT PC6
#define LCD_CLT_PORT PORTC
#define LCD_CLT_PIN PINC
#define LCD_CLT_DDR DDRC
//шина данных
#define DATA_H PA0
#define LCD_DATA_PORT PORTA
#define LCD_DATA_DDR DDRA
#define LCD_DATA_PIN PINA
#define LCD_DATA_IN DDRA = 0x00
#define LCD_DATA_OUT DDRA = 0xFF
Кварц на 16 МГц,с обвязкой конденсаторами на 22 pF.Дисплей ,запитка как 3,3 В.так и 5 В.Микроконтролер Atmega32 установлен на самодельной отладочной плате.Я использовал бутлоадер ,позволяющий заливать прошивку, посредством програмы Khazama AVR Programer через USB.
Сразу хочу предупредить,что я не такой-уж большой спец в програмировании,скорей самоучка (моя основная работа - энергетика,микроконтролеры - это хобби,так сказать для души).Поэтому попытаюсь обяснить своими словами...
И так, "курим" дататиш на ILI9325.Смотрим диаграмму.Условно разделяем "Write to register" на две части - адрес и данные.
Чтение и запись регистра в 8-ми битном режиме:
Отсюда и получаются функции void LCD_WriteComand(uint32 regID) и void LCD_WriteData(uint32 data) .
/*********************************************************************************************************
** Function name: LCD_WriteComand
** Descriptions: выберите регистр
** input parameters: адрес регистра RegID
*********************************************************************************************************/
///////////////////////////////////////////////////////////////////////////////////////////////////////
// nCS ----\__________________________________________/--------------------------- //
// RS ------\______________________________/------------------------------------ //
// nRD ---------------------------------------------------------------------------- //
// nWR --------\______/----------\_____/------------------------------------------- //
// DB[10:17] ----[????8?]-----[????8?]-------------------------------------------//
////////////////////////////////////////////////////////////////////////////////////////////////////////
void LCD_WriteComand(uint32 regID)
{
LCD_CS_L;
LCD_RS_L;
LCD_RD_H;
LCD_WR_H;
LCD_DATA_PORT = regID>>8;
LCD_WR_L;
LCD_WR_H;
LCD_DATA_PORT = regID;
LCD_WR_L;
LCD_WR_H;
LCD_RS_H;
LCD_CS_H;
}
/*********************************************************************************************************
** Function name: LCD_WriteData
** Descriptions: запись данных на ЖК-дисплее
** input parameters: записываемые данные
*********************************************************************************************************/
////////////////////////////////////////////////////////////////////////////////////////////////////
// nCS ----\__________________________________________/-----------------------------//
// RS -----------------------------------------------------------------------------//
// nRD ------------------------------------------------------------------------- //
// nWR --------\______/--------\_____/----------------------------------------- //
// DB[10:17] -----[???8?]----- [???8?]------------------------------------------- //
/////////////////////////////////////////////////////////////////////////////////////////////////////
void LCD_WriteData(uint32 data)
{
LCD_CS_L;
LCD_RS_H;
LCD_RD_H; // *****
LCD_DATA_PORT = data>>8;
LCD_WR_L;
LCD_WR_H;
LCD_DATA_PORT = data;
LCD_WR_L;
LCD_WR_H;
LCD_CS_H;
}
Далее полная функция записи данных в регистр дисплея void LCD_WriteReg(uint32 regID, uint32 regData) :
/*********************************************************************************************************
** Function name: LCD_WriteReg
** Descriptions: записать данные в регистр
** input parameters: адрес регистра: RegID,данные должны быть записаны regData
*********************************************************************************************************/
////////////////////////////////////////////////////////////////////////////////////////////////////
// nCS ----\_____________________________________________________________/--------//
// RS ----\____________________________/-----------------------------------------//
// nRD ------------------------------------------------------------------------- //
// nWR ------\______/--------\_____/--------\______/-----\______/---------------- //
// DB[10:17] ---[????8?]---[????8?]---[???8?]----[???8?]--------------- //
/////////////////////////////////////////////////////////////////////////////////////////////////////
void LCD_WriteReg(uint32 regID, uint32 regData)
{
LCD_CS_L; // *****
LCD_RS_L;
LCD_RD_H; // *****
LCD_WR_H; // *****
LCD_DATA_PORT = regID>>8;
LCD_WR_L;
LCD_WR_H;
LCD_DATA_PORT = regID;
LCD_WR_L;
LCD_WR_H;
LCD_RS_H;
LCD_DATA_PORT = regData>>8;
LCD_WR_L;
LCD_WR_H;
LCD_DATA_PORT = regData;
LCD_WR_L;
LCD_WR_H;
LCD_CS_H;
}
Еще одна из "основных" функций - функция инициализации void LCD_ILI9325_Init(void) .Здесь можно прописать и ориентацию дисплея,подробнее в исходниках.
Есть подозрения ,что если внести соответствующие корективы в этой функции,появится возможность работать со следующими дисплеями ( https://elty.pl/pl/n/3 ) :
Device Code | Kontroler | Wyświetlacz |
0x9320 | ILI9320 | |
0x9325 | ILI9325 | |
0x9328 | ILI9328 | |
0x9331 | ILI9331 | |
0x8999 | SSD1298 | |
0x8989 | SSD1289 | ITDB02-3.2S, HY32D |
0x7783 | ST7781 | |
0x4531 | LGDP4531 | |
0x5408 | SPFD5408B | |
0x1505 0x0505 | R61505U | |
0x0046 | HX8346A | |
0x0047 | HX8347D | |
0x0047 | HX8347A | |
0x4535 | LGDP4535 | |
0x9919 | SSD2119 | |
0x0052 | HX8352-A | ITDB02-3.2WD |
0x1121 | S1D19122 | ITDB02-2.4E |
Во всяком случае ILI9325 ,ST7781 ,SPDF5406 - очень похожи.Но я не проверял,поскольку есть в наличии только ILI9325.
Самое прикольное, что есть возможность симуляции в Proteus.На kazus.ru/forums в посте #1653 человек под ником MONIKYS выложил ,вполне работоспособную модель под Протеус,за что ему конечно большое СПАСИБО.
Хочу предупредить, что в любом случае нужно все проверять в реальном МК.Было замечено что в процесе отладки, прошивка работающая в Протеусе,в реальном "камне" не работала.Но отладить графику вполне сгодится.
Модель ILI9325 для Proteus - http://radiomanoff.at.ua/load/models/1-1-0-29
Проект для AVRStudio 4 и Proteus 7 - http://radiomanoff.at.ua/load/ili9325_atmega32/1-1-0-28
Полезные ссылки :
- http://blog.csdn.net/jianqi2010/article/details/7459350 ;
- http://pastebin.com/wbn9Eqpx ;
Форум - http://radiomanoff.at.ua/forum/4-1-1.