TFT 3,5" и Ардуино

romeo_b
Offline
Зарегистрирован: 08.11.2013

[quote=Araris]

Задам-ка я свой вопрос в этой теме..

Суть вопроса : имеется LCD Display Module TFT 3.95 inch на контроллере ili9488, вот такой

Читать тач, писать/рисовать на нем я уже умею, нет проблем. А вот научиться программно управлять подсветкой - ну никак ((.

 

֑֖Поделитесь пожалуста  библиотекой и скетчем, а  то я  уже  3 дня  сижу и не могу запустить  данный дисплей֭

switch
Offline
Зарегистрирован: 07.12.2015

на пятой вроде странице была сборка готовая под этот экран. У меня завелось.

diger67
Offline
Зарегистрирован: 25.07.2015

romeo_b пишет:

Читать тач, писать/рисовать на нем я уже умею, нет проблем. А вот научиться программно управлять подсветкой - ну никак ((.

֑֖Поделитесь пожалуста  библиотекой и скетчем, а  то я  уже  3 дня  сижу и не могу запустить  данный дисплей֭

Если я правильно понял вы запустили дисплей и благополучно залили стандартные скетчи. Что касается управления подсветкой, на данном шилде без скальпеля не получится. Подсветка питается от 5В ардуино через стабилизатор 3.3В.

Araris
Offline
Зарегистрирован: 09.11.2012

romeo_b, у меня завелся вот с этими библиотеками : https://www.dropbox.com/s/5j2ned9tmfl7rhq/ILI9488_Libs.zip?dl=0

С подсветкой так ничего и не получилось.

romeo_b
Offline
Зарегистрирован: 08.11.2013

Спасибо
счас   попробую  еще раз

кажись уже такую ставил 

 скорее всего не работает дисплей

 

diger67
Offline
Зарегистрирован: 25.07.2015

Вижу единственное решение с подсветкой.

1. Выпаеввем на шилде стаб 3.3В

2. делаем платку на нем с ключем

3. добавляем в скетч PINOUT и функцию ON/OFF BL

4. подключаем собранную схему на контакты удаленного стабилизатора, базу ключа на PINOUT

Радуемся включая и отключая подсветку. Другого способа не вижу.

Немного поправил библиотеку, теперь при работе с ili9488 можно явно указывать чип, раньше надо было указывать ili9341, с целью избавления от мерцания, при инициализации ili9488 устанавливается частота фрэйма 100 Гц. Ну и добавил функции ухода в слип и отключения чипа, а такжк выхода из этих режимов. Это может пригодится при реализации отключения подсветки и для скрытия процесса отрисовки экрана. Правда при этом изображение будет исчезать на N time требуемое на отрисовку фрэйма. На stm32 72МГц это при 320х480 около 0.5 - 0.6 сек, очень заметно для глаза, буду дальше совершенствовать данную либу. Вижу один вариант, создавать фрэйм в буфере RAM а потом перегонять его в TFT. Но это совсем другая история.

http://178.130.34.198/adafruit/adafruit_correct.rar

switch
Offline
Зарегистрирован: 07.12.2015

Товарищи, кто-нить  знает как перевернуть изображение вверх ногами? Просто у моего дисплея углы обзора такие, что при расположении на стене на уровне груди ничо видно не будет. Только если его на высоте двух метров поставить - будет нормально видно ;)

alexmanson
Offline
Зарегистрирован: 12.12.2015

switch пишет:

Товарищи, кто-нить  знает как перевернуть изображение вверх ногами? Просто у моего дисплея углы обзора такие, что при расположении на стене на уровне груди ничо видно не будет. Только если его на высоте двух метров поставить - будет нормально видно ;)

Ищи в файле инициализации дисплея регистр Memory Access Control по адресу 0x36 (если про ILI9488 идет речь) старшие три бита MY, MX, MV отвечают за направление отрисовки графики из памяти на дисплей. Я сам не ардуинщик, но библиотеками не брезгую попользоваться. Возможно в библиотеке есть какая-нибудь функция Rotation, она наверняка эти биты меняет и в дальнейшем во всех функциях отрисовки графики учитываются все направления.

 

slider
Offline
Зарегистрирован: 17.06.2014

там картинка с  регистра 36h

http://arduino.ru/forum/apparatnye-voprosy/35-tft-lcd-krasnyi-megovskii-mega-2560-r3-resheno-kak-reshit-drugie

в используемой  инициализации ищите LCD_Write_COM(0x36); и изменяете после него в DATA  

LCD_Write_COM(0x36);  
LCD_Write_DATA(0b10001000); // было 0x48 0b01001000  , чтобы перевернуть надо  0x88 0b10001000

и перебираете биты Mirror..   0 и 1 по всякому , пока не получите как вы хотите.

Есть еще системный регистр, можно в нём, но в 36h проще

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

diger67, прошу помощи с STM32 и ILI9488 по FSMC. У Вас же есть код инициализации?)

switch
Offline
Зарегистрирован: 07.12.2015

alexmanson, slider Спасибо большое, я попробую!

dovakin
Offline
Зарегистрирован: 05.01.2016

Всем доброго времени суток.Подскажите невежде что за экран мне достался и можно ли его прикрутить к меге 2560?http://ru.aliexpress.com/item/free-shipping-3-2-TFT-LCD-Module-Display-Touch-Panel-PCB-adapter-wholesale-price/580034355.html

slider
Offline
Зарегистрирован: 17.06.2014

dovakin пишет:
Всем доброго времени суток.Подскажите невежде что за экран мне достался и можно ли его прикрутить к меге 2560?http://ru.aliexpress.com/item/free-shipping-3-2-TFT-LCD-Module-Display-Touch-Panel-PCB-adapter-wholesale-price/580034355.html

нормальный экран. прикрутить можно. 

уже обсуждалось в этой ветке (1-2страницы ранее). далее продолжено в отдельной ветке http://arduino.ru/forum/apparatnye-voprosy/kak-podklyuchit-displei-32-lcd-module  

dovakin
Offline
Зарегистрирован: 05.01.2016
smoki
Offline
Зарегистрирован: 24.10.2015

Друзья, товарищи помогите. Приобрел давно экранчик 3,5 от mcufriend (ILI9327 8 bit), подключил к arduino nano, скачал эту библиотеку https://github.com/dgolda/UTFT, тест отробатывает как надо. Sd слот пока не перепаял использую отдельный модуль. Искал как загружать изображения с sd карты нашел только одно решение http://blog.lincomatic.com/?p=1074 которое использует библиотеку sd, а не tiny_fat, взял у них библиотеку Utft от Uctronics, вытащил из нее кусок 

void UTFT::dispBitmap(File inFile)
{
	char VH,VL;
	int i,j = 0;
	inFile.seek(BMPIMAGEOFFSET);
  	cbi(P_CS, B_CS);
  	for(i = 0; i < 320; i++)
  	for(j = 0; j < 240; j++)
  	{
		
	    VL = inFile.read();
	    VH = inFile.read();
	    VL = ((VL & 0xE0) << 1) | (VL & 0x1F);
	    VH = (VH << 1) | ((VL & 0x80) >> 7);
	    LCD_Write_DATA(VH,VL);
  	}
  	sbi(P_CS, B_CS);
  	clrXY();
}

Так вот у них дисплей 320х240, а у меня 400х240 я сделал какртинку 400х240, пробовал менять цикл

 for(i = 0; i < 320; i++) на for(i = 0; i < 400; i++),

а картинка выводится но на i = 320 начинает выводить каринку с начала экрана.

В чем может быть проблема Arduino ide 1.6.7

diger67
Offline
Зарегистрирован: 25.07.2015

Это пример работы с ili9341, мало отличается от ili9488. Надо только поменять в инциализации FSMC разрядность шины на 8 bit и добавить функцию записи пикселя. Пример написан для работы по 16 bit шине. Тут только основной файл иницыализации, дополнительные файлы не выложены. Прошу не пинать за примеры к stm, не знаю к сожалению или к радости, но stm портируют в среду arduino  и все больше библиотек переносят на это ядро. Впрочем так же как и на ядро ARM Atmel.

 

******************************************************************/
//#include "stm32f10x_gpio.h"
//#include "stm32f10x_fsmc.h"
//#include "stm32f10x_rcc.h"
#include "stm32f10x_dma.h"
//#include "stm32f10x.h"
#include "tft_ili_9341.h"
#include "reg_9341.h"
#include "stm32f10x_exti.h"
#include "xpt2046.h"
//#include "print.h"

#define SVD_ON()  GPIO_SetBits(GPIOC, GPIO_Pin_7)
#define SVD_OFF()  GPIO_ResetBits(GPIOC, GPIO_Pin_7)

long pH;
float str[] = {0};
__IO uint16_t masyvas[10000]={0};
/*
void EXTI15_10_IRQHandler(void)
{
 uint32_t i, j;
 for(j=0; j<0x5; j++)
 {
 SVD_OFF();
 for(i=0; i<0x3FFFFF; i++);
 SVD_ON();
 for(i=0; i<0x3FFFFF; i++);
 }
 EXTI_ClearFlag(EXTI_Line11);
 EXTI_ClearITPendingBit(EXTI_Line11);
}
*/

//const uint16_t
// WIDTH, HEIGHT;
//uint16_t _width, _height, cursor_x, cursor_y;

/*******************************************************************/
// Определяем адреса, по которым будем записывать данные
// Для записи данных
//#define LCD_DATA           ((uint32_t)0x60020000)
// Для записи команд
//#define LCD_REG            ((uint32_t)0x60000000)



/*******************************************************************/
// Простенькая функция задержки
/*void delay(uint32_t delayTime)
{
    uint32_t i;
    for(i = 0; i < delayTime; i++);
}*/



/*******************************************************************/
// Так мы будем писать команды в регистры LCD
/*void writeLCDCommand(unsigned int reg,unsigned int value)
{
    *(uint16_t *) (LCD_REG) = reg;
    *(uint16_t *) (LCD_DATA) = value;
}*/



/*******************************************************************/// Так мы будем писать команды в регистры LCD
void LCD_Write_COM(unsigned int reg)
{
    *(uint16_t *) (LCD_REG) = reg;
    //*(uint16_t *) (LCD_DATA) = value;
}



/*******************************************************************/
// А так данные..
//void writeLCDData(unsigned int data)
void LCD_Write_DATA(unsigned int data)
{
    *(uint16_t *) (LCD_DATA)= data;
}

/*******************************************************************/

unsigned int LCD_Read_DATA()
{
 unsigned int data;
 data = *(uint16_t *) (LCD_DATA);
 return data;
}

/*******************************************************************/

void Lcd_data_start(void)
{
 LCD_Write_COM(0x2c);
}

/*******************************************************************/

void Global_reset(void)
{
 GPIO_ResetBits(GPIOE, GPIO_Pin_1);
 delay(0x0FFFFF);
 GPIO_SetBits(GPIOE, GPIO_Pin_1 );
 delay(0x0FFFFF);
}

/*******************************************************************/

void initDMA(void)
{
 DMA_InitTypeDef DMA_ini_user;

 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

 DMA_ini_user.DMA_PeripheralBaseAddr = (uint16_t) LCD_DATA;
 DMA_ini_user.DMA_MemoryBaseAddr = (uint16_t) masyvas;
 DMA_ini_user.DMA_DIR = DMA_DIR_PeripheralSRC;
 DMA_ini_user.DMA_BufferSize = siseoff(masyvas);
 DMA_ini_user.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
 DMA_ini_user.DMA_MemoryInc = DMA_MemoryInc_Enable;
 DMA_ini_user.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
 DMA_ini_user.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
 DMA_ini_user.DMA_Mode = DMA_Mode_Normal;
 DMA_ini_user.DMA_Priority = DMA_Priority_Medium;
 DMA_ini_user.DMA_M2M = DMA_M2M_Enable;

 DMA_Init(DMA1_Channel1 , &DMA_ini_user);
}

/*******************************************************************/
void initAll()
{
    FSMC_NORSRAMInitTypeDef  fsmc;
    FSMC_NORSRAMTimingInitTypeDef fsmcTiming;
    GPIO_InitTypeDef  gpio;

    // Включаем тактирование портов
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
    // Тактирование SPI2
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
    // И тактирование FSMC
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE);

    // Инициализация пинов, задейстованных в общении по FSMC
    gpio.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_14 | GPIO_Pin_15;

    gpio.GPIO_Mode = GPIO_Mode_AF_PP;
    gpio.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOD, &gpio);

    gpio.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;

    gpio.GPIO_Mode = GPIO_Mode_AF_PP;
    gpio.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOE, &gpio);

    gpio.GPIO_Mode = GPIO_Mode_Out_PP;
    gpio.GPIO_Pin = GPIO_Pin_6;
    GPIO_Init(GPIOD, &gpio);

    //gpio.GPIO_Pin = GPIO_Pin_2; //void EXTI2_IRQHandler(void)
    //gpio.GPIO_Mode = GPIO_Mode_IPU;
    //GPIO_Init(GPIOE, &gpio);

    // Здесь у нас Reset
    gpio.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2; //A19
    GPIO_Init(GPIOE, &gpio);

    // CS
    gpio.GPIO_Mode = GPIO_Mode_AF_PP;
    gpio.GPIO_Pin = GPIO_Pin_7;
    GPIO_Init(GPIOD, &gpio);

    // RS
    gpio.GPIO_Pin = GPIO_Pin_11; //A16
    gpio.GPIO_Pin = GPIO_Pin_12; //A17
    gpio.GPIO_Pin = GPIO_Pin_13; //A18
    GPIO_Init(GPIOD, &gpio);

    //SVD
    gpio.GPIO_Pin = GPIO_Pin_7;
    gpio.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOC, &gpio);
    //EXTI
    gpio.GPIO_Pin = GPIO_Pin_11;
    gpio.GPIO_Speed = GPIO_Speed_10MHz;
    gpio.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_Init(GPIOC, &gpio);

    // pin SPI
    //gpio.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; //SCK, MISO, MOSI
    //gpio.GPIO_Mode = GPIO_Mode_AF_PP;
    //gpio.GPIO_Speed = GPIO_Speed_2MHz;
    //GPIO_Init(GPIOB, &gpio);
    //gpio.GPIO_Pin = CS_Touch;
    //gpio.GPIO_Mode = GPIO_Mode_Out_PP;      //CS_Touch
    //GPIO_Init(GPIOB, &gpio);

    // CS -> 1
    // Reset -> 0
    // RD -> 1
    // RW -> 1
    GPIO_SetBits(GPIOD, GPIO_Pin_7);
    GPIO_ResetBits(GPIOE, GPIO_Pin_1);
    GPIO_SetBits(GPIOD, GPIO_Pin_4);
    GPIO_SetBits(GPIOD, GPIO_Pin_5);
    GPIO_SetBits(GPIOE, GPIO_Pin_2);

    // Настройка FSMC
    /*fsmcTiming.FSMC_AddressSetupTime = 0x02;
    fsmcTiming.FSMC_AddressHoldTime = 0x00;
    fsmcTiming.FSMC_DataSetupTime = 0x04;//0x05
    fsmcTiming.FSMC_BusTurnAroundDuration = 0x00;
    fsmcTiming.FSMC_CLKDivision = 0x00;
    fsmcTiming.FSMC_DataLatency = 0x00;
    fsmcTiming.FSMC_AccessMode = FSMC_AccessMode_B;

    fsmc.FSMC_Bank = FSMC_Bank1_NORSRAM1;
    fsmc.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
    fsmc.FSMC_MemoryType = FSMC_MemoryType_NOR;
    fsmc.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;
    fsmc.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;
    fsmc.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
    fsmc.FSMC_WrapMode = FSMC_WrapMode_Disable;
    fsmc.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
    fsmc.FSMC_WriteOperation = FSMC_WriteOperation_Enable;
    fsmc.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
    fsmc.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;
    fsmc.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
    fsmc.FSMC_ReadWriteTimingStruct = &fsmcTiming;
    fsmc.FSMC_WriteTimingStruct = &fsmcTiming;
    fsmc.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable;

    FSMC_NORSRAMInit(&fsmc);
    FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE);*/

    init_FSMC();


    SVD_OFF();
    //CS_Touch_OFF();

    rotation = 1;
    _width    = TFTWIDTH;
    _height   = TFTHEIGHT;
}



