esp8266 硬件spi驱动1.8TFT 目前刷到16帧每秒。
#include <SPI.h>
#define TFT_SCL 14
#define TFT_SDA 13
#define TFT_CS 4
#define TFT_RST 16
#define TFT_DC 5
#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 //灰色
#define DARKBLUE 0X01CF //深蓝色
#define LIGHTBLUE 0X7D7C //浅蓝色
#define GRAYBLUE 0X5458 //灰蓝色
#define LIGHTGREEN 0X841F //浅绿色
#define LGRAY 0XC618 //浅灰色(PANNEL),窗体背景色
#define LGRAYBLUE 0XA651 //浅灰蓝色(中间层颜色)
#define LBBLUE 0X2B12 //浅棕蓝色(选择条目的反色)
#define TFT_WIDTH 128
#define TFT_HIGHT 160
SPIClass vspi(SPI);
SPISettings spisettings(100000000,MSBFIRST,SPI_MODE0);
#include "Tft_SPI.h"
#include "bmptest.h"
uint8_t TFT_GRAM[TFT_WIDTH*TFT_HIGHT*2]={0};
void Reset(void)
{
digitalWrite(TFT_RST, 0);
delay(100);
digitalWrite(TFT_RST, 1);
delay(100);
}
void SPI_WriteData(uint8_t Data)
{
// uint8_t i;
// for(i=0;i<8;i++){
// if(Data&0x80)
// digitalWrite(TFT_SDA, 1);
// else digitalWrite(TFT_SDA,0);
// digitalWrite(TFT_CS, 0);
// digitalWrite(TFT_CS, 1);
// Data<<=1;
// }
}
void Lcd_WriteIndex(uint8_t Cmd)
{
vspi.beginTransaction(spisettings);
digitalWrite(TFT_DC, 0);
vspi.transfer(Cmd);
vspi.endTransaction();
}
void Lcd_WriteData(uint8_t Data)
{
vspi.beginTransaction(spisettings);
digitalWrite(TFT_DC, 1);
vspi.transfer(Data);
// SPI_WriteData(Data);
vspi.endTransaction();
}
void Lcd_WriteData_16(uint16_t Data){
vspi.beginTransaction(spisettings);
digitalWrite(TFT_DC, 1);
// SPI_WriteData(Data>>8);
// SPI_WriteData(Data);
vspi.transfer16(Data);
vspi.endTransaction();
}
void Lcd_Initial(){
Reset();//Reset before LCD Init.
//LCD Init For 1.44Inch LCD Panel with ST7735R.
Lcd_WriteIndex(0x11);//Sleep exit
delay (120);
//ST7735R Frame Rate
Lcd_WriteIndex(0xB1);
Lcd_WriteData(0x01);
Lcd_WriteData(0x2C);
Lcd_WriteData(0x2D);
Lcd_WriteIndex(0xB2);
Lcd_WriteData(0x01);
Lcd_WriteData(0x2C);
Lcd_WriteData(0x2D);
Lcd_WriteIndex(0xB3);
Lcd_WriteData(0x01);
Lcd_WriteData(0x2C);
Lcd_WriteData(0x2D);
Lcd_WriteData(0x01);
Lcd_WriteData(0x2C);
Lcd_WriteData(0x2D);
Lcd_WriteIndex(0xB4); //Column inversion
Lcd_WriteData(0x07);
//ST7735R Power Sequence
Lcd_WriteIndex(0xC0);
Lcd_WriteData(0xA2);
Lcd_WriteData(0x02);
Lcd_WriteData(0x84);
Lcd_WriteIndex(0xC1);
Lcd_WriteData(0xC5);
Lcd_WriteIndex(0xC2);
Lcd_WriteData(0x0A);
Lcd_WriteData(0x00);
Lcd_WriteIndex(0xC3);
Lcd_WriteData(0x8A);
Lcd_WriteData(0x2A);
Lcd_WriteIndex(0xC4);
Lcd_WriteData(0x8A);
Lcd_WriteData(0xEE);
Lcd_WriteIndex(0xC5); //VCOM
Lcd_WriteData(0x0E);
Lcd_WriteIndex(0x36); //MX, MY, RGB mode
Lcd_WriteData(0xC0);
Lcd_WriteData(0xC8);
//ST7735R Gamma Sequence
Lcd_WriteIndex(0xe0);
Lcd_WriteData(0x0f);
Lcd_WriteData(0x1a);
Lcd_WriteData(0x0f);
Lcd_WriteData(0x18);
Lcd_WriteData(0x2f);
Lcd_WriteData(0x28);
Lcd_WriteData(0x20);
Lcd_WriteData(0x22);
Lcd_WriteData(0x1f);
Lcd_WriteData(0x1b);
Lcd_WriteData(0x23);
Lcd_WriteData(0x37);
Lcd_WriteData(0x00);
Lcd_WriteData(0x07);
Lcd_WriteData(0x02);
Lcd_WriteData(0x10);
Lcd_WriteIndex(0xe1);
Lcd_WriteData(0x0f);
Lcd_WriteData(0x1b);
Lcd_WriteData(0x0f);
Lcd_WriteData(0x17);
Lcd_WriteData(0x33);
Lcd_WriteData(0x2c);
Lcd_WriteData(0x29);
Lcd_WriteData(0x2e);
Lcd_WriteData(0x30);
Lcd_WriteData(0x30);
Lcd_WriteData(0x39);
Lcd_WriteData(0x3f);
Lcd_WriteData(0x00);
Lcd_WriteData(0x07);
Lcd_WriteData(0x03);
Lcd_WriteData(0x10);
Lcd_WriteIndex(0x2a);
Lcd_WriteData(0x00);
Lcd_WriteData(0x00+2);
Lcd_WriteData(0x00);
Lcd_WriteData(0x80+2);
Lcd_WriteIndex(0x2b);
Lcd_WriteData(0x00);
Lcd_WriteData(0x00+3);
Lcd_WriteData(0x00);
Lcd_WriteData(0x80+3);
Lcd_WriteIndex(0xF0); //Enable test command
Lcd_WriteData(0x01);
Lcd_WriteIndex(0xF6); //Disable ram power save mode
Lcd_WriteData(0x00);
Lcd_WriteIndex(0x3A); //65k mode
Lcd_WriteData(0x05);
Lcd_WriteIndex(0x29);//Display on
}
void Lcd_SetRegion(unsigned int x_start,unsigned int y_start,unsigned int x_end,unsigned int y_end)
{
Lcd_WriteIndex(0x2a);
vspi.beginTransaction(spisettings);
digitalWrite(TFT_DC, 1);
vspi.transfer(0x02);
vspi.transfer(x_start);
vspi.transfer(0x02);
vspi.transfer(x_end);
vspi.endTransaction();
Lcd_WriteIndex(0x2b);
vspi.beginTransaction(spisettings);
digitalWrite(TFT_DC, 1);
vspi.transfer(0x01);
vspi.transfer(y_start);
vspi.transfer(0x01);
vspi.transfer(y_end);
vspi.endTransaction();
Lcd_WriteIndex(0x2c);
}
void LCD_Clear(unsigned int Color)
{
uint8_t i;
vspi.beginTransaction(spisettings);
digitalWrite(TFT_DC, 1);
for (i=0;i<TFT_WIDTH*TFT_HIGHT;i++)
{
vspi.transfer(Color>>8);
vspi.transfer(Color);
}
vspi.endTransaction();
}
void LCD_Refresh()
{
int i,j;
vspi.beginTransaction(spisettings);
digitalWrite(TFT_DC, 1);
for (i=0;i<TFT_WIDTH*TFT_HIGHT*2;i++)
{
// vspi.transfer(TFT_GRAM[i]>>8);
vspi.transfer(TFT_GRAM[i]);
}
vspi.endTransaction();
}
void Draw_Bmp(int x,int y,int w,int h){
int k,i,j;
k=0;
for(j=0;j<h;j++)
{
for(i=0;i<w*2;i++){
TFT_GRAM[2*x+i+(j+y)*256]=bmptest[k];
k++;
}
}
}
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
Serial.print(F("Hello! ST77xx TFT Test"));
pinMode(TFT_CS,OUTPUT);
pinMode(TFT_RST,OUTPUT);
pinMode(TFT_DC,OUTPUT);
vspi.begin();
vspi.setClockDivider(SPI_CLOCK_DIV2);
Lcd_Initial();
Lcd_SetRegion(0,0,TFT_WIDTH-1,TFT_HIGHT-1);
for(int i=0;i<TFT_WIDTH*TFT_HIGHT;i++){
TFT_GRAM[i*2]=RED>>8;
TFT_GRAM[i*2+1]=RED;
}
Serial.println(F("Initialized"));
}
void loop() {
// put your main code here, to run repeatedly:
uint16_t time = millis();
Draw_Bmp(10,0,106,160);
// if(k<TFT_WIDTH*TFT_HIGHT) TFT_GRAM[k]=RED;
LCD_Refresh();
// k++;
time = millis() - time;
char buf[32];
sprintf(buf,"TIME: %d FPS: %d",time,1000/time);
Serial.println(buf);
}