Четвер, 25.04.2024, 09:39
Приветствую Вас Гість | RSS

Radiomanoff+

Меню сайта
Форма входа
Календарь
«  Квітень 2024  »
ПнВтСрЧтПтСбНд
1234567
891011121314
15161718192021
22232425262728
2930

TFT-shield (2.4) & Atmega32

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 7http://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.

 

Архив записей
Статистика

Онлайн всього: 1
Гостей: 1
Користувачів: 0