/*******************************************************************/

void init_FSMC(void)
{
 FSMC_NORSRAMInitTypeDef  fsmc;
 FSMC_NORSRAMTimingInitTypeDef fsmcTiming;

 // Настройка FSMC
 fsmcTiming.FSMC_AddressSetupTime = 0x02;
    fsmcTiming.FSMC_AddressHoldTime = 0x00;
    fsmcTiming.FSMC_DataSetupTime = 0x05;//0x15
    fsmcTiming.FSMC_BusTurnAroundDuration = 0x00;
    fsmcTiming.FSMC_CLKDivision = 0x00;
    fsmcTiming.FSMC_DataLatency = 0x00;
    fsmcTiming.FSMC_AccessMode = FSMC_AccessMode_B;

    fsmc.FSMC_Bank = FSMC_Bank1_NORSRAM1;
    fsmc.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
    fsmc.FSMC_MemoryType = FSMC_MemoryType_NOR;
    fsmc.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;
    fsmc.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;
    fsmc.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
    fsmc.FSMC_WrapMode = FSMC_WrapMode_Disable;
    fsmc.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
    fsmc.FSMC_WriteOperation = FSMC_WriteOperation_Enable;
    fsmc.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
    fsmc.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;
    fsmc.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
    fsmc.FSMC_ReadWriteTimingStruct = &fsmcTiming;
    fsmc.FSMC_WriteTimingStruct = &fsmcTiming;
    fsmc.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable;

    FSMC_NORSRAMInit(&fsmc);
    FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE);
}

