I had the same issue. When using the custom fonts, numbers were overwriting the previous one.
I suggest you to use "canvas". Canvas is a defined area on the screen, and you can easily clear it without flickering. If you wanna see an example, visit below links:
Github - no flicker!
Youtube Video
#include <Adafruit_GFX.h> //including the Adafruit GFX library
#include <Adafruit_ST7735.h> //including the Adafruit ST7735 library
#include <spi_flash.h>
#define TFT_CS 15 //defining Pins
#define TFT_RST 0 //defining Pins
#define TFT_DC 2 //defining Pins
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST); //setting the LCD with Pins defined.
#include "Robot_Kicks_Italic20pt7b.h" // This is the custom font implemented.
GFXcanvas16 canvas(160, 64); //Canvas is created for the specified area which is 160x64 pixels.
void setup()
{
tft.initR(INITR_BLACKTAB); //initializing the TFT Screen
tft.setRotation(3); // Setting the rotation
tft.fillScreen(ST7735_BLACK); // filling the screen with black color.
canvas.setFont(&Robot_Kicks_Italic20pt7b); //setting the custom Font to canvas to use.
canvas.setTextWrap(false); // setting for wrapping (false)
}
void loop()
{
for(int i = 0; i <= 1000; i++) //counter starts from 0 to 1000
{
canvas.fillScreen(ST7735_BLACK); //fill only the defined canvas, not the whole screen.
canvas.setTextColor(ST7735_GREEN); // setting the font color to green
canvas.setCursor(12, 30); // Pos. is BASE LINE when using fonts!
canvas.print(i); //printing "i" from one to 1000
tft.drawRGBBitmap(0, 45, canvas.getBuffer(), canvas.width(), canvas.height()); // this line pushes the entire thing above to the specified area, canvas.
delay(25); //this is the delay of mili seconds for each element in the counter.
}
}
*Mono*are monospaced, which means that all the characters are the same size.