esp8266 硬件spi驱动1.8TFT 目前刷到16帧每秒

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);
  
  
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值