/*******************************************************************/
/*
void init_EXTI(void)
{
 EXTI_InitTypeDef EXTI_Init_Touch;
 GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource11);

 EXTI_Init_Touch.EXTI_Line = EXTI_Line11;
 EXTI_Init_Touch.EXTI_Mode = EXTI_Mode_Interrupt;
 //EXTI_Init_Touch.EXTI_Mode = EXTI_Mode_Event;
 EXTI_Init_Touch.EXTI_Trigger = EXTI_Trigger_Falling; //EXTI_Trigger_Rising EXTI_Trigger_Falling
 EXTI_Init_Touch.EXTI_LineCmd = ENABLE;
 EXTI_Init(&EXTI_Init_Touch);

    NVIC_SetPriority(EXTI15_10_IRQn, 1);
    NVIC_EnableIRQ(EXTI15_10_IRQn);
}
*/
/*******************************************************************/
/*
void Init_Spi(void)
{
 SPI_InitTypeDef SPI_init;

 SPI_init.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
 SPI_init.SPI_Mode = SPI_Mode_Master;
 SPI_init.SPI_DataSize = SPI_DataSize_8b;
 SPI_init.SPI_CPOL = SPI_CPOL_Low;
 SPI_init.SPI_CPHA = SPI_CPHA_2Edge;
 SPI_init.SPI_NSS = SPI_NSS_Soft;
 SPI_init.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64;
 SPI_init.SPI_FirstBit = SPI_FirstBit_MSB;
 SPI_init.SPI_CRCPolynomial = 10;
 SPI_Init(SPI2, &SPI_init);

 NVIC_EnableIRQ(SPI2_IRQn);

 SPI_Cmd(SPI2, ENABLE);
}
*/
/*******************************************************************/

void initLCD(void)
{
    // Глобальный Reset дисплея
      Global_reset();


    // Пляски с  бубном от китайских товарищей
      LCD_Write_COM(0x01); //reset
      delay(15);

      LCD_Write_COM(0x11);//sleep out
      delay(20);

      LCD_Write_COM(0x28); //display off
      delay(5);
      LCD_Write_COM(0xCF); //power control b
      LCD_Write_DATA(0x00);
      LCD_Write_DATA(0xC1); //83 81 AA
      LCD_Write_DATA(0x30);
      LCD_Write_COM(0xED); //power on seq control
      LCD_Write_DATA(0x64); //64 67
      LCD_Write_DATA(0x03);
      LCD_Write_DATA(0x12);
      LCD_Write_DATA(0x81);
      LCD_Write_COM(0xE8); //timing control a
      LCD_Write_DATA(0x85);
      LCD_Write_DATA(0x00); // 01
      LCD_Write_DATA(0x78); //79 78
      LCD_Write_COM(0xCB); //power control a
      LCD_Write_DATA(0x39);
      LCD_Write_DATA(0X2C);
      LCD_Write_DATA(0x00);
      LCD_Write_DATA(0x34);
      LCD_Write_DATA(0x02);
      LCD_Write_COM(0xF7); //pump ratio control
      LCD_Write_DATA(0x20);
      LCD_Write_COM(0xEA); //timing control b
      LCD_Write_DATA(0x00);
      LCD_Write_DATA(0x00);
      LCD_Write_COM(0xC0); //power control 2
      LCD_Write_DATA(0x23); //26 25
      LCD_Write_COM(0xC1); //power control 2
      LCD_Write_DATA(0x10);// 11
      LCD_Write_COM(0xC5); //vcom control 1
      LCD_Write_DATA(0x3E);// 35
      LCD_Write_DATA(0x28);// 3E
      LCD_Write_COM(0xC7); //vcom control 2
      LCD_Write_DATA(0x86); //BE 94
      LCD_Write_COM(0xB1); //frame control
      LCD_Write_DATA(0x00);
      LCD_Write_DATA(0x18); //1B 70
      LCD_Write_COM(0xB6); //display control
      LCD_Write_DATA(0x08);// 0A
      LCD_Write_DATA(0x82);
      LCD_Write_DATA(0x27);
      LCD_Write_DATA(0x00);
      LCD_Write_COM(0xB7); //emtry mode
      LCD_Write_DATA(0x07);
      LCD_Write_COM(0x3A); //pixel format
      LCD_Write_DATA(0x55); //16bit
      LCD_Write_COM(0xE0);
      LCD_Write_DATA(0x0F);
      LCD_Write_DATA(0x31);
      LCD_Write_DATA(0x2B);
      LCD_Write_DATA(0x0C);
      LCD_Write_DATA(0x0E);
      LCD_Write_DATA(0x08);
      LCD_Write_DATA(0x4E);
      LCD_Write_DATA(0xF1);
      LCD_Write_DATA(0x37);
      LCD_Write_DATA(0x07);
      LCD_Write_DATA(0x10);
      LCD_Write_DATA(0x03);
      LCD_Write_DATA(0x0E);
      LCD_Write_DATA(0x09);
      LCD_Write_DATA(0x00);
      LCD_Write_COM(0x36); //mem access
      LCD_Write_DATA((1<<3)|(1<<6));
      //LCD_Write_DATA((1<<3)|(1<<7)); //rotate 180
      LCD_Write_COM(0x29); //display on
      LCD_Write_COM(0x2C);
      delay(5);
    /*writeLCDCommand(0x0015,0x0030);
    writeLCDCommand(0x0011,0x0040);
    writeLCDCommand(0x0010,0x1628);
    writeLCDCommand(0x0012,0x0000);
    writeLCDCommand(0x0013,0x104d);
    delay(10);
    writeLCDCommand(0x0012,0x0010);
    delay(10);
    writeLCDCommand(0x0010,0x2620);
    writeLCDCommand(0x0013,0x344d);
    delay(10);

    writeLCDCommand(0x0001,0x0100);
    writeLCDCommand(0x0002,0x0300);
    writeLCDCommand(0x0003,0x1030);
    writeLCDCommand(0x0008,0x0604);
    writeLCDCommand(0x0009,0x0000);
    writeLCDCommand(0x000A,0x0008);

    writeLCDCommand(0x0041,0x0002);
    writeLCDCommand(0x0060,0x2700);
    writeLCDCommand(0x0061,0x0001);
    writeLCDCommand(0x0090,0x0182);
    writeLCDCommand(0x0093,0x0001);
    writeLCDCommand(0x00a3,0x0010);
    delay(10);

    // Настройки гаммы
    writeLCDCommand(0x30,0x0000);
    writeLCDCommand(0x31,0x0502);
    writeLCDCommand(0x32,0x0307);
    writeLCDCommand(0x33,0x0305);
    writeLCDCommand(0x34,0x0004);
    writeLCDCommand(0x35,0x0402);
    writeLCDCommand(0x36,0x0707);
    writeLCDCommand(0x37,0x0503);
    writeLCDCommand(0x38,0x1505);
    writeLCDCommand(0x39,0x1505);
    delay(10);

    // Включение дисплея
    writeLCDCommand(0x0007,0x0001);
    delay(10);
    writeLCDCommand(0x0007,0x0021);
    writeLCDCommand(0x0007,0x0023);
    delay(10);
    writeLCDCommand(0x0007,0x0033);
    delay(10);
    writeLCDCommand(0x0007,0x0133);*/

}



