I had a similar idea. In one of the older threads you mentioned that the ST7735 could be sent to sleep mode. In a data sheet of a similar device I found out that in this mode the memory of the display stays preserved. But I couldn't find out how to put the ST7789 into sleep mode. So I tried something else. It came to me by accident more or less. Remember when I said that I forgot to change the SPI_MODE back from 0 to 2? Mode 0 prevents the display from receiving data. How - that I don't know. But that was the crucial idea: I set SPI_MODE0 for ignoring the SPI bus and then back to SPI_MODE3 to listen to it again. It seems that while in MODE0 the display is "fighting back" the data as it flickers just a tiny bit. But that may also be due to bad connections on the breadboard.
here is the code:
#include <Adafruit_GFX.h> // Core graphics library
#include <Adafruit_ST7789.h> // Hardware-specific library for ST7789
#include <SD.h> // SD card & FAT filesystem library
#include <SPI.h> // Arduino SPI library
#define TFT_CS 10 // define chip select pin
#define TFT_DC 9 // define data/command pin
#define TFT_RST 8 // define reset pin, or set to -1 and connect to Arduino RESET pin
#define SD_CS 4 // SD card select pin
// Initialize Adafruit ST7789 TFT library
Adafruit_ST7789 tft = Adafruit_ST7789(-1, TFT_DC, TFT_RST);
// defines variables
bool c=false;
int32_t width;
int32_t height;
int32_t readNbytesInt(File *p_file, int position, byte nBytes)
{
if (nBytes > 4)
return 0;
p_file->seek(position);
int32_t weight = 1;
int32_t result = 0;
for (; nBytes; nBytes--)
{
result += weight * p_file->read();
weight <<= 8;
}
return result;
}
void setup() {
Serial.begin(9600);
while (!Serial);
Serial.print("Initializing SD card...");
if (!SD.begin(4)) {
Serial.println("initialization failed!");
while (1); // <- this is how you should block execution, not with returns
}
Serial.println("initialization done.");
}
void drawBMP(){
// Open
File bmpImage = SD.open("/1.bmp", FILE_READ);
int32_t dataStartingOffset = readNbytesInt(&bmpImage, 0x0A, 4);
// Change their types to int32_t (4byte)
width = readNbytesInt(&bmpImage, 0x12, 4);
height = readNbytesInt(&bmpImage, 0x16, 4);
Serial.println(width);
Serial.println(height);
int16_t pixelsize = readNbytesInt(&bmpImage, 0x1C, 2);
if (pixelsize != 24)
{
Serial.println("Image is not 24 bpp");
while (1);
}
bmpImage.seek(dataStartingOffset);//skip bitmap header
// 24bpp means you have three bytes per pixel, usually B G R
int s;
for(s=0;s<2;s++){
byte R[28800], G[28800], B[28800];
int i,j;
for(i = 0; i < 28800; i++) {
B[i] = bmpImage.read();
G[i] = bmpImage.read();
R[i] = bmpImage.read();
}
Serial.println("done read.");
tft.init(240, 240, SPI_MODE3); // <-- important to put this here. AFTER filling the array.
if(s==0)tft.setRotation(0);
tft.startWrite();
tft.setAddrWindow(0, 120*s, width, height); // first load lower half of the image, then in second run of the loop load upper half
for (i=0; i<120; i++) {
for(j=1;j<241;j++){
tft.pushColor(tft.color565(R[(i+1)*240-j],G[(i+1)*240-j],B[(i+1)*240-j])); // image is mirrored left to right, hence the transformation
}}
tft.endWrite();if(s==0)tft.init(240, 240, SPI_MODE0);} // crucial step: SPI_MODE0 prevents the display from receiving data via the SPI that is meant for the SD card reader.
bmpImage.close();
delay(10000); // showing the image for 10 seconds
}
void loop() {
if(c==false){drawBMP();c=true;} // shows image only once
// [...] any other code you want
}
for reading the BMP I used this source:
https://arduino.stackexchange.com/questions/38332/serial-write-pixels-of-a-bmp-imageof course reading takes a couple of seconds this way but the goal was achieved

step1
ps. maybe I'm going to make a video about this. Takes some work though.
edit: for wiring see attachment
edit II: video added:
https://youtu.be/xU1gWKsm9oY