YD-RP2040@250MHZ,1.8TFT刷到每秒34帧,有高人老师指导一下怎么进一步提高。
#include <SPI.h>
#include "Bitmaps.h"
#define TFT_DC 4
#define TFT_RST 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
uint8_t TFT_GRAM[TFT_WIDTH*TFT_HIGHT*2]={0};
uint16_t TFT_GRAM_16[TFT_WIDTH*TFT_HIGHT]={0};
SPISettings spisettings(160000000, MSBFIRST, SPI_MODE0);
void Reset(void)
{
digitalWrite(TFT_RST, 0);
delay(100);
digitalWrite(TFT_RST, 1);
delay(100);
}
void Lcd_WriteIndex(uint8_t Cmd)
{
SPI.beginTransaction(spisettings);
digitalWrite(TFT_DC, 0);
SPI.transfer(Cmd);
SPI.endTransaction();
}
void Lcd_WriteData(uint8_t Data)
{
SPI.beginTransaction(spisettings);
digitalWrite(TFT_DC, 1);
SPI.transfer(Data);
// SPI_WriteData(Data);
SPI.endTransaction();
}
void Lcd_WriteData_16(uint16_t Data){
SPI.beginTransaction(spisettings);
digitalWrite(TFT_DC, 1);
// SPI_WriteData(Data>>8);
// SPI_WriteData(Data);
SPI.transfer16(Data);
SPI.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);
SPI.beginTransaction(spisettings);
digitalWrite(TFT_DC, 1);
SPI.transfer(0x02);
SPI.transfer(x_start);
SPI.transfer(0x02);
SPI.transfer(x_end);
SPI.endTransaction();
Lcd_WriteIndex(0x2b);
SPI.beginTransaction(spisettings);
digitalWrite(TFT_DC, 1);
SPI.transfer(0x01);
SPI.transfer(y_start);
SPI.transfer(0x01);
SPI.transfer(y_end);
SPI.endTransaction();
Lcd_WriteIndex(0x2c);
}
void LCD_Refresh_16(){
digitalWrite(TFT_DC, 1);
for (int i=0;i<TFT_WIDTH*TFT_HIGHT;i++)
{
// vspi.transfer(TFT_GRAM[i]>>8);
SPI.transfer16(TFT_GRAM_16[i]);
}
}
void LCD_Refresh()
{
int i,j;
//SPI.beginTransaction(spisettings);
digitalWrite(TFT_DC, 1);
for (i=0;i<TFT_WIDTH*TFT_HIGHT*2;i++)
{
// vspi.transfer(TFT_GRAM[i]>>8);
SPI.transfer(TFT_GRAM[i]);
}
//SPI.endTransaction();
}
void Draw_Bmp(int x,int y,int w,int h,uint8_t *bmp){
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]=bmp[k];
k++;
}
}
}
void Draw_Bmp_16(int x,int y,int w,int h,uint16_t *bmp){
int i,j,k;
k=0;
for(j=0;j<h;j++){
for(i=0;i<w;i++){
TFT_GRAM_16[x+i+(j+y)*128]=bmp[k];
k++;
}
}
}
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
Serial.print(F("Hello! ST77xx TFT Test"));
pinMode(TFT_DC, OUTPUT);
pinMode(TFT_RST, OUTPUT);
SPI.setRX(0);
SPI.setCS(1);
SPI.setSCK(2);
SPI.setTX(3);
SPI.begin(true);
Lcd_Initial();
Lcd_SetRegion(0,0,TFT_WIDTH-1,TFT_HIGHT-1);
for(int i=0;i<TFT_WIDTH*TFT_HIGHT;i++){
TFT_GRAM_16[i]=BLUE;
// 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,bmptest);
// LCD_Refresh();
Draw_Bmp_16(10,0,106,160,bmp16);
LCD_Refresh_16();
time = millis() - time;
char buf[32];
sprintf(buf,"TIME: %d FPS: %d",time,1000/time);
Serial.println(buf);
}