/*******************************************************************/
int main()
{
 //SystemInit();
 //str = 12;
 //str[] = ("31");
 //Float_(*str[]);
 initAll();
 InitTouch(LANDSCAPE);
 //InitTouch(PORTRAIT);
 setPrecision(PREC_MEDIUM);
 //dataAvailable();
 //read();
 initLCD();
 delay(100);
    //setRotation(0);

       int i;
       long x, y;

        // Начальный и конечный адреса по горизонтали
        /*writeLCDCommand(0x0050, 0);
        writeLCDCommand(0x0051, 239);
        // Начальный и конечный адреса по вертикали
        writeLCDCommand(0x0052, 0);
        writeLCDCommand(0x0053, 319);

        writeLCDCommand(32, 0);
        writeLCDCommand(33, 0);*/
       //drawPixel(30, 40, 0xFFFF);
       //LCD_Write_COM(0x51);
       //LCD_Write_DATA(0x00);
        //*(uint16_t *) (LCD_REG) = 0x2C;

    // Красный
    //fillScreen(0xF800);
    /*for (i = 0; i < 76800; i++)
 {
        LCD_Write_DATA(0xF800);
        //drawPixel(30, 40, 0x0000);
 }*/
    //drawPixel(30, 40, 0x0000);
    //delay(0xFFFFFF);
 // Зеленый
    //fillScreen(0x07E0);
 /*for (i = 0; i < 76800; i++)
 {
  LCD_Write_DATA(0x07E0);
 }*/
 //delay(0xFFFFFF);
 //Синий
 //fillScreen(0x001F);
 /*for (i = 0; i < 76800; i++)
 {
  LCD_Write_DATA(0x001F);
  //drawPixel(30, 40, 0x0000);
 }*/
 //delay(0xFFFFFF);
 //Серый
 //fillScreen(0x03EF);
 /*for (i = 0; i < 76800; i++)
 {
  LCD_Write_DATA(0x03EF);
  //drawPixel(30, 40, 0x0000);
 }*/
 //delay(0xFFFFFF);
 //fillScreen(0xFFE0);
 /*for (i = 0; i < 76800; i++)
 {
  LCD_Write_DATA(0xFFE0);
  //drawPixel(30, 40, 0x0000);
 }*/
 //delay(0xFFFFFF);
 //fillScreen(0x0000);
 /*for (i = 0; i < 76800; i++)
 {
  LCD_Write_DATA(0x0000);
  //drawPixel(30, 40, 0x0000);
 }*/

 //delay(0xFFFFFF);
       //for(i = 0; i < 4; i++)
       //{
        setRotation(1);
        fillScreen(0x03EF);
        i = readID();
        setTextColor(0x0000);
        setTextSize(1);
        setCursor(20, 20);
        if(i == 0x9341)
        {
         printstr("LCD ILI9341");
        }
        //fillRect(20, 30, 50, 70, 0x07E0);
        //drawFastHLine(120, 100, 60, 0xFFFF);
        //drawFastVLine(120, 100, 60, 0xF800);
        //drawRect(15, 120, 80, 80, 0xF800);
        //drawRoundRect(15, 30, 40, 40, 3, 0x07E0);
        //fillRoundRect(15, 30, 45, 30, 3, 0x07E0);
        //drawTriangle(10, 10, 20, 40, 10, 40, 0x07E0);
        //fillTriangle(10, 10, 20, 40, 10, 40, 0x07E0);
        //drawChar(200, 50, 'Б', 0x0000, 0x03EF, 3);
        setCursor(20, 40);
        fillRoundRect(15, 30, 45, 28, 3, 0x07E0);
        printstr(" 1234 ");
        delay(0xFFFFFF);
        setCursor(20, 40);
        fillRoundRect(15, 30, 45, 28, 3, 0x07E0);
        printstr(" 5678 ");
        delay(0xFFFFFF);
        //print('П');
        //print('а');
        //print('п');
        //print('а');
        //if(i == 0 || i == 2)
        //drawCircle(180, 120, 30, 0xFFFF);
        //if(i == 1 || i == 3)
        //fillCircle(180, 120, 30, 0xFFFF);
        //drawLine(0, 0, 240,320, 0xFFFF);
        delay(0x3FFFFF);
        //SVD_ON();
       //}
        //GPIO_ResetBits(GPIOE, GPIO_Pin_2);
        //GPIO_SetBits(GPIOE, GPIO_Pin_2);
        //init_EXTI();
        Init_Spi();
        //InitTouch(LANDSCAPE);
        //setTextSize(2);
        /*
    while(1){
    while(dataAvailable() == true){
      //WR_CMD(0x94);
      //RD_AD();
      read();
         x = getX();
         y = getY();
         if ((x!=-1) && (y!=-1))
         {
           drawPixel (x, y, 0xF800);
         }
      //if(dataAvailable() == 1){
        //SVD_ON();
        //for(i=0; i<0x3FFFFF; i++);
        //SVD_OFF();
        //for(i=0; i<0x3FFFFF; i++);
      //}else {
       //for(i=0; i<0xFFFFFF; i++);
    //SVD_ON();
   }
    //}
    }*/
    /*while(1)
    {
      //CS_Touch_ON();
      SPI_I2S_SendData(SPI2, 0x90);
      while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);

      //CS_Touch_OFF();
      //uint32_t i, j;
      //for(j=0; j<0xA; j++)
      //{
      //SVD_OFF();
      //for(i=0; i<0xFFFFF; i++);
      //SVD_ON();
      //for(i=0; i<0xFFFFF; i++);
      //}
      //GPIO_ResetBits(GPIOE, GPIO_Pin_2);
      //GPIO_SetBits(GPIOE, GPIO_Pin_2);
      pH = 27;
      setCursor(20, 40);
      fillRoundRect(15, 30, 45, 28, 3, 0x07E0);
      printdig(pH, DEC);
      delay(0xFFFFFF);
      pH = -31;
      setCursor(20, 40);
      fillRoundRect(15, 30, 45, 28, 3, 0x07E0);
      printdig(pH, DEC);
      delay(0xFFFFFF);
    }*/

        while(1)
        {
         uint16_t j;
         //LCD_Write_COM(0x10);
         fillScreen(0x03EF);
         //LCD_Write_COM(0x11);
         delay(0x3FFFFF);
         fillScreen(0x8000);
         delay(0x3FFFFF);
         //LCD_Write_COM(0x10);
         fillScreen(0x0000);
         //LCD_Write_COM(0x11);
         delay(0x3FFFFF);
         fillScreen(0x03EF);
         delay(0x3FFFFF);

         while(1)
         {
         for(j = 20; j <280; j+=10)
         {
          //LCD_Write_COM(0x28);
          //fillScreen(0x03EF);
          //LCD_Write_COM(0x28);
          fillRect(j, 30, 20, 20, 0x07E0);
          //LCD_Write_COM(0x29);
          delay(0x3FFFF);
          fillRect(j, 30, 20, 20, 0x03EF);
          //delay(16625);
          /*
          LCD_Write_COM(0x28);
          fillRoundRect(j, 30, 45, 28, 3, 0x03EF);
          LCD_Write_COM(0x29);
          delay(0xFFFFF);
       */
         }
         for(j = 280; j >20; j-=10)
             {
              fillRect(j, 30, 20, 20, 0x07E0);
             delay(0x3FFFF);
              fillRect(j, 30, 20, 20, 0x03EF);
             }
         }
        }



}


/*void Adafruit_GFX(int16_t w, int16_t h)
{
 WIDTH(w), HEIGHT(h);
}*/

/*void Rotation(uint8_t x) {
  rotation = (x & 3);
  switch(rotation) {
   case 0:
   case 2:
    _width  = TFTWIDTH;
    _height = TFTHEIGHT;
    break;
   case 1:
   case 3:
    _width  = TFTHEIGHT;
    _height = TFTWIDTH;
    break;
  }
}

void setRotation(uint8_t x)
{

 Rotation(x);

 uint16_t t;
 switch (rotation) {
  case 2:
   //Rotation(x);
   t = ILI9341_MADCTL_MX | ILI9341_MADCTL_BGR;
   break;
  case 3:
   //Rotation(x);
   t = ILI9341_MADCTL_MV | ILI9341_MADCTL_BGR;
   break;
  case 0:
   //Rotation(x);
   t = ILI9341_MADCTL_MY | ILI9341_MADCTL_BGR;
   break;
  case 1:
   //Rotation(x);
   t = ILI9341_MADCTL_MX | ILI9341_MADCTL_MY | ILI9341_MADCTL_MV | ILI9341_MADCTL_BGR;
   break;
 }
 LCD_Write_COM(ILI9341_MADCTL); // MADCTL
 LCD_Write_DATA(t);
 // For 9341, init default full-screen address window:
 setAddrWindow(0, 0, _width - 1, _height - 1);
}*/

