diff --git a/Marlin/src/HAL/HAL_LPC1768/u8g/u8g_com_HAL_LPC1768_sw_spi.cpp b/Marlin/src/HAL/HAL_LPC1768/u8g/u8g_com_HAL_LPC1768_sw_spi.cpp
index 1419a74f42c2ef0d57e2cdbba7203b9e4d68edc3..e851284ad55ff8a0b31e57f53ce8d43e9b57e359 100644
--- a/Marlin/src/HAL/HAL_LPC1768/u8g/u8g_com_HAL_LPC1768_sw_spi.cpp
+++ b/Marlin/src/HAL/HAL_LPC1768/u8g/u8g_com_HAL_LPC1768_sw_spi.cpp
@@ -65,10 +65,76 @@
 #undef SPI_SPEED
 #define SPI_SPEED 2  // About 2 MHz
 
+#include <algorithm>
+#include <LPC17xx.h>
+#include <gpio.h>
+
+#include <Arduino.h>
+
+uint8_t swSpiTransfer_mode_0(uint8_t b, const uint8_t spi_speed, const pin_t sck_pin, const pin_t miso_pin, const pin_t mosi_pin ) {
+
+  for (uint8_t i = 0; i < 8; i++) {
+    if (spi_speed == 0) {
+      gpio_set(mosi_pin, !!(b & 0x80));
+      gpio_set(sck_pin, HIGH);
+      b <<= 1;
+      if (miso_pin >= 0 && gpio_get(miso_pin)) b |= 1;
+      gpio_set(sck_pin, LOW);
+    }
+    else {
+      const uint8_t state = (b & 0x80) ? HIGH : LOW;
+      for (uint8_t j = 0; j < spi_speed; j++)
+        gpio_set(mosi_pin, state);
+
+      for (uint8_t j = 0; j < spi_speed + (miso_pin >= 0 ? 0 : 1); j++)
+        gpio_set(sck_pin, HIGH);
+
+      b <<= 1;
+      if (miso_pin >= 0 && gpio_get(miso_pin)) b |= 1;
+
+      for (uint8_t j = 0; j < spi_speed; j++)
+        gpio_set(sck_pin, LOW);
+    }
+  }
+
+  return b;
+}
+
+uint8_t swSpiTransfer_mode_3(uint8_t b, const uint8_t spi_speed, const pin_t sck_pin, const pin_t miso_pin, const pin_t mosi_pin ) {
+
+  for (uint8_t i = 0; i < 8; i++) {
+    const uint8_t state = (b & 0x80) ? HIGH : LOW;
+    if (spi_speed == 0) {
+      gpio_set(sck_pin, LOW);
+      gpio_set(mosi_pin, state);
+      gpio_set(mosi_pin, state);  // need some setup time
+      gpio_set(sck_pin, HIGH);
+    }
+    else {
+      for (uint8_t j = 0; j < spi_speed + (miso_pin >= 0 ? 0 : 1); j++)
+        gpio_set(sck_pin, LOW);
+
+      for (uint8_t j = 0; j < spi_speed; j++)
+        gpio_set(mosi_pin, state);
+
+      for (uint8_t j = 0; j < spi_speed; j++)
+        gpio_set(sck_pin, HIGH);
+    }
+    b <<= 1;
+    if (miso_pin >= 0 && gpio_get(miso_pin)) b |= 1;
+  }
+
+  return b;
+}
+
 static uint8_t SPI_speed = 0;
 
 static void u8g_sw_spi_HAL_LPC1768_shift_out(uint8_t dataPin, uint8_t clockPin, uint8_t val) {
-  swSpiTransfer(val, SPI_speed, clockPin, -1, dataPin);
+  #if ENABLED(FYSETC_MINI_12864)
+    swSpiTransfer_mode_3(val, SPI_speed, clockPin, -1, dataPin);
+  #else
+    swSpiTransfer_mode_0(val, SPI_speed, clockPin, -1, dataPin);
+  #endif
 }
 
 uint8_t u8g_com_HAL_LPC1768_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) {
diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h
index 8581f2dd19fd379bd7c7507ac172a2e55b955d7a..320dc00ec3ef821db7ef95c8252660b986edc169 100644
--- a/Marlin/src/inc/Conditionals_LCD.h
+++ b/Marlin/src/inc/Conditionals_LCD.h
@@ -143,6 +143,8 @@
 
   #define DOGLCD
   #define ULTIPANEL
+  #define LCD_CONTRAST_MIN 0
+  #define LCD_CONTRAST_MAX 255
   #define DEFAULT_LCD_CONTRAST 255
   #define LED_COLORS_REDUCE_GREEN
 
diff --git a/Marlin/src/lcd/dogm/ultralcd_DOGM.h b/Marlin/src/lcd/dogm/ultralcd_DOGM.h
index fe799473f8dbe5f75ce12830eef95017e43214fd..1f2c90b9d9644d8b9dea07eb57f7243e2d976e0b 100644
--- a/Marlin/src/lcd/dogm/ultralcd_DOGM.h
+++ b/Marlin/src/lcd/dogm/ultralcd_DOGM.h
@@ -112,7 +112,11 @@
   //#define U8G_CLASS U8GLIB_MINI12864
   //#define U8G_PARAM DOGLCD_CS, DOGLCD_A0                            // 8 stripes
   #define U8G_CLASS U8GLIB_MINI12864_2X
-  #define U8G_PARAM DOGLCD_CS, DOGLCD_A0                              // 4 stripes
+  #if EITHER(FYSETC_MINI_12864, TARGET_LPC1768)
+    #define U8G_PARAM DOGLCD_SCK, DOGLCD_MOSI, DOGLCD_CS, DOGLCD_A0   // 4 stripes SW-SPI
+  #else
+    #define U8G_PARAM DOGLCD_CS, DOGLCD_A0                            // 4 stripes HW-SPI
+  #endif
 #elif ENABLED(U8GLIB_SH1106_EINSTART)
   // Connected via motherboard header
   #define U8G_CLASS U8GLIB_SH1106_128X64
diff --git a/Marlin/src/pins/pins_MKS_SBASE.h b/Marlin/src/pins/pins_MKS_SBASE.h
index 39667507d6d3c6c9b26d7146fba932feedbcb5d0..b99de4886b8be4b503835f4e26a93f733b85c1b5 100644
--- a/Marlin/src/pins/pins_MKS_SBASE.h
+++ b/Marlin/src/pins/pins_MKS_SBASE.h
@@ -253,6 +253,41 @@
     #define DOGLCD_SCK     SCK_PIN
     #define DOGLCD_MOSI    MOSI_PIN
   #endif
+
+  #if ENABLED(FYSETC_MINI_12864)
+    /**
+     * The Fysetc display can NOT use the SCK and MOSI pins on EXP2, so a
+     * special cable is needed to go between EXP2 on the FYSETC and the
+     * controller board's EXP2 and J8. It also means that a software SPI
+     * is needed to drive those pins.
+     *
+     * The Fysetc requires mode 3 SPI interface.
+     *
+     * Pins 6, 7 & 8 on EXP2 are no connects. That means a second special
+     * cable will be needed if the RGB LEDs are to be active.
+     */
+    #define DOGLCD_CS      LCD_PINS_ENABLE // EXP1.3  (LCD_EN on Fysetc schematic)
+    #define DOGLCD_A0      LCD_PINS_RS     // EXP1.4  (LCD_A0 on Fysetc schematic)
+    #define DOGLCD_SCK     P2_11           // J8-5  (SCK on Fysetc schematic)
+    #define DOGLCD_MOSI    P4_28           // J8-6  (MOSI on Fysetc schematic)
+
+    #define RGB_LED
+    //#define RGBW_LED
+    #if EITHER(RGB_LED, RGBW_LED)
+      #define RGB_LED_R_PIN P2_12          // J8-4  (LCD_D6 on Fysetc schematic)
+      #define RGB_LED_G_PIN P1_23          // J8-3  (LCD_D5 on Fysetc schematic)
+      #define RGB_LED_B_PIN P1_22          // J8-2  (LCD_D7 on Fysetc schematic)
+      //#define RGB_LED_W_PIN -1
+    #endif
+
+  #elif ENABLED(MINIPANEL)
+    // GLCD features
+    // Uncomment screen orientation
+    //#define LCD_SCREEN_ROT_90
+    //#define LCD_SCREEN_ROT_180
+    //#define LCD_SCREEN_ROT_270
+  #endif
+
 #endif
 
 /**
diff --git a/Marlin/src/pins/pins_RAMPS_FD_V1.h b/Marlin/src/pins/pins_RAMPS_FD_V1.h
index 8cee2e7f4d5653a6c6cfbe8f32066cc26701e358..a8bec209ef9003c3968e053531b36a2fa59111ff 100644
--- a/Marlin/src/pins/pins_RAMPS_FD_V1.h
+++ b/Marlin/src/pins/pins_RAMPS_FD_V1.h
@@ -156,7 +156,10 @@
     #define LCD_PINS_D7    29
   #endif
 
-  #if ENABLED(MINIPANEL)
+  #if ENABLED(FYSETC_MINI_12864)
+    #define DOGLCD_CS      LCD_PINS_ENABLE
+    #define DOGLCD_A0      LCD_PINS_RS
+  #elif ENABLED(MINIPANEL)
     #define DOGLCD_CS      25
     #define DOGLCD_A0      27
   #endif
diff --git a/Marlin/src/pins/pins_RAMPS_RE_ARM.h b/Marlin/src/pins/pins_RAMPS_RE_ARM.h
index 25c85a360f17cc453934e500566ca1aeea13a71c..92d91d5c6b41ceed567876b117e2bf5e214442b8 100644
--- a/Marlin/src/pins/pins_RAMPS_RE_ARM.h
+++ b/Marlin/src/pins/pins_RAMPS_RE_ARM.h
@@ -269,11 +269,21 @@
 
 #elif ENABLED(ULTRA_LCD)
 
-  #define BEEPER_PIN       P1_30   // (37) not 5V tolerant
+  //#define SCK_PIN        P0_15   // (52)  system defined J3-9 & AUX-3
+  //#define MISO_PIN       P0_17   // (50)  system defined J3-10 & AUX-3
+  //#define MOSI_PIN       P0_18   // (51)  system defined J3-10 & AUX-3
+  //#define SS_PIN         P1_23   // (53)  system defined J3-5 & AUX-3 (Sometimes called SDSS)
+
+  #if ENABLED(FYSETC_MINI_12864)
+    #define BEEPER_PIN     P1_01
+    #define BTN_ENC        P1_04
+  #else
+    #define BEEPER_PIN     P1_30   // (37) not 5V tolerant
+    #define BTN_ENC        P2_11   // (35) J3-3 & AUX-4
+  #endif
 
   #define BTN_EN1          P3_26   // (31) J3-2 & AUX-4
   #define BTN_EN2          P3_25   // (33) J3-4 & AUX-4
-  #define BTN_ENC          P2_11   // (35) J3-3 & AUX-4
 
   #define SD_DETECT_PIN    P1_31   // (49) J3-1 & AUX-3 (NOT 5V tolerant)
   #define KILL_PIN         P1_22   // (41) J5-4 & AUX-4
@@ -296,13 +306,6 @@
   #if ANY(VIKI2, miniVIKI)
     // #define LCD_SCREEN_ROT_180
 
-    #define BTN_EN1        P3_26   // (31) J3-2 & AUX-4
-    #define BTN_EN2        P3_25   // (33) J3-4 & AUX-4
-    #define BTN_ENC        P2_11   // (35) J3-3 & AUX-4
-
-    #define SD_DETECT_PIN  P1_31   // (49) J3-1 & AUX-3 (NOT 5V tolerant)
-    #define KILL_PIN       P1_22   // (41) J5-4 & AUX-4
-
     #define DOGLCD_CS      P0_16   // (16)
     #define DOGLCD_A0      P2_06   // (59) J3-8 & AUX-2
     #define DOGLCD_SCK     SCK_PIN
@@ -311,8 +314,17 @@
     #define STAT_LED_BLUE_PIN P0_26 //(63)  may change if cable changes
     #define STAT_LED_RED_PIN P1_21 // ( 6)  may change if cable changes
   #else
-    #define DOGLCD_CS      P0_26   // (63) J5-3 & AUX-2
-    #define DOGLCD_A0      P2_06   // (59) J3-8 & AUX-2
+
+    #if ENABLED(FYSETC_MINI_12864)
+      #define DOGLCD_SCK   P0_15
+      #define DOGLCD_MOSI  P0_18
+      #define DOGLCD_CS    P1_09  // use Ethernet connector for EXP1 cable signals
+      #define DOGLCD_A0    P1_14
+    #else
+      #define DOGLCD_CS    P0_26   // (63) J5-3 & AUX-2
+      #define DOGLCD_A0    P2_06   // (59) J3-8 & AUX-2
+    #endif
+
     #define LCD_BACKLIGHT_PIN P0_16 //(16) J3-7 & AUX-4 - only used on DOGLCD controllers
     #define LCD_PINS_ENABLE P0_18  // (51) (MOSI) J3-10 & AUX-3
     #define LCD_PINS_D4    P0_15   // (52) (SCK)  J3-9 & AUX-3
@@ -323,11 +335,6 @@
     #endif
   #endif
 
-  //#define MISO_PIN         P0_17   // (50)  system defined J3-10 & AUX-3
-  //#define MOSI_PIN         P0_18   // (51)  system defined J3-10 & AUX-3
-  //#define SCK_PIN          P0_15   // (52)  system defined J3-9 & AUX-3
-  //#define SS_PIN           P1_23   // (53)  system defined J3-5 & AUX-3 (Sometimes called SDSS)
-
   #if ENABLED(MINIPANEL)
     // GLCD features
     // Uncomment screen orientation
@@ -362,10 +369,10 @@
 
 #if ENABLED(LPC_SD_LCD)
 
-  #define SCK_PIN          P0_15
-  #define MISO_PIN         P0_17
-  #define MOSI_PIN         P0_18
-  #define SS_PIN           P1_23   // Chip select for SD card used by Marlin
+  #define SCK_PIN          P0_15   // (52)  system defined J3-9 & AUX-3
+  #define MISO_PIN         P0_17   // (50)  system defined J3-10 & AUX-3
+  #define MOSI_PIN         P0_18   // (51)  system defined J3-10 & AUX-3
+  #define SS_PIN           P1_23   // (53)  system defined J3-5 & AUX-3 (Sometimes called SDSS) - CS used by Marlin
   #define ONBOARD_SD_CS    P0_06   // Chip select for "System" SD card
 
 #elif ENABLED(LPC_SD_ONBOARD)