To reduce flickering, if I recall correctly, I'd call any TFT function only when really needed.
So do not write "waiting for sats" when it is already displayed, and do not change hours, minutes or seconds when they haven't changed.
So lets say seconds changed, but minutes and hours didn't; then only write the seconds.
So your "//TESTING" section should probably become a separate function.
Additionally, I'd save the text elements in global variables, so each time you'd like to do a tft.print call, you can first check if the value has changed or not.
If it changed, then print, else move on to the next text.
You can use setTextColor( color, backgroundcolor ); for that (background = black) - this way "new" text will overwrite existing text with a black background effectively erasing the previous pixels at that cursor position.
You may have to do some experiments with that.
I'd also avoid calling "tft.fillScreen(ST7735_BLACK);" as it blanks the entire screen - which will look like flickering.
I hope that makes sense. 😊
I also recall that most displays have a slow mode and a fast mode, but I didn't check your code for that - it's been quite a while that I have used a display.
As for the "waiting for sats" message; you'd have to put a loop in setup() to wait for initial signal.
Not sure about the exact gps commands (not sure if ss.available works this way) but probably something like this:
void setup()
{
Serial.begin(9600);
ss.begin(GPSBaud);
tft.initR(INITR_GREENTAB);
tft.fillScreen(ST7735_BLACK);
tft.setCursor(5, 58);
tft.setTextSize(1);
tft.setTextColor(ST7735_GREEN,ST7735_BLACK);
// tft.setCursor(5, 58);
tft.print(" Waiting for Sats");
Serial.print("Acquiring GPS signal ");
while (ss.available() == 0)
{
delay(100);
Serial.print(".");
}
Serial.println("\nAt least one satellite found ...");
}