/*void setAddrWindow(int x1, int y1, int x2, int y2)
{
 uint32_t t;

 t = x1;
 t <<= 16;
 t |= x2;
 writeRegister32(ILI9341_COLADDRSET, t);  // HX8357D uses same registers!
 t = y1;
 t <<= 16;
 t |= y2;
 writeRegister32(ILI9341_PAGEADDRSET, t); // HX8357D uses same registers!
}*/

/*void fillRect(int16_t x1, int16_t y1, int16_t w, int16_t h, uint16_t fillcolor)
{
 int16_t  x2, y2;
  // Initial off-screen clipping
  if( (w            <= 0     ) ||  (h             <= 0      ) ||
   (x1           >= _width) ||  (y1            >= _height) ||
   ((x2 = x1+w-1) <  0     ) || ((y2  = y1+h-1) <  0      )) return;
  if(x1 < 0) { // Clip left
   w += x1;
   x1 = 0;
  }
  if(y1 < 0) { // Clip top
   h += y1;
   y1 = 0;
  }
  if(x2 >= _width) { // Clip right
   x2 = _width - 1;
   w  = x2 - x1 + 1;
  }
  if(y2 >= _height) { // Clip bottom
   y2 = _height - 1;
   h  = y2 - y1 + 1;
  }

  setAddrWindow(x1, y1, x2, y2);
   flood(fillcolor, (uint32_t)w * (uint32_t)h);
}*/

void fillScreen(uint16_t color)
{
 setAddrWindow(0, 0, _width - 1, _height - 1);
 flood(color, (long)TFTWIDTH * (long)TFTHEIGHT);
}

void flood(uint16_t color, uint32_t len)
{
 uint16_t blocks;
 int i;

 LCD_Write_COM(0x2c);
 LCD_Write_DATA(color);
 len--;

 blocks = (uint16_t)(len / 64); // 64 pixels/block
 while(blocks--) {
  i = 16; // 64 pixels/block / 4 pixels/pass
  do {
    LCD_Write_DATA(color); LCD_Write_DATA(color);
    LCD_Write_DATA(color); LCD_Write_DATA(color);
  } while(--i);
  }
  for(i = (uint8_t)len & 63; i--; ) {
    LCD_Write_DATA(color);
  }
}

/*void drawPixel(int16_t x, int16_t y, uint16_t color)
{
 setAddrWindow(x, y, _width-1, _height-1);
 *(uint16_t *) (LCD_REG) = 0x2C;
 LCD_Write_DATA(color);
}*/

void setLR(void) {
 uint8_t hi, low;
 //CS_ACTIVE;
 //writeRegisterPair(HX8347G_COLADDREND_HI, HX8347G_COLADDREND_LO, _width  - 1);
 //writeRegisterPair(HX8347G_ROWADDREND_HI, HX8347G_ROWADDREND_LO, _height - 1);
 //CS_IDLE;
 LCD_Write_COM(HX8347G_COLADDREND_HI);
 hi = (_width  - 1) >> 8;
 LCD_Write_DATA(hi);
 LCD_Write_COM(HX8347G_COLADDREND_LO);
 low = (_width  - 1);
 LCD_Write_DATA(low);
 LCD_Write_COM(HX8347G_ROWADDREND_HI);
 hi = (_height - 1) >> 8;
 LCD_Write_DATA(hi);
 LCD_Write_COM(HX8347G_ROWADDREND_LO);
 low = (_height - 1);
 LCD_Write_DATA(low);
}



/*void drawFastHLine(int16_t x, int16_t y, int16_t length, uint16_t color)
{
 int16_t x2;
  // Initial off-screen clipping
  if((length <= 0     ) ||
   (y      <  0     ) || ( y                  >= _height) ||
   (x      >= _width) || ((x2 = (x+length-1)) <  0      )) return;

  if(x < 0) {        // Clip left
   length += x;
   x       = 0;
  }
  if(x2 >= _width) { // Clip right
   x2      = _width - 1;
   length  = x2 - x + 1;
  }

  setAddrWindow(x, y, x2, y);
  flood(color, length);

  setLR();

}*/

/*void drawFastVLine(int16_t x, int16_t y, int16_t length,  uint16_t color)
{
  int16_t y2;

  // Initial off-screen clipping
  if((length <= 0      ) ||
     (x      <  0      ) || ( x                  >= _width) ||
     (y      >= _height) || ((y2 = (y+length-1)) <  0     )) return;
  if(y < 0) {         // Clip top
    length += y;
    y       = 0;
  }
  if(y2 >= _height) { // Clip bottom
    y2      = _height - 1;
    length  = y2 - y + 1;
  }

  setAddrWindow(x, y, x, y2);
  flood(color, length);
                   setLR();
}*/
/*
void writeRegister32(uint16_t r, uint32_t d)
{
 //CS_ACTIVE;
 //CD_COMMAND;
 LCD_Write_COM(r);
 //write8(r);
 //CD_DATA;
 delay(DELAY_TIME);
 LCD_Write_DATA(d>>24);
 //write8(d >> 24);
 delay(DELAY_TIME);
 LCD_Write_DATA(d>>16);
 //write8(d >> 16);
 delay(DELAY_TIME);
 LCD_Write_DATA(d>>8);
 //write8(d >> 8);
 delay(DELAY_TIME);
 LCD_Write_DATA(d);
 //CS_IDLE;
}*/







 

diger67
Offline
Зарегистрирован: 25.07.2015

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

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

Спасибо, буду пробовать)

alexmanson
Offline
Зарегистрирован: 12.12.2015

smoki пишет:

картинка выводится но на i = 320 начинает выводить каринку с начала экрана.

В чем может быть проблема Arduino ide 1.6.7

Проблема в том, что не совпадает размер "окна" отрисовки и размер массива, который посылается в дисплей. Ищи в файле инициализации размер этого окна, и правь под свои 400 на 240, что-то типа этого

#define TFTWIDTH   240
#define TFTHEIGHT  400

получается, что, как только закончился 319-ый  стобец, начиная с нулевого, оставшиеся элементы массива пишутся с начала "окна"

smoki
Offline
Зарегистрирован: 24.10.2015

Открыл даташит прошел по инициализации:

LCD_Write_COM(0x2A); //set_column_address
	LCD_Write_DATA(0x00);
	LCD_Write_DATA(0x00);
	LCD_Write_DATA(0x00);
	LCD_Write_DATA(0xeF);

	LCD_Write_COM(0x2B); //set_page_address
	LCD_Write_DATA(0x00);
	LCD_Write_DATA(0x00);
	LCD_Write_DATA(0x01);
#ifdef MCUFRIEND_35_TFTLCD_FOR_ARDUINO_2560_INIT_LCD2
		LCD_Write_DATA(0x3F);// Это 319
#else
	LCD_Write_DATA(0x8F); // Это 399

 

нашел вчем проблема , закоментировал:

 

#define MCUFRIEND_35_TFTLCD_FOR_ARDUINO_2560_INIT_LCD2 1

в UTFT.h проблема решилась.  Спасибо.

smoki
Offline
Зарегистрирован: 24.10.2015

Я думаю этот вопрос тоже подходит в эту ветку, чем теперь конвертировать картинки в bmp 16bit, есть кортинка которая примером шла она открывается коректно, что то другое при конвертации с измененным цветом идет. Пробовал Gimp, Irfan.

Next
Offline
Зарегистрирован: 01.09.2015

smoki пишет:

Я думаю этот вопрос тоже подходит в эту ветку, чем теперь конвертировать картинки в bmp 16bit, есть кортинка которая примером шла она открывается коректно, что то другое при конвертации с измененным цветом идет. Пробовал Gimp, Irfan.

Я обычным Paint-ом конвертил.

smoki
Offline
Зарегистрирован: 24.10.2015

Попробывал увеличить скорость отрисовки  может кому будет полезно, было 6558 ms, стало 1827 ms. 

(Используется библиотека SD) В Utft.cpp

