Подключение SPI TFT LCD
- Войдите на сайт для отправки комментариев
Пт, 05/06/2015 - 13:56
Добрый день. Есть вот такой экран http://www.ebay.com/itm/181500077459 Купить купил но как подлючить не могу понять( все инструкции что есть в инете на китайском. На одном сайте нашел вот такой исходник, а ссылка нa Datasheet была битая из как разобраться. подключил пины как в дефайне не работает. Подскажите как ее правильно подключать ? Заранее благодарен !
П.С. Вставил код как есть, не нашел спойлер.
#include "pins_arduino.h"
#define LCD_CS 2
#define LCD_REST 3
#define LCD_DC 4
#define LCD_MOSI 5
#define LCD_CLK 6
volatile uint8_t *P_SCK,*P_MOSI,*P_DC,*P_RST,*P_CS;
volatile uint8_t B_SCK,B_MOSI,B_DC,B_RST,B_CS;
#define LCD_W 240
#define LCD_H 320
//color define
#define WHITE 0xFFFF
#define BLACK 0x0000
#define BLUE 0x001F
#define BRED 0XF81F
#define GRED 0XFFE0
#define GBLUE 0X07FF
#define RED 0xF800
#define MAGENTA 0xF81F
#define GREEN 0x07E0
#define CYAN 0x7FFF
#define YELLOW 0xFFE0
#define BROWN 0XBC40
#define BRRED 0XFC07
#define GRAY 0X8430
void LCD_Write_Bus(char dat)
{
*P_CS &= ~B_CS;
for(uint8_t i=0;i<8;i++)
{
if(dat&0x80)
*P_MOSI |= B_MOSI;
else
*P_MOSI &= ~B_MOSI;
dat <<= 1;
*P_SCK &= ~B_SCK;
asm("nop");
*P_SCK |= B_SCK;
}
*P_CS |= B_CS;
}
void LCD_WR_DATA8(char dat)
{
digitalWrite(LCD_DC,HIGH);
LCD_Write_Bus(dat);
}
void LCD_WR_DATA(int dat)
{
digitalWrite(LCD_DC,HIGH);
LCD_Write_Bus(dat>>8);
LCD_Write_Bus(dat);
}
void LCD_WR_REG(char dat)
{
digitalWrite(LCD_DC,LOW);
LCD_Write_Bus(dat);
}
void LCD_WR_REG_DATA(int reg,int dat)
{
LCD_WR_REG(reg);
LCD_WR_DATA(dat);
}
void Address_set(unsigned int x1,unsigned y1,unsigned int x2,unsigned int y2)
{
LCD_WR_REG(0x2a);
LCD_WR_DATA8(x1>>8);
LCD_WR_DATA8(x1);
LCD_WR_DATA8(x2>>8);
LCD_WR_DATA8(x2);
LCD_WR_REG(0x2b);
LCD_WR_DATA8(y1>>8);
LCD_WR_DATA8(y1);
LCD_WR_DATA8(y2>>8);
LCD_WR_DATA8(y2);
LCD_WR_REG(0x2C);
}
void LCD_Init(void)
{
P_SCK = portOutputRegister(digitalPinToPort(LCD_CLK));
B_SCK = digitalPinToBitMask(LCD_CLK);
P_MOSI = portOutputRegister(digitalPinToPort(LCD_MOSI));
B_MOSI = digitalPinToBitMask(LCD_MOSI);
P_DC = portOutputRegister(digitalPinToPort(LCD_DC));
B_DC = digitalPinToBitMask(LCD_DC);
P_RST = portOutputRegister(digitalPinToPort(LCD_REST));
B_RST = digitalPinToBitMask(LCD_REST);
P_CS = portOutputRegister(digitalPinToPort(LCD_CS));
B_CS = digitalPinToBitMask(LCD_CS);
*P_RST &= ~B_RST;
delay(20);
*P_RST |= B_RST;
LCD_WR_REG(0xCB);
LCD_WR_DATA8(0x39);
LCD_WR_DATA8(0x2C);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x34);
LCD_WR_DATA8(0x02);
LCD_WR_REG(0xCF);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0XC1);
LCD_WR_DATA8(0X30);
LCD_WR_REG(0xE8);
LCD_WR_DATA8(0x85);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x78);
LCD_WR_REG(0xEA);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x00);
LCD_WR_REG(0xED);
LCD_WR_DATA8(0x64);
LCD_WR_DATA8(0x03);
LCD_WR_DATA8(0X12);
LCD_WR_DATA8(0X81);
LCD_WR_REG(0xF7);
LCD_WR_DATA8(0x20);
LCD_WR_REG(0xC0); //Power control
LCD_WR_DATA8(0x23); //VRH[5:0]
LCD_WR_REG(0xC1); //Power control
LCD_WR_DATA8(0x10); //SAP[2:0];BT[3:0]
LCD_WR_REG(0xC5); //VCM control
LCD_WR_DATA8(0x3e);
LCD_WR_DATA8(0x28);
LCD_WR_REG(0xC7); //VCM control2
LCD_WR_DATA8(0x86); //--
LCD_WR_REG(0x36); // Memory Access Control
LCD_WR_DATA8(0x48); //
LCD_WR_REG(0x3A);
LCD_WR_DATA8(0x55);
LCD_WR_REG(0xB1);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x18);
LCD_WR_REG(0xB6); // Display Function Control
LCD_WR_DATA8(0x08);
LCD_WR_DATA8(0x82);
LCD_WR_DATA8(0x27);
LCD_WR_REG(0xF2); // 3Gamma Function Disable
LCD_WR_DATA8(0x00);
LCD_WR_REG(0x26); //Gamma curve selected
LCD_WR_DATA8(0x01);
LCD_WR_REG(0xE0); //Set Gamma
LCD_WR_DATA8(0x0F);
LCD_WR_DATA8(0x31);
LCD_WR_DATA8(0x2B);
LCD_WR_DATA8(0x0C);
LCD_WR_DATA8(0x0E);
LCD_WR_DATA8(0x08);
LCD_WR_DATA8(0x4E);
LCD_WR_DATA8(0xF1);
LCD_WR_DATA8(0x37);
LCD_WR_DATA8(0x07);
LCD_WR_DATA8(0x10);
LCD_WR_DATA8(0x03);
LCD_WR_DATA8(0x0E);
LCD_WR_DATA8(0x09);
LCD_WR_DATA8(0x00);
LCD_WR_REG(0XE1); //Set Gamma
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x0E);
LCD_WR_DATA8(0x14);
LCD_WR_DATA8(0x03);
LCD_WR_DATA8(0x11);
LCD_WR_DATA8(0x07);
LCD_WR_DATA8(0x31);
LCD_WR_DATA8(0xC1);
LCD_WR_DATA8(0x48);
LCD_WR_DATA8(0x08);
LCD_WR_DATA8(0x0F);
LCD_WR_DATA8(0x0C);
LCD_WR_DATA8(0x31);
LCD_WR_DATA8(0x36);
LCD_WR_DATA8(0x0F);
LCD_WR_REG(0x2A);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0xEF);
LCD_WR_REG(0x2B);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x01);
LCD_WR_DATA8(0x3F);
LCD_WR_REG(0x11); //Exit Sleep
delay(120);
LCD_WR_REG(0x29); //Display on
LCD_WR_REG(0x2c);
}
void LCD_Clear(unsigned int color)
{
unsigned int i,j;
Address_set(0,0,LCD_W-1,LCD_H-1);
for(i=0;i<LCD_W;i++)
{
for (j=0;j<LCD_H;j++)
{
LCD_WR_DATA(color);
}
}
}
void setup()
{
unsigned char p;
for(p=0;p<14;p++)
pinMode(p,OUTPUT);
LCD_Init();
}
void loop()
{
LCD_Clear(RED);
delay(1000);
LCD_Clear(BLUE);
delay(1000);
LCD_Clear(GRED);
delay(1000);
}
Для такого дисплея есть библиотеки от Adafruit. Adafruit_ILI9341 и Adafruit-GFX.
Можно подключить к SPI.
#include "Adafruit_GFX.h" #include "Adafruit_ILI9341.h" #define TFT_DC 8 #define TFT_CS 7 Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC); void setup() { tft.begin(); tft.fillScreen(ILI9341_BLACK); tft.setRotation(3);Что-то опять не получается.
скачал я библеотеку , скопировал, подключил ucc (3,3v) cs и d/c , выбрал скетч graphicstest,
загружаю, но ничего не происходи с экраном(
нашел вот этот ролик http://www.youtube.com/watch?v=9RIKzXANbOY но походу дела я что-то не понимаю
Такой дисплей подключал по спаю. Все работает и на Adafruit_ILI9341 и на ucglib и кажется на utft.
Обращаю внимание что дисплей понимает только 3 в уровни. Если используете 5 в ардуину то надо ставить преобразователь уровней (микросхема или резисторы). Ну и конечно правильно подключить к спаю.