void UTFT::dispBitmap(File inFile)
{
	
	char buff[120];
	char VH,VL;
	int i,j,a = 0;
	inFile.seek(BMPIMAGEOFFSET);
  	cbi(P_CS, B_CS);

  	for(i = 0; i < 800; i++) {		
		for(j = 0; j < 2; j++)
		{
			inFile.read( buff, 120 );
				for (a = 0; a < 120; a++){		
					VL = buff[a];			
					VH = buff[++a];
					VL = ((VL & 0xE0) << 1) | (VL & 0x1F);
					VH = (VH << 1) | ((VL & 0x80) >> 7);
					LCD_Write_DATA(VH,VL);		
				}
		}
	}
  	sbi(P_CS, B_CS);
  	clrXY();
	
}

сам скетч

// UTFT_Read_BMP (C)2012 uCtronics
// web: http://www.uctronics.com
//
// This program is a demo for modified UTFT.library
// and illustrate how to read bmp file from SD card.
//
// This program requires the UTFT library (8bit mode)
// and the code is compatible with both UNO and Mega board.
// No code modification required.
//
// This program requires the modified UTFT library by electronics.lee
// The orignal UTFT library is written by Henning Karlsen
// web: http://www.henningkarlsen.com/electronics
//

#include <UTFT.h>
#include <SD.h>
#include <Wire.h>

#define SD_CS 10 
#define BMPIMAGEOFFSET 54

// Declare which fonts we will be using
extern uint8_t SmallFont[];

//UTFT(byte model, int RS, int WR,int CS,int RD)
UTFT myGLCD(NIC35WS,A5,A4,A3,A2);



void setup()
{

  myGLCD.InitLCD();
  myGLCD.setFont(SmallFont);
  if (!SD.begin(SD_CS)) 
  {
    while (1);
  }
}

void loop()
{
  char VH,VL;
  File inFile;
  inFile = SD.open("input.bmp",FILE_READ);
  if (! inFile) 
  {
    while (1);  //if file does not exsit, stop here.
  }
  myGLCD.dispBitmap(inFile);
  inFile.close();
  while(1);
}

Улучшения, предложения?

slider
Offline
Зарегистрирован: 17.06.2014

smoki пишет:

Попробывал увеличить скорость отрисовки  может кому будет полезно, было 6558 ms, стало 1827 ms. 

(Используется библиотека SD) В Utft.cpp

void UTFT::dispBitmap(File inFile)
{
	
	char buff[120];
	char VH,VL;
	int i,j,a = 0;
	inFile.seek(BMPIMAGEOFFSET);
  	cbi(P_CS, B_CS);

  	for(i = 0; i < 800; i++) {		
		for(j = 0; j < 2; j++)
		{
			inFile.read( buff, 120 );
				for (a = 0; a < 120; a++){		
					VL = buff[a];			
					VH = buff[++a];
					VL = ((VL & 0xE0) << 1) | (VL & 0x1F);
					VH = (VH << 1) | ((VL & 0x80) >> 7);
					LCD_Write_DATA(VH,VL);		
				}
		}
	}
  	sbi(P_CS, B_CS);
  	clrXY();
	
}

сам скетч

// UTFT_Read_BMP (C)2012 uCtronics
// web: http://www.uctronics.com
//
// This program is a demo for modified UTFT.library
// and illustrate how to read bmp file from SD card.
//
// This program requires the UTFT library (8bit mode)
// and the code is compatible with both UNO and Mega board.
// No code modification required.
//
// This program requires the modified UTFT library by electronics.lee
// The orignal UTFT library is written by Henning Karlsen
// web: http://www.henningkarlsen.com/electronics
//

#include <UTFT.h>
#include <SD.h>
#include <Wire.h>

#define SD_CS 10 
#define BMPIMAGEOFFSET 54

// Declare which fonts we will be using
extern uint8_t SmallFont[];

//UTFT(byte model, int RS, int WR,int CS,int RD)
UTFT myGLCD(NIC35WS,A5,A4,A3,A2);



void setup()
{

  myGLCD.InitLCD();
  myGLCD.setFont(SmallFont);
  if (!SD.begin(SD_CS)) 
  {
    while (1);
  }
}

void loop()
{
  char VH,VL;
  File inFile;
  inFile = SD.open("input.bmp",FILE_READ);
  if (! inFile) 
  {
    while (1);  //if file does not exsit, stop here.
  }
  myGLCD.dispBitmap(inFile);
  inFile.close();
  while(1);
}

Улучшения, предложения?

Раз уж вы в этом разобрались, черкнули бы пояснения, коментирования

Объясните пожалуйста конструкцию

void UTFT::dispBitmap(File inFile)
{
 
char buff[120];
char VH,VL;
int i,j,a = 0;
inFile.seek(BMPIMAGEOFFSET);
  cbi(P_CS, B_CS);
 
  for(i = 0; i < 800; i++) {
for(j = 0; j < 2; j++)
{
inFile.read( buff, 120 );
for (a = 0; a < 120; a++){
VL = buff[a];
VH = buff[++a];
VL = ((VL & 0xE0) << 1) | (VL & 0x1F);
VH = (VH << 1) | ((VL & 0x80) >> 7);
LCD_Write_DATA(VH,VL);
}
}
}
  sbi(P_CS, B_CS);
  clrXY();
 
}
 
зачем такие сложности 
VL = ((VL & 0xE0) << 1) | (VL & 0x1F);
VH = (VH << 1) | ((VL & 0x80) >> 7); 
 скорее всего, так конвертируется из кода BMP в код RGB для протокола 8бит 262к 65к дисплея?
 как вы подключили дисплей?  черкните чтоб лишний раз не разбираться, а то без пояснений народ бездумно пытается скопировать куски кода и не понимает почему в их случаях ничего не работает.
 
и раз уж не навешиваете на порт данных 8бит ничего кроме дисплея, то можно отказаться от  CS ( sbi(P_CS, B_CS);,...  ) ,замкнув этот вывод дисплея на GND, это может немного увеличить скорость.

 

smoki
Offline
Зарегистрирован: 24.10.2015

Я использую дисплей от mcufriend вот такой:

он подключен к arduino nano.

arduino <---> lcd

d8-d8

d9-d9

d2-d10

d3-d11

d4-d12

d5-d13

d6-d14

d7-d15

a5-RS

a4-wr

a3-cs

a2-rst

тоесть 8 бит, ну и питание. В первонвачальном коде функцией  inFile.read(); читалось по одному байту я добавил чтение блоками по 120 байт(эсли экран 400х240 то 2 буфера это столбик) что значительно ускоряет процесс, пробовал и 240 байт (тоесть один столбик за один раз, но визуально ни чего не поменялось). В библиотеке которую я использовал в файле UTFT\hardware\avr\HW_ATmega328P.h непосредственно за передачу информации контроллеру дисплея отвечает следующий кусок : 

case 8:
	//	PORTD = VH;
	//	pulse_low(P_WR, B_WR);
	//	PORTD = VL;
	//	pulse_low(P_WR, B_WR);

  		PORTB = VL & 0x3;  
  		PORTD = VL & 0xFD;  
  		pulse_low(P_WR, B_WR);
		
		break;

тоесть уменя не используется переменная VH.  В одной из библиотек которую я брал с этой ветки использовался тот код что закоментирован тоесть используется и VH  и VL , но у меня это приводило к не правильному отображению цвета. Так что возможно у кого то у кого она используется, код будет работать не коректно.

void UTFT::dispBitmap(File inFile)
{
	
	char buff[120]; //Это буфер(массив char) на 120 байт, в него куски будем загружать изображение.
	char VH,VL;
	int i,j,a = 0;
	inFile.seek(BMPIMAGEOFFSET); // это офсет он указывается в скетче, равен 54 байта там лежит различная информация о файле нам она не нужна. тоесть читать файл начинаем после него.
  	cbi(P_CS, B_CS);

  	for(i = 0; i < 800; i++) {	//закрашивание экрана идет снизу вверх по столбцам, поскольку разрешение  400х240 и мы грузим буфер в 120 байт(это два раза на один столбик) то получается, это нужно сделать 800 раз.  	
		for(j = 0; j < 2; j++) // 2 раза за один столбик
		{
			inFile.read( buff, 120 ); // считываем из файла 120 байт в буфер.
				for (a = 0; a < 120; a++){	// проходим по буферу 120 раз.	
					VL = buff[a];	// присваеваем VL значение из массива.		
				//	VH = buff[++a]; // у меня не используется и я не знаю привильно ли я сделал.
					VL = ((VL & 0xE0) << 1) | (VL & 0x1F); //коректировка цвета пикселя, для моего уровня понимания это пока недоступно.
				//	VH = (VH << 1) | ((VL & 0x80) >> 7);
					LCD_Write_DATA(VH,VL);	// отаправка на контроллер дисплея	
				}
		}
	}
  	sbi(P_CS, B_CS);
  	clrXY();

}

Кто понимает что происходит  в VL = ((VL & 0xE0) << 1) | (VL & 0x1F); обьясните пожалуйста.

 

slider
Offline
Зарегистрирован: 17.06.2014

smoki пишет:

.............

он подключен к arduino nano.

arduino <---> lcd

d8-d8

d9-d9

d2-d10

d3-d11

d4-d12

d5-d13

d6-d14

d7-d15

...........

если не используете аппаратный UART (пины D0 D1 ардуино , и сериал монитор), то чтобы не использовать тратящую время припарку от неправильного подключения

подключите правильно как в документации UTFT    UTFT_Requirements.pdf 

arduino <---> lcd

do-d8

d1-d9

d2-d10

d3-d11

d4-d12

d5-d13

d6-d14

d7-d15

используйте оригинальную UTFT . и вспомните в memorysaver.h оставить закоментированными только ваш ili9327 . Строчку инициализации с использовании его в 8ми битном режиме. Т.о. скорость вывода ещё вырастет, из-за того что ему  не надо перераспределять байт по разным портам микроконтроллера , а кидает только в один аппаратный, - пины ардуино D0..7 

 в файле  UTFT\hardware\avr\HW_ATmega328P.h уже будет 

case 8:
		PORTD = VH;
		pulse_low(P_WR, B_WR);
		PORTD = VL;
		pulse_low(P_WR, B_WR);	
break;

 

madrepairer
Offline
Зарегистрирован: 18.08.2015

romeo_b , экран такой-же как увас , 3,95 .подскажите как подключали к акрдуно уно, какие библиотеки использовали. я новичок пока . научился выводить хело ворлд на двухстрочнике 1602. а этот купил сдуру из-за размера . вот теперь незнаю что с ним делать 

Yuraz
Offline
Зарегистрирован: 19.01.2016

Друзья, подскажите и мне... может что пропустил в своих шагах:
1. приобрел "3.95 inch LCD touch screen ili9488" тут . Соединил Мегу и Экран. Могу пины указать, но наверное тут как у всех, соединение без проводов - в впаянные мамы папы, ошибиться как би никак...
2. пробовал пример с UTFT, никак, белый экран...
3. почитал тут всю ветку, тут, пост 545 от diger67 повторил.
4. разрешение продавец на Али пишет 400*270 (!?), хотя в других источниках 
480*320
5. в Adafruit_TFTLCD.cpp ставил:
и
#define TFTWIDTH   240
#define TFTHEIGHT  400
и

#define TFTWIDTH   320
#define TFTHEIGHT  480
6. В примере 
c:\Arduino\libraries\Adafruit_TFTLCD\examples\graphicstest 
в 115 строку подставлял:

//identifier = 0x9341;
//identifier = 0x9488;
identifier = 0x9327;
во всех попытках - нет результата - просто белый экран. В мониторе порта только вижу меняется:

...
Voltage:1.49    pH value: 5.96

Voltage:1.49    pH value: 5.96
Voltage:1.49    pH value: 5.97
...
7. Попробовал пример от 
diger67LCD_ID_Reader, выдаёт:

Initializing LCD...
Reading ID...0x0404
Loading LCD registers...
Filling the screen...
Done filling...
If your screen filled red, you may be able to use the library at http://misc.ws

ID может быть 0x0404, а может 0x0C0C... Эти адреса тоже подставлял в 115строку, как то тоже ничего (((
 
Прошу помочь, штука очень интересная, первый TFT экран, но не ожидал что возникнут такие сложности...
Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015
Yuraz
Offline
Зарегистрирован: 19.01.2016

Valera19701 пишет:

попробуйте эту библиотеку

http://forum.arduino.cc/index.php?action=dlattach;topic=366304.0;attach=150756

Валерий, спасибо, тоже, буквально минуту назад, в ютубе нашел линк на нее, и читаю после этого ваш ответ с ней, сейчас попробую с этой библиотекой! Отпишу в случае положительного ответа сегодня, а не получится, уже на завтра оставлю опыты.

http://www.youtube.com/watch?v=VnRVbxQESnY

Yuraz
Offline
Зарегистрирован: 19.01.2016

Нет, не работает, завтра буду пытаться снова, а пока из примера выдаёт вот что:

Paint_kbv !
Unknown LCD driver chip: 404
 
а из примера LCD_ID_Reader:
 
Read Registers on MCUFRIEND UNO shield
controllers either read as single 16-bit
e.g. the ID is at readReg(0)
or as a sequence of 8-bit values
in special locations (first is dummy)

reg(0x0000) 04 04 ILI9320, ILI9325, ILI9335, ...
reg(0x0004) 04 04 04 04 Manufacturer ID
reg(0x0009) 05 05 05 05 05 Status Register
reg(0x00BF) BF BF BF BF BF BF ILI9481, HX8357-B
reg(0x00D0) 54 54 Power Control
reg(0x00D2) 56 56 56 NVM Read
reg(0x00D3) 57 57 57 57 ILI9341, ILI9488
reg(0x00DA) 56 56 56 RDID1
reg(0x00DB) 57 57 57 RDID2
reg(0x00DC) 54 54 54 RDID3
reg(0x00EF) EF EF EF EF EF EF ILI9327
reg(0x00B0) B4 RGB Interface Signal Control
reg(0x00B4) B4 Inversion Control
reg(0x00B6) B6 B6 B6 B6 Display Control
reg(0x00B7) B7 Entry Mode Set
reg(0x00F2) F6 F6 F6 F6 F6 F6 F6 F6 F6 F6 F6 F6 Adjust Control 2
reg(0x00F6) F6 F6 F6 Interface Control

Эх, похоже это не для Mega:

The library is designed for MCUFRIEND UNO shields.

 

 

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

ваш продаван пишет что там контроллер: R61581 а не ili9488

Yuraz
Offline
Зарегистрирован: 19.01.2016

Valera19701 пишет:

ваш продаван пишет что там контроллер: R61581 а не ili9488

Валерий, спасибо за помощь!!! На самом экране написано ili9488, ну я и давай гуглить, да темы читать. Точно у продавца R61581. Взял сейчас пример UTFT_Demo_480x320 , ничего не правя, залил и заработало!!!!!!!!!!!

Есть правда косяки - текст из этой демки зеркальный, и на пикселей 20 смещенно всё, но это уже другие вопросы, буду читать и доходить!

Продавец кстати мегабыстрый!!! Смотрите, заказал 2 января, отправил он наверное 3го, письмо было почти сразу, 15го посылка была уже на местном моём почтампе (РФ, центр.часть)! Получил сегодня. Я подготовился ждать месяц, а тут за 2 недели! Причем, одновременно делал заказы - так эти параллельные заказы они только отправили мне из Китая на самый последний день - десятый. Ну это офтоп, по доставке прошу не отвечать, может просто кому то поможет. Аппараты у него проверенные, и самые дешевые (были на 2января точно) и приходят быстро до дома.

mazahaker
Offline
Зарегистрирован: 02.11.2015

Немного оффтоп, но думаю будет интересно! Посмотрите какой прирост производительности! http://gizmogarage.net/c-vs-assembler-performance-on-avr/

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

diger67, не могли бы вы опубликовать проект для STM32 полностью? Что-то я не врубаюсь)

diger67
Offline
Зарегистрирован: 25.07.2015

Yarik.Yar пишет:

diger67, не могли бы вы опубликовать проект для STM32 полностью? Что-то я не врубаюсь)

Проектом это назвать сложно. Скорее это попытка портировать библиотеки от arduino на платформу stm32. При этом приходится трансформировать из C++ в С. Все это осложняется тем, что нет наследования классов, bool в чистом виде и многоо другого. Я не использую среду ардуино, использую Keil и CooCox. Соберу на досуге в архив и залью на свой серв, сможете скачать.

P.S. Дальнейшие экспирименты с DMA не дали положительных результатов. Возможности этой функции ограничены.

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

Спасибо.
P.S. Для STM32 пользуюсь Keil-MDK 4.......

diger67
Offline
Зарегистрирован: 25.07.2015

http://178.130.34.198/stm32/tft_fsmc.rar

Сдесь сборка для работы с tft ili9341 + tuoch(xpt2046) процессор stm32f103vet, среда CooCox, в принципе создав проек в Keil и перенеся все файлы с и h должно собраться.. Для работы с stm32f4 надо подправить инициализацию перефирии в соответствии с библиотеками на эту серию.

thor_nsk
Offline
Зарегистрирован: 30.01.2016

Приветствую, уважаемые.
Прикупил TFT 3,5" с тач скрином для UNO. Вот тут покупал: http://www.ebay.com/itm/111687922300?_trksid=p2057872.m2749.l2649&ssPage...
В названии товара написано что должен был быть 3,6" (реально прислали 3,5"), но это не важно сейчас. В описании товара написано контроллер ili9488, ниже идет инициализация для ili9327. На присланной железяке написано ili9486. Продавец про контроллер ничего сказать не может, предлагает компенсировать четверть стОимости. Чтение регистра из дисплея дало C0C0 (или 0C0C, сейчас точно не помню). Вот фото моего экрана: http://s10.postimg.org/cqx93eezt/TFT.jpg
Я пробовал использовать инициализацию для всех трех перечисленных контроллеров. Ничего не меняется.
Вот то, что показывает экран: http://s10.postimg.org/ufozv0qqx/pictures.jpg

Изображение в формате BMP 24-бита, читается с SD-карты. Графический тест так же проходит, все рисуется, но с цветом полная лажа.
Использую IDE1.6.6, Adafruit GFX Library version=1.1.4 и TFTLCD-Library-master от этих же фруктов.

Вот такие инициализации я использовал:

//ili 9486
static const uint8_t ILI9486_regValues[] PROGMEM = {
    HX8357_SWRESET, 0,
    0x11,  0,
    TFTLCD_DELAY, 100,
    0xF2,  9, 0x1C, 0xA3, 0x32, 0x02, 0xB2, 0x12, 0xFF, 0x12, 0x00,
    0xF1,  2, 0x36, 0xA4,
    0xF8,  2, 0x21, 0x04,
    0xF9,  2, 0x00, 0x08,
    0xC0,  2, 0x0D, 0x0D,
    0xC1,  2, 0x43, 0x00,
    0xC2,  1, 0x00,
    0xC5,  2, 0x00, 0x48,
    0xB6,  3, 0x00, 0x22, 0x3B,
    0xE0, 15, 0x0F, 0x24, 0x1C, 0x0A, 0x0F, 0x08, 0x43, 0x88, 0x32, 0x0F, 0x10, 0x06, 0x0F, 0x07, 0x00,
    0xE1, 15, 0x0F, 0x38, 0x30, 0x09, 0x0F, 0x0F, 0x4E, 0x77, 0x3C, 0x07, 0x10, 0x05, 0x23, 0x1B, 0x00,
    0x20,  1, 0xC8,
    0x36,  1, 0x40,
    0x3A,  1, 0x55,
    0x2A,  4, 0x00, 0x00, 0x01, 0xDF,
    0x2B,  4, 0x00, 0x00, 0x01, 0x3F,
    TFTLCD_DELAY, 100,
    0x29,  0,
    0x2C,  0,
};

//ili 9488
static const uint8_t ILI9488_regValues[] PROGMEM = {
    HX8357_SWRESET, 0,
    0xE0, 15, 0x00, 0x07, 0x10, 0x09, 0x17, 0x0B, 0x40, 0x8A, 0x4B, 0x0A, 0x0D, 0x0F, 0x15, 0x16, 0x0F,
    0xE1, 15, 0x00, 0x1A, 0x1B, 0x02, 0x0D, 0x05, 0x30, 0x35, 0x43, 0x02, 0x0A, 0x09, 0x32, 0x36, 0x0F,
    0xB1,  1, 0xA0,
    0xB4,  1, 0x02,
    0xC0,  2, 0x17, 0x15,
    0xC1,  1, 0x41,
    0xC5,  3, 0x00, 0x0A, 0x80,
    0xB6,  1, 0x02,
    0x36,  1, 0x48,
    0x3A,  1, 0x55,
    0xE9,  1, 0x00,
    0xF7,  4, 0xA9 ,0x51, 0x2C, 0x82,
    0x11,  0,
    TFTLCD_DELAY, 120,
    0x29,  0,
};

// ili9327
static const uint8_t ILI9327_regValues[] PROGMEM = {
    HX8357_SWRESET, 0,
    0xE9, 1, 0x20,
    0x11, 0,
    TFTLCD_DELAY, 100,
    0xD1, 3, 0x00, 0x71, 0x19,
    0xD0, 3, 0x07, 0x01, 0x08,
    0x36, 1, 0x48,
    0x3A, 1, 0x05,
    0xC1, 4, 0x10, 0x10, 0x02, 0x02,
    0xC0, 6, 0x00, 0x35, 0x00, 0x00, 0x01, 0x02,
    0xC5, 1, 0x04,
    0xD2, 2, 0x01, 0x44,
    0xC8,15, 0x04, 0x67, 0x35, 0x04, 0x08, 0x06, 0x24, 0x01, 0x37, 0x40, 0x03, 0x10, 0x08, 0x80, 0x00,
    0x2A, 4, 0x00, 0x00, 0x00, 0xEF,
    0x2B, 4, 0x00, 0x00, 0x01, 0x3F,
    0x29, 0,
    0x2C, 0,
};

Игрался со значениями регистров 0xB4, 0x36 и 0x3A - лучше не стало.

Подключение дисплея к Arduino Nano:
LCD_D0 connects to digital pin 8
LCD_D1 connects to digital pin 9
LCD_D2 connects to digital pin 2
LCD_D3 connects to digital pin 3
LCD_D4 connects to digital pin 4
LCD_D5 connects to digital pin 5
LCD_D6 connects to digital pin 6
LCD_D7 connects to digital pin 7
LCD_CS A3
LCD_RS A2
LCD_WR A1
LCD_RD A0
LCD_RST A4

С библиотекой UTFT вообще ничего не получается, только белый экран и все.
Очень надеюсь на вашу помощь ибо мои изыскания в решении проблемы ни к чему не привели :(

diger67
Offline
Зарегистрирован: 25.07.2015

Посмотрите в даташите какой регистр отвечает за иверсию цветов в контроллере установленном на шилде. Там же посмотрите регистр и комманду возвращающую ID. Комманда 0хD3, редактируем функцию readID, пробуем прочитать ID

uint16_t id = readReg(0xD3);
 if (id == 0x9341) {
  return 0x9341;
                }
        else if(id == 0x9486){
                return 0x9486;
                }

Можно добавить и 0x9488. Но просто добавить инициализацию недостаточно.

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

Можно без if/else if, просто ретурнить значение id, не так ли?

diger67
Offline
Зарегистрирован: 25.07.2015

Это врят ли, каждый чип возвращает свое значение.

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

Тогда так:

...

if(id ==0x9846 || id==0x9341) return id;
diger67
Offline
Зарегистрирован: 25.07.2015

Можно и так, но думаю, что код в прошивке будет по размеру одинаков.

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

Но смотрится-то красивее:) хотя, на вкус и цвет все йломастеры разные.

Кстати, удалось запустить на STM32 экран на ST7735 1.44' . Аппаратный SPI1 и немного магии)

thor_nsk
Offline
Зарегистрирован: 30.01.2016

Я Закоментировал все эти проверки и принудительно прописывал id. А дальше уже запускается инициализация добавленная мной. За инверсию отвечает команда 0х20h-выключает, 0х21h-включает. Инициализацию для 9486 я брал из библиотеки utft и там передается еще один параметр. А по даташиту команда без параметров. И еще, в даташите я не нашел описние параметров отвечающих за positive gamma control (0хЕ0) и negative gamma correction (0хЕ1). Их аж 15 штук, а за что отвечают не понятно. Может в них дело?

Не могу найти таблицу регистров в даташите :( Ткните носом , пожалуйста.

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

Ойой...боюсь, на телефоне не откроют даташит) ищите что-то типа Register summary. В 9488'ском даташите легко находится)

diger67
Offline
Зарегистрирован: 25.07.2015

Yarik.Yar пишет:
Кстати, удалось запустить на STM32 экран на ST7735 1.44' . Аппаратный SPI1 и немного магии)

Поздравляю. Один минус, уж больно медленно передается по SPI, даже при скорости 24 мбит. Самый реальный вариант это 16 bit 8080 протокол.

diger67
Offline
Зарегистрирован: 25.07.2015

Есть даташит с разными вариантами инициализации 9486. Скину на свой серв выложу ссылку.

 

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

Полное заполнение экрана цветом -около 0.2 сек, наверное...это с прескалером 2.
Для 8080 нужен FSMC, а я с ним только начинаю)