diff --git a/Marlin/src/HAL/LPC1768/inc/SanityCheck.h b/Marlin/src/HAL/LPC1768/inc/SanityCheck.h
index 11b8761550d..14890bcd6ec 100644
--- a/Marlin/src/HAL/LPC1768/inc/SanityCheck.h
+++ b/Marlin/src/HAL/LPC1768/inc/SanityCheck.h
@@ -116,7 +116,7 @@ static_assert(DISABLED(BAUD_RATE_GCODE), "BAUD_RATE_GCODE is not yet supported o
   #elif HAS_WIRED_LCD
     #if IS_TX1(BTN_EN2) || IS_RX1(BTN_EN1)
       #error "Serial port pins (1) conflict with Encoder Buttons!"
-    #elif ANY_TX(1, SD_SCK_PIN, LCD_PINS_D4, DOGLCD_SCK, LCD_RESET_PIN, LCD_PINS_RS, SHIFT_CLK) \
+    #elif ANY_TX(1, SD_SCK_PIN, LCD_PINS_D4, DOGLCD_SCK, LCD_RESET_PIN, LCD_PINS_RS, SHIFT_CLK_PIN) \
        || ANY_RX(1, LCD_SDSS, LCD_PINS_RS, SD_MISO_PIN, DOGLCD_A0, SD_SS_PIN, LCD_SDSS, DOGLCD_CS, LCD_RESET_PIN, LCD_BACKLIGHT_PIN)
       #error "Serial port pins (1) conflict with LCD pins!"
     #endif
diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h
index 7ebb9168f6d..2547425885f 100644
--- a/Marlin/src/inc/SanityCheck.h
+++ b/Marlin/src/inc/SanityCheck.h
@@ -1595,7 +1595,7 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal
 /**
  * ULTIPANEL encoder
  */
-#if IS_ULTIPANEL && NONE(IS_NEWPANEL, SR_LCD_2W_NL) && !defined(SHIFT_CLK)
+#if IS_ULTIPANEL && NONE(IS_NEWPANEL, SR_LCD_2W_NL) && !PIN_EXISTS(SHIFT_CLK)
   #error "ULTIPANEL controllers require some kind of encoder."
 #endif
 
diff --git a/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.h b/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.h
index eedcc4afa07..c399b907e46 100644
--- a/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.h
+++ b/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.h
@@ -61,15 +61,12 @@ extern TFTGLCD lcd;
 #include "../lcdprint.h"
 
 // Use panel encoder - free old encoder pins
-#undef  BTN_EN1
-#undef  BTN_EN2
-#undef  BTN_ENC
-#define BTN_EN1     -1
-#define BTN_EN2     -1
-#define BTN_ENC     -1
+#undef BTN_EN1
+#undef BTN_EN2
+#undef BTN_ENC
 
 #ifndef EN_C
-  #define EN_C       4 //for click
+  #define EN_C       4 // for click
 #endif
 
 #endif // IS_TFTGLCD_PANEL
diff --git a/Marlin/src/lcd/buttons.h b/Marlin/src/lcd/buttons.h
new file mode 100644
index 00000000000..07a4524def1
--- /dev/null
+++ b/Marlin/src/lcd/buttons.h
@@ -0,0 +1,234 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ *
+ */
+#pragma once
+
+#include "../inc/MarlinConfig.h"
+
+#if ((!HAS_ADC_BUTTONS && IS_NEWPANEL) || BUTTONS_EXIST(EN1, EN2)) && !IS_TFTGLCD_PANEL
+  #define HAS_ENCODER_WHEEL 1
+#endif
+#if HAS_ENCODER_WHEEL || ANY_BUTTON(ENC, BACK, UP, DWN, LFT, RT)
+  #define HAS_DIGITAL_BUTTONS 1
+#endif
+#if !HAS_ADC_BUTTONS && (IS_RRW_KEYPAD || (HAS_WIRED_LCD && !IS_NEWPANEL))
+  #define HAS_SHIFT_ENCODER 1
+#endif
+
+// I2C buttons must be read in the main thread
+#if ANY(LCD_I2C_VIKI, LCD_I2C_PANELOLU2, IS_TFTGLCD_PANEL)
+  #define HAS_SLOW_BUTTONS 1
+#endif
+
+#if HAS_ENCODER_WHEEL
+  #define ENCODER_PHASE_0 0
+  #define ENCODER_PHASE_1 2
+  #define ENCODER_PHASE_2 3
+  #define ENCODER_PHASE_3 1
+#endif
+
+#if EITHER(HAS_DIGITAL_BUTTONS, DWIN_CREALITY_LCD)
+
+  // Wheel spin pins where BA is 00, 10, 11, 01 (1 bit always changes)
+  #define BLEN_A 0
+  #define BLEN_B 1
+
+  #define EN_A _BV(BLEN_A)
+  #define EN_B _BV(BLEN_B)
+
+  #define _BUTTON_PRESSED(BN) !READ(BTN_##BN)
+
+  #if BUTTON_EXISTS(ENC) || HAS_TOUCH_BUTTONS
+    #define BLEN_C 2
+    #define EN_C _BV(BLEN_C)
+  #endif
+
+  #if ENABLED(LCD_I2C_VIKI)
+
+    #include <LiquidTWI2.h>
+
+    #define B_I2C_BTN_OFFSET 3 // (the first three bit positions reserved for EN_A, EN_B, EN_C)
+
+    // button and encoder bit positions within 'buttons'
+    #define B_LE (BUTTON_LEFT   << B_I2C_BTN_OFFSET)      // The remaining normalized buttons are all read via I2C
+    #define B_UP (BUTTON_UP     << B_I2C_BTN_OFFSET)
+    #define B_MI (BUTTON_SELECT << B_I2C_BTN_OFFSET)
+    #define B_DW (BUTTON_DOWN   << B_I2C_BTN_OFFSET)
+    #define B_RI (BUTTON_RIGHT  << B_I2C_BTN_OFFSET)
+
+    #if BUTTON_EXISTS(ENC)                                // The pause/stop/restart button is connected to BTN_ENC when used
+      #define B_ST (EN_C)                                 // Map the pause/stop/resume button into its normalized functional name
+      #define BUTTON_CLICK() (buttons & (B_MI|B_RI|B_ST)) // Pause/stop also acts as click until a proper pause/stop is implemented.
+    #else
+      #define BUTTON_CLICK() (buttons & (B_MI|B_RI))
+    #endif
+
+    // I2C buttons take too long to read inside an interrupt context and so we read them during lcd_update
+
+  #elif ENABLED(LCD_I2C_PANELOLU2)
+
+    #if !BUTTON_EXISTS(ENC) // Use I2C if not directly connected to a pin
+
+      #define B_I2C_BTN_OFFSET 3 // (the first three bit positions reserved for EN_A, EN_B, EN_C)
+
+      #define B_MI (PANELOLU2_ENCODER_C << B_I2C_BTN_OFFSET) // requires LiquidTWI2 library v1.2.3 or later
+
+      #define BUTTON_CLICK() (buttons & B_MI)
+
+    #endif
+
+  #endif
+
+#else
+
+  #undef BUTTON_EXISTS
+  #define BUTTON_EXISTS(...) false
+
+  // Dummy button, never pressed
+  #define _BUTTON_PRESSED(BN) false
+
+  // Shift register bits correspond to buttons:
+  #define BL_LE 7   // Left
+  #define BL_UP 6   // Up
+  #define BL_MI 5   // Middle
+  #define BL_DW 4   // Down
+  #define BL_RI 3   // Right
+  #define BL_ST 2   // Red Button
+  #define B_LE _BV(BL_LE)
+  #define B_UP _BV(BL_UP)
+  #define B_MI _BV(BL_MI)
+  #define B_DW _BV(BL_DW)
+  #define B_RI _BV(BL_RI)
+  #define B_ST _BV(BL_ST)
+
+  #ifndef BUTTON_CLICK
+    #define BUTTON_CLICK() (buttons & (B_MI|B_ST))
+  #endif
+
+#endif
+
+#if IS_RRW_KEYPAD
+  #define BTN_OFFSET          0 // Bit offset into buttons for shift register values
+
+  #define BLEN_KEYPAD_F3      0
+  #define BLEN_KEYPAD_F2      1
+  #define BLEN_KEYPAD_F1      2
+  #define BLEN_KEYPAD_DOWN    3
+  #define BLEN_KEYPAD_RIGHT   4
+  #define BLEN_KEYPAD_MIDDLE  5
+  #define BLEN_KEYPAD_UP      6
+  #define BLEN_KEYPAD_LEFT    7
+
+  #define EN_KEYPAD_F1      _BV(BTN_OFFSET + BLEN_KEYPAD_F1)
+  #define EN_KEYPAD_F2      _BV(BTN_OFFSET + BLEN_KEYPAD_F2)
+  #define EN_KEYPAD_F3      _BV(BTN_OFFSET + BLEN_KEYPAD_F3)
+  #define EN_KEYPAD_DOWN    _BV(BTN_OFFSET + BLEN_KEYPAD_DOWN)
+  #define EN_KEYPAD_RIGHT   _BV(BTN_OFFSET + BLEN_KEYPAD_RIGHT)
+  #define EN_KEYPAD_MIDDLE  _BV(BTN_OFFSET + BLEN_KEYPAD_MIDDLE)
+  #define EN_KEYPAD_UP      _BV(BTN_OFFSET + BLEN_KEYPAD_UP)
+  #define EN_KEYPAD_LEFT    _BV(BTN_OFFSET + BLEN_KEYPAD_LEFT)
+
+  #define RRK(B) (keypad_buttons & (B))
+
+  #ifdef EN_C
+    #define BUTTON_CLICK() ((buttons & EN_C) || RRK(EN_KEYPAD_MIDDLE))
+  #else
+    #define BUTTON_CLICK() RRK(EN_KEYPAD_MIDDLE)
+  #endif
+#endif
+
+#ifndef EN_A
+  #define EN_A 0
+#endif
+#ifndef EN_B
+  #define EN_B 0
+#endif
+#ifndef EN_C
+  #define EN_C 0
+#endif
+#if BUTTON_EXISTS(BACK) || EITHER(HAS_TOUCH_BUTTONS, IS_TFTGLCD_PANEL)
+  #define BLEN_D 3
+  #define EN_D _BV(BLEN_D)
+#else
+  #define EN_D 0
+#endif
+
+#define BUTTON_PRESSED(BN) (_BUTTON_PRESSED_##BN)
+
+#if BUTTON_EXISTS(EN1)
+  #define _BUTTON_PRESSED_EN1 _BUTTON_PRESSED(EN1)
+#else
+  #define _BUTTON_PRESSED_EN1 false
+#endif
+#if BUTTON_EXISTS(EN2)
+  #define _BUTTON_PRESSED_EN2 _BUTTON_PRESSED(EN2)
+#else
+  #define _BUTTON_PRESSED_EN2 false
+#endif
+#if BUTTON_EXISTS(ENC_EN)
+  #define _BUTTON_PRESSED_ENC_EN _BUTTON_PRESSED(ENC_EN)
+#else
+  #define _BUTTON_PRESSED_ENC_EN false
+#endif
+#if BUTTON_EXISTS(ENC)
+  #define _BUTTON_PRESSED_ENC _BUTTON_PRESSED(ENC)
+#else
+  #define _BUTTON_PRESSED_ENC false
+#endif
+#if BUTTON_EXISTS(UP)
+  #define _BUTTON_PRESSED_UP _BUTTON_PRESSED(UP)
+#else
+  #define _BUTTON_PRESSED_UP false
+#endif
+#if BUTTON_EXISTS(DWN)
+  #define _BUTTON_PRESSED_DWN _BUTTON_PRESSED(DWN)
+#else
+  #define _BUTTON_PRESSED_DWN false
+#endif
+#if BUTTON_EXISTS(LFT)
+  #define _BUTTON_PRESSED_LFT _BUTTON_PRESSED(LFT)
+#else
+  #define _BUTTON_PRESSED_LFT false
+#endif
+#if BUTTON_EXISTS(RT)
+  #define _BUTTON_PRESSED_RT _BUTTON_PRESSED(RT)
+#else
+  #define _BUTTON_PRESSED_RT false
+#endif
+#if BUTTON_EXISTS(BACK)
+  #define _BUTTON_PRESSED_BACK _BUTTON_PRESSED(BACK)
+#else
+  #define _BUTTON_PRESSED_BACK false
+#endif
+
+#ifndef BUTTON_CLICK
+  #if EN_C > 0
+    #define BUTTON_CLICK() (buttons & EN_C)
+  #else
+    #define BUTTON_CLICK() false
+  #endif
+#endif
+
+#if EN_D > 0
+  #define LCD_BACK_CLICKED() (buttons & EN_D)
+#else
+  #define LCD_BACK_CLICKED() false
+#endif
diff --git a/Marlin/src/lcd/dwin/e3v2/rotary_encoder.cpp b/Marlin/src/lcd/dwin/e3v2/rotary_encoder.cpp
index d39c6cfbd5e..6c229b7aca2 100644
--- a/Marlin/src/lcd/dwin/e3v2/rotary_encoder.cpp
+++ b/Marlin/src/lcd/dwin/e3v2/rotary_encoder.cpp
@@ -33,6 +33,7 @@
 #if ENABLED(DWIN_CREALITY_LCD)
 
 #include "rotary_encoder.h"
+#include "../../buttons.h"
 
 #include "../../../MarlinCore.h"
 #include "../../../HAL/shared/Delay.h"
@@ -43,17 +44,23 @@
 
 #include <stdlib.h>
 
+#ifndef ENCODER_PULSES_PER_STEP
+  #define ENCODER_PULSES_PER_STEP 4
+#endif
+
 ENCODER_Rate EncoderRate;
 
 // Buzzer
-void Encoder_tick(void) {
-  WRITE(BEEPER_PIN, 1);
-  delay(10);
-  WRITE(BEEPER_PIN, 0);
+void Encoder_tick() {
+  #if PIN_EXISTS(BEEPER)
+    WRITE(BEEPER_PIN, HIGH);
+    delay(10);
+    WRITE(BEEPER_PIN, LOW);
+  #endif
 }
 
 // Encoder initialization
-void Encoder_Configuration(void) {
+void Encoder_Configuration() {
   #if BUTTON_EXISTS(EN1)
     SET_INPUT_PULLUP(BTN_EN1);
   #endif
@@ -63,21 +70,21 @@ void Encoder_Configuration(void) {
   #if BUTTON_EXISTS(ENC)
     SET_INPUT_PULLUP(BTN_ENC);
   #endif
-  #ifdef BEEPER_PIN
+  #if PIN_EXISTS(BEEPER)
     SET_OUTPUT(BEEPER_PIN);
   #endif
 }
 
 // Analyze encoder value and return state
-ENCODER_DiffState Encoder_ReceiveAnalyze(void) {
+ENCODER_DiffState Encoder_ReceiveAnalyze() {
   const millis_t now = millis();
-  static unsigned char lastEncoderBits;
-  unsigned char newbutton = 0;
+  static uint8_t lastEncoderBits;
+  uint8_t newbutton = 0;
   static signed char temp_diff = 0;
 
   ENCODER_DiffState temp_diffState = ENCODER_DIFF_NO;
-  if (BUTTON_PRESSED(EN1)) newbutton |= 0x01;
-  if (BUTTON_PRESSED(EN2)) newbutton |= 0x02;
+  if (BUTTON_PRESSED(EN1)) newbutton |= EN_A;
+  if (BUTTON_PRESSED(EN2)) newbutton |= EN_B;
   if (BUTTON_PRESSED(ENC)) {
     static millis_t next_click_update_ms;
     if (ELAPSED(now, next_click_update_ms)) {
@@ -94,22 +101,22 @@ ENCODER_DiffState Encoder_ReceiveAnalyze(void) {
   }
   if (newbutton != lastEncoderBits) {
     switch (newbutton) {
-      case ENCODER_PHASE_0: {
-        if (lastEncoderBits == ENCODER_PHASE_3) temp_diff++;
+      case ENCODER_PHASE_0:
+             if (lastEncoderBits == ENCODER_PHASE_3) temp_diff++;
         else if (lastEncoderBits == ENCODER_PHASE_1) temp_diff--;
-      }break;
-      case ENCODER_PHASE_1: {
-        if (lastEncoderBits == ENCODER_PHASE_0) temp_diff++;
+        break;
+      case ENCODER_PHASE_1:
+             if (lastEncoderBits == ENCODER_PHASE_0) temp_diff++;
         else if (lastEncoderBits == ENCODER_PHASE_2) temp_diff--;
-      }break;
-      case ENCODER_PHASE_2: {
-        if (lastEncoderBits == ENCODER_PHASE_1) temp_diff++;
+        break;
+      case ENCODER_PHASE_2:
+             if (lastEncoderBits == ENCODER_PHASE_1) temp_diff++;
         else if (lastEncoderBits == ENCODER_PHASE_3) temp_diff--;
-      }break;
-      case ENCODER_PHASE_3: {
-        if (lastEncoderBits == ENCODER_PHASE_2) temp_diff++;
+        break;
+      case ENCODER_PHASE_3:
+             if (lastEncoderBits == ENCODER_PHASE_2) temp_diff++;
         else if (lastEncoderBits == ENCODER_PHASE_0) temp_diff--;
-      }break;
+        break;
     }
     lastEncoderBits = newbutton;
   }
@@ -137,9 +144,12 @@ ENCODER_DiffState Encoder_ReceiveAnalyze(void) {
         }
         EncoderRate.lastEncoderTime = ms;
       }
+
     #else
+
       constexpr int32_t encoderMultiplier = 1;
-    #endif // ENCODER_RATE_MULTIPLIER
+
+    #endif
 
     // EncoderRate.encoderMoveValue += (temp_diff * encoderMultiplier) / (ENCODER_PULSES_PER_STEP);
     EncoderRate.encoderMoveValue = (temp_diff * encoderMultiplier) / (ENCODER_PULSES_PER_STEP);
@@ -153,23 +163,23 @@ ENCODER_DiffState Encoder_ReceiveAnalyze(void) {
 #if PIN_EXISTS(LCD_LED)
 
   // Take the low 24 valid bits  24Bit: G7 G6 G5 G4 G3 G2 G1 G0 R7 R6 R5 R4 R3 R2 R1 R0 B7 B6 B5 B4 B3 B2 B1 B0
-  unsigned int LED_DataArray[LED_NUM];
+  uint16_t LED_DataArray[LED_NUM];
 
   // LED light operation
-  void LED_Action(void) {
+  void LED_Action() {
     LED_Control(RGB_SCALE_WARM_WHITE,0x0F);
     delay(30);
     LED_Control(RGB_SCALE_WARM_WHITE,0x00);
   }
 
   // LED initialization
-  void LED_Configuration(void) {
+  void LED_Configuration() {
     SET_OUTPUT(LCD_LED_PIN);
   }
 
   // LED write data
-  void LED_WriteData(void) {
-    unsigned char tempCounter_LED, tempCounter_Bit;
+  void LED_WriteData() {
+    uint8_t tempCounter_LED, tempCounter_Bit;
     for (tempCounter_LED = 0; tempCounter_LED < LED_NUM; tempCounter_LED++) {
       for (tempCounter_Bit = 0; tempCounter_Bit < 24; tempCounter_Bit++) {
         if (LED_DataArray[tempCounter_LED] & (0x800000 >> tempCounter_Bit)) {
@@ -190,14 +200,13 @@ ENCODER_DiffState Encoder_ReceiveAnalyze(void) {
   // LED control
   //  RGB_Scale: RGB color ratio
   //  luminance: brightness (0~0xFF)
-  void LED_Control(unsigned char RGB_Scale, unsigned char luminance) {
-    unsigned char temp_Counter;
-    for (temp_Counter = 0; temp_Counter < LED_NUM; temp_Counter++) {
-      LED_DataArray[temp_Counter] = 0;
+  void LED_Control(const uint8_t RGB_Scale, const uint8_t luminance) {
+    for (uint8_t i = 0; i < LED_NUM; i++) {
+      LED_DataArray[i] = 0;
       switch (RGB_Scale) {
-        case RGB_SCALE_R10_G7_B5: LED_DataArray[temp_Counter] = (luminance*10/10) << 8 | (luminance*7/10) << 16 | luminance*5/10; break;
-        case RGB_SCALE_R10_G7_B4: LED_DataArray[temp_Counter] = (luminance*10/10) << 8 | (luminance*7/10) << 16 | luminance*4/10; break;
-        case RGB_SCALE_R10_G8_B7: LED_DataArray[temp_Counter] = (luminance*10/10) << 8 | (luminance*8/10) << 16 | luminance*7/10; break;
+        case RGB_SCALE_R10_G7_B5: LED_DataArray[i] = (luminance * 10/10) << 8 | (luminance * 7/10) << 16 | luminance * 5/10; break;
+        case RGB_SCALE_R10_G7_B4: LED_DataArray[i] = (luminance * 10/10) << 8 | (luminance * 7/10) << 16 | luminance * 4/10; break;
+        case RGB_SCALE_R10_G8_B7: LED_DataArray[i] = (luminance * 10/10) << 8 | (luminance * 8/10) << 16 | luminance * 7/10; break;
       }
     }
     LED_WriteData();
@@ -207,45 +216,38 @@ ENCODER_DiffState Encoder_ReceiveAnalyze(void) {
   //  RGB_Scale: RGB color ratio
   //  luminance: brightness (0~0xFF)
   //  change_Time: gradient time (ms)
-  void LED_GraduallyControl(unsigned char RGB_Scale, unsigned char luminance, unsigned int change_Interval) {
-    unsigned char temp_Counter;
-    unsigned char LED_R_Data[LED_NUM], LED_G_Data[LED_NUM], LED_B_Data[LED_NUM];
-    bool LED_R_Flag = 0, LED_G_Flag = 0, LED_B_Flag = 0;
-
-    for (temp_Counter = 0; temp_Counter < LED_NUM; temp_Counter++) {
+  void LED_GraduallyControl(const uint8_t RGB_Scale, const uint8_t luminance, const uint16_t change_Interval) {
+    struct { uint8_t g, r, b; } led_data[LED_NUM];
+    for (uint8_t i = 0; i < LED_NUM; i++) {
       switch (RGB_Scale) {
-        case RGB_SCALE_R10_G7_B5: {
-          LED_R_Data[temp_Counter] = luminance*10/10;
-          LED_G_Data[temp_Counter] = luminance*7/10;
-          LED_B_Data[temp_Counter] = luminance*5/10;
-        }break;
-        case RGB_SCALE_R10_G7_B4: {
-          LED_R_Data[temp_Counter] = luminance*10/10;
-          LED_G_Data[temp_Counter] = luminance*7/10;
-          LED_B_Data[temp_Counter] = luminance*4/10;
-        }break;
-        case RGB_SCALE_R10_G8_B7: {
-          LED_R_Data[temp_Counter] = luminance*10/10;
-          LED_G_Data[temp_Counter] = luminance*8/10;
-          LED_B_Data[temp_Counter] = luminance*7/10;
-        }break;
+        case RGB_SCALE_R10_G7_B5:
+          led_data[i] = { luminance * 7/10, luminance * 10/10, luminance * 5/10 };
+          break;
+        case RGB_SCALE_R10_G7_B4:
+          led_data[i] = { luminance * 7/10, luminance * 10/10, luminance * 4/10 };
+          break;
+        case RGB_SCALE_R10_G8_B7:
+          led_data[i] = { luminance * 8/10, luminance * 10/10, luminance * 7/10 };
+          break;
       }
     }
-      for (temp_Counter = 0; temp_Counter < LED_NUM; temp_Counter++) {
-        if ((unsigned char)(LED_DataArray[temp_Counter] >> 8) > LED_R_Data[temp_Counter]) LED_DataArray[temp_Counter] -= 0x000100;
-        else if ((unsigned char)(LED_DataArray[temp_Counter] >> 8) < LED_R_Data[temp_Counter]) LED_DataArray[temp_Counter] += 0x000100;
-    while (1) {
-        else LED_R_Flag = 1;
-        if ((unsigned char)(LED_DataArray[temp_Counter]>>16) > LED_G_Data[temp_Counter]) LED_DataArray[temp_Counter] -= 0x010000;
-        else if ((unsigned char)(LED_DataArray[temp_Counter]>>16) < LED_G_Data[temp_Counter]) LED_DataArray[temp_Counter] += 0x010000;
-        else LED_G_Flag = 1;
-        if ((unsigned char)LED_DataArray[temp_Counter] > LED_B_Data[temp_Counter]) LED_DataArray[temp_Counter] -= 0x000001;
-        else if ((unsigned char)LED_DataArray[temp_Counter] < LED_B_Data[temp_Counter]) LED_DataArray[temp_Counter] += 0x000001;
-        else LED_B_Flag = 1;
+
+    struct { bool g, r, b; } led_flag = { false, false, false };
+    for (uint8_t i = 0; i < LED_NUM; i++) {
+      while (1) {
+        const uint8_t g = uint8_t(LED_DataArray[i] >> 16),
+                      r = uint8_t(LED_DataArray[i] >> 8),
+                      b = uint8_t(LED_DataArray[i]);
+        if (g == led_data[i].g) led_flag.g = true;
+        else LED_DataArray[i] += (g > led_data[i].g) ? -0x010000 : 0x010000;
+        if (r == led_data[i].r) led_flag.r = true;
+        else LED_DataArray[i] += (r > led_data[i].r) ? -0x000100 : 0x000100;
+        if (b == led_data[i].b) led_flag.b = true;
+        else LED_DataArray[i] += (b > led_data[i].b) ? -0x000001 : 0x000001;
+        LED_WriteData();
+        if (led_flag.r && led_flag.g && led_flag.b) break;
+        delay(change_Interval);
       }
-      LED_WriteData();
-      if (LED_R_Flag && LED_G_Flag && LED_B_Flag) break;
-      else delay(change_Interval);
     }
   }
 
diff --git a/Marlin/src/lcd/dwin/e3v2/rotary_encoder.h b/Marlin/src/lcd/dwin/e3v2/rotary_encoder.h
index 93e54839d62..bbba753a0ba 100644
--- a/Marlin/src/lcd/dwin/e3v2/rotary_encoder.h
+++ b/Marlin/src/lcd/dwin/e3v2/rotary_encoder.h
@@ -34,15 +34,6 @@
 
 /*********************** Encoder Set ***********************/
 
-#define ENCODER_PHASE_0  0
-#define ENCODER_PHASE_1  2
-#define ENCODER_PHASE_2  3
-#define ENCODER_PHASE_3  1
-
-#define ENCODER_PULSES_PER_STEP  4
-
-#define BUTTON_PRESSED(BN) !READ(BTN_## BN)
-
 typedef struct {
   bool enabled = false;
   int encoderMoveValue = 0;
@@ -59,10 +50,10 @@ typedef enum {
 } ENCODER_DiffState;
 
 // Encoder initialization
-void Encoder_Configuration(void);
+void Encoder_Configuration();
 
 // Analyze encoder value and return state
-ENCODER_DiffState Encoder_ReceiveAnalyze(void);
+ENCODER_DiffState Encoder_ReceiveAnalyze();
 
 /*********************** Encoder LED ***********************/
 
@@ -82,23 +73,23 @@ ENCODER_DiffState Encoder_ReceiveAnalyze(void);
   extern unsigned int LED_DataArray[LED_NUM];
 
   // LED light operation
-  void LED_Action(void);
+  void LED_Action();
 
   // LED initialization
-  void LED_Configuration(void);
+  void LED_Configuration();
 
   // LED write data
-  void LED_WriteData(void);
+  void LED_WriteData();
 
   // LED control
   //  RGB_Scale: RGB color ratio
   //  luminance: brightness (0~0xFF)
-  void LED_Control(unsigned char RGB_Scale, unsigned char luminance);
+  void LED_Control(const uint8_t RGB_Scale, const uint8_t luminance);
 
   // LED gradient control
   //  RGB_Scale: RGB color ratio
   //  luminance: brightness (0~0xFF)
   //  change_Time: gradient time (ms)
-  void LED_GraduallyControl(unsigned char RGB_Scale, unsigned char luminance, unsigned int change_Interval);
+  void LED_GraduallyControl(const uint8_t RGB_Scale, const uint8_t luminance, const uint16_t change_Interval);
 
 #endif // LCD_LED
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp
index f13a4b36cfb..097c1aeadc0 100644
--- a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp
+++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp
@@ -468,19 +468,10 @@ void lv_encoder_pin_init() {
         #if ANY_BUTTON(EN1, EN2, ENC, BACK)
 
           uint8_t newbutton = 0;
-
-          #if BUTTON_EXISTS(EN1)
-            if (BUTTON_PRESSED(EN1)) newbutton |= EN_A;
-          #endif
-          #if BUTTON_EXISTS(EN2)
-            if (BUTTON_PRESSED(EN2)) newbutton |= EN_B;
-          #endif
-          #if BUTTON_EXISTS(ENC)
-            if (BUTTON_PRESSED(ENC)) newbutton |= EN_C;
-          #endif
-          #if BUTTON_EXISTS(BACK)
-            if (BUTTON_PRESSED(BACK)) newbutton |= EN_D;
-          #endif
+          if (BUTTON_PRESSED(EN1)) newbutton |= EN_A;
+          if (BUTTON_PRESSED(EN2)) newbutton |= EN_B;
+          if (BUTTON_PRESSED(ENC)) newbutton |= EN_C;
+          if (BUTTON_PRESSED(BACK)) newbutton |= EN_D;
 
         #else
 
@@ -488,7 +479,6 @@ void lv_encoder_pin_init() {
 
         #endif
 
-
         static uint8_t buttons = 0;
         buttons = newbutton;
         static uint8_t lastEncoderBits;
diff --git a/Marlin/src/lcd/lcdprint.h b/Marlin/src/lcd/lcdprint.h
index cf34a7ade92..b7732d31988 100644
--- a/Marlin/src/lcd/lcdprint.h
+++ b/Marlin/src/lcd/lcdprint.h
@@ -76,8 +76,8 @@
   #define INFO_FONT_HEIGHT (INFO_FONT_ASCENT + INFO_FONT_DESCENT)
   #define INFO_FONT_WIDTH   6
 
-  #define SETCURSOR(col, row)    lcd_moveto((col) * (MENU_FONT_WIDTH), ((row) + 1) * (MENU_FONT_HEIGHT))
-  #define SETCURSOR_RJ(len, row) lcd_moveto(LCD_PIXEL_WIDTH - (len) * (MENU_FONT_WIDTH), ((row) + 1) * (MENU_FONT_HEIGHT))
+  #define LCD_COL_X(col) ((    (col)) * (MENU_FONT_WIDTH))
+  #define LCD_ROW_Y(row) ((1 + (row)) * (MENU_FONT_HEIGHT))
 
 #else
 
@@ -94,14 +94,18 @@
   #define LCD_PIXEL_WIDTH   LCD_WIDTH
   #define LCD_PIXEL_HEIGHT  LCD_HEIGHT
 
-  #define SETCURSOR(col, row)    lcd_moveto(col, row)
-  #define SETCURSOR_RJ(len, row) SETCURSOR(LCD_WIDTH - (len), row)
+  #define LCD_COL_X(col) (col)
+  #define LCD_ROW_Y(row) (row)
 
 #endif
 
-#define SETCURSOR_X(col)    SETCURSOR(col, _lcdLineNr)
-#define SETCURSOR_X_RJ(len) SETCURSOR_RJ(len, _lcdLineNr)
-#define START_OF_UTF8_CHAR(C) (((C) & 0xC0u) != 0x80U)
+#define LCD_COL_X_RJ(len)      (LCD_PIXEL_WIDTH - LCD_COL_X(len))
+#define LCD_BOTTOM_ROW         (LCD_PIXEL_HEIGHT - 1)
+#define SETCURSOR(col, row)    lcd_moveto(LCD_COL_X(col), LCD_ROW_Y(row))
+#define SETCURSOR_RJ(len, row) lcd_moveto(LCD_COL_X_RJ(len), LCD_ROW_Y(row))
+#define SETCURSOR_X(col)       SETCURSOR(col, _lcdLineNr)
+#define SETCURSOR_X_RJ(len)    SETCURSOR_RJ(len, _lcdLineNr)
+#define START_OF_UTF8_CHAR(C)  (((C) & 0xC0u) != 0x80U)
 
 int lcd_glyph_height();
 
diff --git a/Marlin/src/lcd/marlinui.cpp b/Marlin/src/lcd/marlinui.cpp
index e59b72f47d8..430bfcf48e9 100644
--- a/Marlin/src/lcd/marlinui.cpp
+++ b/Marlin/src/lcd/marlinui.cpp
@@ -342,7 +342,6 @@ void MarlinUI::init() {
   init_lcd();
 
   #if HAS_DIGITAL_BUTTONS
-
     #if BUTTON_EXISTS(EN1)
       SET_INPUT_PULLUP(BTN_EN1);
     #endif
@@ -352,15 +351,12 @@ void MarlinUI::init() {
     #if BUTTON_EXISTS(ENC)
       SET_INPUT_PULLUP(BTN_ENC);
     #endif
-
     #if BUTTON_EXISTS(ENC_EN)
       SET_INPUT_PULLUP(BTN_ENC_EN);
     #endif
-
     #if BUTTON_EXISTS(BACK)
       SET_INPUT_PULLUP(BTN_BACK);
     #endif
-
     #if BUTTON_EXISTS(UP)
       SET_INPUT(BTN_UP);
     #endif
@@ -373,8 +369,7 @@ void MarlinUI::init() {
     #if BUTTON_EXISTS(RT)
       SET_INPUT(BTN_RT);
     #endif
-
-  #endif // !HAS_DIGITAL_BUTTONS
+  #endif
 
   #if HAS_SHIFT_ENCODER
 
@@ -383,14 +378,14 @@ void MarlinUI::init() {
       SET_OUTPUT(SR_DATA_PIN);
       SET_OUTPUT(SR_CLK_PIN);
 
-    #elif defined(SHIFT_CLK)
+    #elif PIN_EXISTS(SHIFT_CLK)
 
-      SET_OUTPUT(SHIFT_CLK);
-      OUT_WRITE(SHIFT_LD, HIGH);
-      #if defined(SHIFT_EN) && SHIFT_EN >= 0
-        OUT_WRITE(SHIFT_EN, LOW);
+      SET_OUTPUT(SHIFT_CLK_PIN);
+      OUT_WRITE(SHIFT_LD_PIN, HIGH);
+      #if PIN_EXISTS(SHIFT_EN)
+        OUT_WRITE(SHIFT_EN_PIN, LOW);
       #endif
-      SET_INPUT_PULLUP(SHIFT_OUT);
+      SET_INPUT_PULLUP(SHIFT_OUT_PIN);
 
     #endif
 
@@ -830,11 +825,7 @@ millis_t next_lcd_update_ms;
 #endif
 
 inline bool can_encode() {
-  #if BUTTON_EXISTS(ENC_EN)
-    return !BUTTON_PRESSED(ENC_EN);  // Update position only when ENC_EN is HIGH
-  #else
-    return true;
-  #endif
+  return !BUTTON_PRESSED(ENC_EN); // Update encoder only when ENC_EN is not LOW (pressed)
 }
 
 void MarlinUI::update() {
@@ -890,18 +881,17 @@ void MarlinUI::update() {
         else if (!wait_for_unclick && (buttons & EN_C))   // OK button, if not waiting for a debounce release:
           do_click();
       }
-      else // keep wait_for_unclick value
+      // keep wait_for_unclick value
+    #endif
 
-    #endif // HAS_TOUCH_BUTTONS
-
-      {
-        // Integrated LCD click handling via button_pressed
-        if (!external_control && button_pressed()) {
-          if (!wait_for_unclick) do_click();              // Handle the click
-        }
-        else
-          wait_for_unclick = false;
+    if (!touch_buttons) {
+      // Integrated LCD click handling via button_pressed
+      if (!external_control && button_pressed()) {
+        if (!wait_for_unclick) do_click();              // Handle the click
       }
+      else
+        wait_for_unclick = false;
+    }
 
     if (LCD_BACK_CLICKED()) {
       quick_feedback();
@@ -1198,19 +1188,10 @@ void MarlinUI::update() {
         #if ANY_BUTTON(EN1, EN2, ENC, BACK)
 
           uint8_t newbutton = 0;
-
-          #if BUTTON_EXISTS(EN1)
-            if (BUTTON_PRESSED(EN1)) newbutton |= EN_A;
-          #endif
-          #if BUTTON_EXISTS(EN2)
-            if (BUTTON_PRESSED(EN2)) newbutton |= EN_B;
-          #endif
-          #if BUTTON_EXISTS(ENC)
-            if (can_encode() && BUTTON_PRESSED(ENC)) newbutton |= EN_C;
-          #endif
-          #if BUTTON_EXISTS(BACK)
-            if (BUTTON_PRESSED(BACK)) newbutton |= EN_D;
-          #endif
+          if (BUTTON_PRESSED(EN1))                 newbutton |= EN_A;
+          if (BUTTON_PRESSED(EN2))                 newbutton |= EN_B;
+          if (can_encode() && BUTTON_PRESSED(ENC)) newbutton |= EN_C;
+          if (BUTTON_PRESSED(BACK))                newbutton |= EN_D;
 
         #else
 
@@ -1225,40 +1206,26 @@ void MarlinUI::update() {
 
           const int8_t pulses = epps * encoderDirection;
 
-          if (false) {
-            // for the else-ifs below
+          if (BUTTON_PRESSED(UP)) {
+            encoderDiff = (ENCODER_STEPS_PER_MENU_ITEM) * pulses;
+            next_button_update_ms = now + 300;
+          }
+          else if (BUTTON_PRESSED(DWN)) {
+            encoderDiff = -(ENCODER_STEPS_PER_MENU_ITEM) * pulses;
+            next_button_update_ms = now + 300;
+          }
+          else if (BUTTON_PRESSED(LFT)) {
+            encoderDiff = -pulses;
+            next_button_update_ms = now + 300;
+          }
+          else if (BUTTON_PRESSED(RT)) {
+            encoderDiff = pulses;
+            next_button_update_ms = now + 300;
           }
-          #if BUTTON_EXISTS(UP)
-            else if (BUTTON_PRESSED(UP)) {
-              encoderDiff = (ENCODER_STEPS_PER_MENU_ITEM) * pulses;
-              next_button_update_ms = now + 300;
-            }
-          #endif
-          #if BUTTON_EXISTS(DWN)
-            else if (BUTTON_PRESSED(DWN)) {
-              encoderDiff = -(ENCODER_STEPS_PER_MENU_ITEM) * pulses;
-              next_button_update_ms = now + 300;
-            }
-          #endif
-          #if BUTTON_EXISTS(LFT)
-            else if (BUTTON_PRESSED(LFT)) {
-              encoderDiff = -pulses;
-              next_button_update_ms = now + 300;
-            }
-          #endif
-          #if BUTTON_EXISTS(RT)
-            else if (BUTTON_PRESSED(RT)) {
-              encoderDiff = pulses;
-              next_button_update_ms = now + 300;
-            }
-          #endif
 
         #endif // UP || DWN || LFT || RT
 
-        buttons = (newbutton
-          #if HAS_SLOW_BUTTONS
-            | slow_buttons
-          #endif
+        buttons = (newbutton | TERN0(HAS_SLOW_BUTTONS, slow_buttons)
           #if BOTH(HAS_TOUCH_BUTTONS, HAS_ENCODER_ACTION)
             | (touch_buttons & TERN(HAS_ENCODER_WHEEL, ~(EN_A | EN_B), 0xFF))
           #endif
@@ -1284,13 +1251,13 @@ void MarlinUI::update() {
          * The rotary encoder part is also independent of the LCD chipset.
          */
         uint8_t val = 0;
-        WRITE(SHIFT_LD, LOW);
-        WRITE(SHIFT_LD, HIGH);
+        WRITE(SHIFT_LD_PIN, LOW);
+        WRITE(SHIFT_LD_PIN, HIGH);
         LOOP_L_N(i, 8) {
           val >>= 1;
-          if (READ(SHIFT_OUT)) SBI(val, 7);
-          WRITE(SHIFT_CLK, HIGH);
-          WRITE(SHIFT_CLK, LOW);
+          if (READ(SHIFT_OUT_PIN)) SBI(val, 7);
+          WRITE(SHIFT_CLK_PIN, HIGH);
+          WRITE(SHIFT_CLK_PIN, LOW);
         }
         TERN(REPRAPWORLD_KEYPAD, keypad_buttons, buttons) = ~val;
       #endif
@@ -1306,11 +1273,6 @@ void MarlinUI::update() {
     #if HAS_ENCODER_WHEEL
       static uint8_t lastEncoderBits;
 
-      #define encrot0 0
-      #define encrot1 2
-      #define encrot2 3
-      #define encrot3 1
-
       // Manage encoder rotation
       #define ENCODER_SPIN(_E1, _E2) switch (lastEncoderBits) { case _E1: encoderDiff += encoderDirection; break; case _E2: encoderDiff -= encoderDirection; }
 
@@ -1319,10 +1281,10 @@ void MarlinUI::update() {
       if (buttons & EN_B) enc |= B10;
       if (enc != lastEncoderBits) {
         switch (enc) {
-          case encrot0: ENCODER_SPIN(encrot3, encrot1); break;
-          case encrot1: ENCODER_SPIN(encrot0, encrot2); break;
-          case encrot2: ENCODER_SPIN(encrot1, encrot3); break;
-          case encrot3: ENCODER_SPIN(encrot2, encrot0); break;
+          case ENCODER_PHASE_0: ENCODER_SPIN(ENCODER_PHASE_3, ENCODER_PHASE_1); break;
+          case ENCODER_PHASE_1: ENCODER_SPIN(ENCODER_PHASE_0, ENCODER_PHASE_2); break;
+          case ENCODER_PHASE_2: ENCODER_SPIN(ENCODER_PHASE_1, ENCODER_PHASE_3); break;
+          case ENCODER_PHASE_3: ENCODER_SPIN(ENCODER_PHASE_2, ENCODER_PHASE_0); break;
         }
         #if BOTH(HAS_LCD_MENU, AUTO_BED_LEVELING_UBL)
           external_encoder();
diff --git a/Marlin/src/lcd/marlinui.h b/Marlin/src/lcd/marlinui.h
index a926dd58f45..a64483fcb00 100644
--- a/Marlin/src/lcd/marlinui.h
+++ b/Marlin/src/lcd/marlinui.h
@@ -25,6 +25,8 @@
 
 #include "../module/motion.h"
 
+#include "buttons.h"
+
 #if HAS_BUZZER
   #include "../libs/buzzer.h"
 #endif
@@ -40,20 +42,6 @@
 #if EITHER(HAS_LCD_MENU, ULTIPANEL_FEEDMULTIPLY)
   #define HAS_ENCODER_ACTION 1
 #endif
-#if ((!HAS_ADC_BUTTONS && IS_NEWPANEL) || BUTTONS_EXIST(EN1, EN2)) && !IS_TFTGLCD_PANEL
-  #define HAS_ENCODER_WHEEL 1
-#endif
-#if HAS_ENCODER_WHEEL || ANY_BUTTON(ENC, BACK, UP, DWN, LFT, RT)
-  #define HAS_DIGITAL_BUTTONS 1
-#endif
-#if !HAS_ADC_BUTTONS && (IS_RRW_KEYPAD || (HAS_WIRED_LCD && !IS_NEWPANEL))
-  #define HAS_SHIFT_ENCODER 1
-#endif
-
-// I2C buttons must be read in the main thread
-#if ANY(LCD_I2C_VIKI, LCD_I2C_PANELOLU2, IS_TFTGLCD_PANEL)
-  #define HAS_SLOW_BUTTONS 1
-#endif
 
 #if E_MANUAL > 1
   #define MULTI_MANUAL 1
@@ -114,130 +102,6 @@
 
 #endif // HAS_WIRED_LCD
 
-#if IS_RRW_KEYPAD
-  #define BTN_OFFSET          0 // Bit offset into buttons for shift register values
-
-  #define BLEN_KEYPAD_F3      0
-  #define BLEN_KEYPAD_F2      1
-  #define BLEN_KEYPAD_F1      2
-  #define BLEN_KEYPAD_DOWN    3
-  #define BLEN_KEYPAD_RIGHT   4
-  #define BLEN_KEYPAD_MIDDLE  5
-  #define BLEN_KEYPAD_UP      6
-  #define BLEN_KEYPAD_LEFT    7
-
-  #define EN_KEYPAD_F1      _BV(BTN_OFFSET + BLEN_KEYPAD_F1)
-  #define EN_KEYPAD_F2      _BV(BTN_OFFSET + BLEN_KEYPAD_F2)
-  #define EN_KEYPAD_F3      _BV(BTN_OFFSET + BLEN_KEYPAD_F3)
-  #define EN_KEYPAD_DOWN    _BV(BTN_OFFSET + BLEN_KEYPAD_DOWN)
-  #define EN_KEYPAD_RIGHT   _BV(BTN_OFFSET + BLEN_KEYPAD_RIGHT)
-  #define EN_KEYPAD_MIDDLE  _BV(BTN_OFFSET + BLEN_KEYPAD_MIDDLE)
-  #define EN_KEYPAD_UP      _BV(BTN_OFFSET + BLEN_KEYPAD_UP)
-  #define EN_KEYPAD_LEFT    _BV(BTN_OFFSET + BLEN_KEYPAD_LEFT)
-
-  #define RRK(B) (keypad_buttons & (B))
-
-  #ifdef EN_C
-    #define BUTTON_CLICK() ((buttons & EN_C) || RRK(EN_KEYPAD_MIDDLE))
-  #else
-    #define BUTTON_CLICK() RRK(EN_KEYPAD_MIDDLE)
-  #endif
-
-#endif // IS_RRW_KEYPAD
-
-#if HAS_DIGITAL_BUTTONS
-
-  // Wheel spin pins where BA is 00, 10, 11, 01 (1 bit always changes)
-  #define BLEN_A 0
-  #define BLEN_B 1
-
-  #define EN_A _BV(BLEN_A)
-  #define EN_B _BV(BLEN_B)
-
-  #define BUTTON_PRESSED(BN) !READ(BTN_## BN)
-
-  #if BUTTON_EXISTS(ENC) || HAS_TOUCH_BUTTONS
-    #define BLEN_C 2
-    #define EN_C _BV(BLEN_C)
-  #endif
-
-  #if ENABLED(LCD_I2C_VIKI)
-
-    #include <LiquidTWI2.h>
-
-    #define B_I2C_BTN_OFFSET 3 // (the first three bit positions reserved for EN_A, EN_B, EN_C)
-
-    // button and encoder bit positions within 'buttons'
-    #define B_LE (BUTTON_LEFT   << B_I2C_BTN_OFFSET)      // The remaining normalized buttons are all read via I2C
-    #define B_UP (BUTTON_UP     << B_I2C_BTN_OFFSET)
-    #define B_MI (BUTTON_SELECT << B_I2C_BTN_OFFSET)
-    #define B_DW (BUTTON_DOWN   << B_I2C_BTN_OFFSET)
-    #define B_RI (BUTTON_RIGHT  << B_I2C_BTN_OFFSET)
-
-    #if BUTTON_EXISTS(ENC)                                // The pause/stop/restart button is connected to BTN_ENC when used
-      #define B_ST (EN_C)                                 // Map the pause/stop/resume button into its normalized functional name
-      #define BUTTON_CLICK() (buttons & (B_MI|B_RI|B_ST)) // Pause/stop also acts as click until a proper pause/stop is implemented.
-    #else
-      #define BUTTON_CLICK() (buttons & (B_MI|B_RI))
-    #endif
-
-    // I2C buttons take too long to read inside an interrupt context and so we read them during lcd_update
-
-  #elif ENABLED(LCD_I2C_PANELOLU2)
-
-    #if !BUTTON_EXISTS(ENC) // Use I2C if not directly connected to a pin
-
-      #define B_I2C_BTN_OFFSET 3 // (the first three bit positions reserved for EN_A, EN_B, EN_C)
-
-      #define B_MI (PANELOLU2_ENCODER_C << B_I2C_BTN_OFFSET) // requires LiquidTWI2 library v1.2.3 or later
-
-      #define BUTTON_CLICK() (buttons & B_MI)
-
-    #endif
-
-  #endif
-
-#else
-
-  #undef BUTTON_EXISTS
-  #define BUTTON_EXISTS(...) false
-
-  // Shift register bits correspond to buttons:
-  #define BL_LE 7   // Left
-  #define BL_UP 6   // Up
-  #define BL_MI 5   // Middle
-  #define BL_DW 4   // Down
-  #define BL_RI 3   // Right
-  #define BL_ST 2   // Red Button
-  #define B_LE _BV(BL_LE)
-  #define B_UP _BV(BL_UP)
-  #define B_MI _BV(BL_MI)
-  #define B_DW _BV(BL_DW)
-  #define B_RI _BV(BL_RI)
-  #define B_ST _BV(BL_ST)
-
-  #ifndef BUTTON_CLICK
-    #define BUTTON_CLICK() (buttons & (B_MI|B_ST))
-  #endif
-
-#endif
-
-#if BUTTON_EXISTS(BACK) || EITHER(HAS_TOUCH_BUTTONS, IS_TFTGLCD_PANEL)
-  #define BLEN_D 3
-  #define EN_D _BV(BLEN_D)
-  #define LCD_BACK_CLICKED() (buttons & EN_D)
-#else
-  #define LCD_BACK_CLICKED() false
-#endif
-
-#ifndef BUTTON_CLICK
-  #ifdef EN_C
-    #define BUTTON_CLICK() (buttons & EN_C)
-  #else
-    #define BUTTON_CLICK() false
-  #endif
-#endif
-
 #if HAS_MARLINUI_U8GLIB
   enum MarlinFont : uint8_t {
     FONT_STATUSMENU = 1,
@@ -556,6 +420,8 @@ public:
     #if HAS_TOUCH_BUTTONS
       static uint8_t touch_buttons;
       static uint8_t repeat_delay;
+    #else
+      static constexpr uint8_t touch_buttons = 0;
     #endif
 
     #if ENABLED(ENCODER_RATE_MULTIPLIER)
diff --git a/Marlin/src/lcd/touch/touch_buttons.cpp b/Marlin/src/lcd/touch/touch_buttons.cpp
index 3d1cc26cd6c..975de58211f 100644
--- a/Marlin/src/lcd/touch/touch_buttons.cpp
+++ b/Marlin/src/lcd/touch/touch_buttons.cpp
@@ -31,7 +31,8 @@ XPT2046 touchIO;
   #include "../tft_io/touch_calibration.h"
 #endif
 
-#include "../marlinui.h" // For EN_C bit mask
+#include "../buttons.h" // For EN_C bit mask
+#include "../marlinui.h" // For ui.refresh
 #include "../tft_io/tft_io.h"
 
 #define DOGM_AREA_LEFT   TFT_PIXEL_OFFSET_X
@@ -66,7 +67,6 @@ uint8_t TouchButtons::read_buttons() {
       y = uint16_t((uint32_t(y) * TOUCH_CALIBRATION_Y) >> 16) + TOUCH_OFFSET_Y;
     #endif
 
-
     // Touch within the button area simulates an encoder button
     if (y > BUTTON_AREA_TOP && y < BUTTON_AREA_BOT)
       return WITHIN(x, BUTTOND_X_LO, BUTTOND_X_HI) ? EN_D
diff --git a/Marlin/src/pins/linux/pins_RAMPS_LINUX.h b/Marlin/src/pins/linux/pins_RAMPS_LINUX.h
index ce2ee2579ab..ab1446f07c9 100644
--- a/Marlin/src/pins/linux/pins_RAMPS_LINUX.h
+++ b/Marlin/src/pins/linux/pins_RAMPS_LINUX.h
@@ -459,10 +459,10 @@
     #if !IS_NEWPANEL
       // Buttons attached to a shift register
       // Not wired yet
-      //#define SHIFT_CLK                     38
-      //#define SHIFT_LD                      42
-      //#define SHIFT_OUT                     40
-      //#define SHIFT_EN                      17
+      //#define SHIFT_CLK_PIN                 38
+      //#define SHIFT_LD_PIN                  42
+      //#define SHIFT_OUT_PIN                 40
+      //#define SHIFT_EN_PIN                  17
     #endif
 
   #endif
@@ -608,9 +608,9 @@
 
       // Buttons are directly attached to AUX-2
       #if IS_RRW_KEYPAD
-        #define SHIFT_OUT                     40
-        #define SHIFT_CLK                     44
-        #define SHIFT_LD                      42
+        #define SHIFT_OUT_PIN                 40
+        #define SHIFT_CLK_PIN                 44
+        #define SHIFT_LD_PIN                  42
         #define BTN_EN1                       64
         #define BTN_EN2                       59
         #define BTN_ENC                       63
diff --git a/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h b/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h
index e0452451882..7d0f494c34f 100644
--- a/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h
+++ b/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h
@@ -354,15 +354,15 @@
 
   #if IS_NEWPANEL
     #if IS_RRW_KEYPAD
-      #define SHIFT_OUT                    P0_18  // (51) (MOSI) J3-10 & AUX-3
-      #define SHIFT_CLK                    P0_15  // (52) (SCK)  J3-9 & AUX-3
-      #define SHIFT_LD                     P1_31  // (49)        J3-1 & AUX-3 (NOT 5V tolerant)
+      #define SHIFT_OUT_PIN                P0_18  // (51) (MOSI) J3-10 & AUX-3
+      #define SHIFT_CLK_PIN                P0_15  // (52) (SCK)  J3-9 & AUX-3
+      #define SHIFT_LD_PIN                 P1_31  // (49)        J3-1 & AUX-3 (NOT 5V tolerant)
     #endif
   #else
-    //#define SHIFT_CLK                    P3_26  // (31)  J3-2 & AUX-4
-    //#define SHIFT_LD                     P3_25  // (33)  J3-4 & AUX-4
-    //#define SHIFT_OUT                    P2_11  // (35)  J3-3 & AUX-4
-    //#define SHIFT_EN                     P1_22  // (41)  J5-4 & AUX-4
+    //#define SHIFT_CLK_PIN                P3_26  // (31)  J3-2 & AUX-4
+    //#define SHIFT_LD_PIN                 P3_25  // (33)  J3-4 & AUX-4
+    //#define SHIFT_OUT_PIN                P2_11  // (35)  J3-3 & AUX-4
+    //#define SHIFT_EN_PIN                 P1_22  // (41)  J5-4 & AUX-4
   #endif
 
   #if ANY(VIKI2, miniVIKI)
diff --git a/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h b/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h
index 596efdbb97b..fdd64878fbc 100644
--- a/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h
+++ b/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h
@@ -147,14 +147,14 @@
     #define DOGLCD_A0                      P2_06  // (59) J3-8 & AUX-2
 
     #if IS_RRW_KEYPAD
-      #define SHIFT_OUT                    P0_18  // (51)  (MOSI) J3-10 & AUX-3
-      #define SHIFT_CLK                    P0_15  // (52)  (SCK)  J3-9 & AUX-3
-      #define SHIFT_LD                     P1_31  // (49)  not 5V tolerant   J3-1 & AUX-3
+      #define SHIFT_OUT_PIN                P0_18  // (51)  (MOSI) J3-10 & AUX-3
+      #define SHIFT_CLK_PIN                P0_15  // (52)  (SCK)  J3-9 & AUX-3
+      #define SHIFT_LD_PIN                 P1_31  // (49)  not 5V tolerant   J3-1 & AUX-3
     #elif !IS_NEWPANEL
-      //#define SHIFT_OUT                  P2_11  // (35)  J3-3 & AUX-4
-      //#define SHIFT_CLK                  P3_26  // (31)  J3-2 & AUX-4
-      //#define SHIFT_LD                   P3_25  // (33)  J3-4 & AUX-4
-      //#define SHIFT_EN                   P1_22  // (41)  J5-4 & AUX-4
+      //#define SHIFT_OUT_PIN              P2_11  // (35)  J3-3 & AUX-4
+      //#define SHIFT_CLK_PIN              P3_26  // (31)  J3-2 & AUX-4
+      //#define SHIFT_LD_PIN               P3_25  // (33)  J3-4 & AUX-4
+      //#define SHIFT_EN_PIN               P1_22  // (41)  J5-4 & AUX-4
     #endif
 
     #if ANY(VIKI2, miniVIKI)
diff --git a/Marlin/src/pins/mega/pins_CNCONTROLS_11.h b/Marlin/src/pins/mega/pins_CNCONTROLS_11.h
index 0e75aa4a373..f80e6144ce1 100644
--- a/Marlin/src/pins/mega/pins_CNCONTROLS_11.h
+++ b/Marlin/src/pins/mega/pins_CNCONTROLS_11.h
@@ -149,9 +149,9 @@
 #define BTN_ENC                               27
 
 // Hardware buttons for manual movement of XYZ
-#define SHIFT_OUT                             19
-#define SHIFT_LD                              18
-#define SHIFT_CLK                             17
+#define SHIFT_OUT_PIN                         19
+#define SHIFT_LD_PIN                          18
+#define SHIFT_CLK_PIN                         17
 
 //#define UI1                                 31
 //#define UI2                                 22
diff --git a/Marlin/src/pins/mega/pins_CNCONTROLS_12.h b/Marlin/src/pins/mega/pins_CNCONTROLS_12.h
index 35426a45313..540f5c29f51 100644
--- a/Marlin/src/pins/mega/pins_CNCONTROLS_12.h
+++ b/Marlin/src/pins/mega/pins_CNCONTROLS_12.h
@@ -156,9 +156,9 @@
 #define BTN_ENC                               38
 
 // Hardware buttons for manual movement of XYZ
-#define SHIFT_OUT                             42
-#define SHIFT_LD                              41
-#define SHIFT_CLK                             40
+#define SHIFT_OUT_PIN                         42
+#define SHIFT_LD_PIN                          41
+#define SHIFT_CLK_PIN                         40
 
 //#define UI1                                 43
 //#define UI2                                 37
diff --git a/Marlin/src/pins/mega/pins_GT2560_REV_A.h b/Marlin/src/pins/mega/pins_GT2560_REV_A.h
index e1752c1f856..dcd829f7a7a 100644
--- a/Marlin/src/pins/mega/pins_GT2560_REV_A.h
+++ b/Marlin/src/pins/mega/pins_GT2560_REV_A.h
@@ -146,10 +146,10 @@
 
   #else                                           // !IS_NEWPANEL
 
-    #define SHIFT_CLK                         38
-    #define SHIFT_LD                          42
-    #define SHIFT_OUT                         40
-    #define SHIFT_EN                          17
+    #define SHIFT_CLK_PIN                     38
+    #define SHIFT_LD_PIN                      42
+    #define SHIFT_OUT_PIN                     40
+    #define SHIFT_EN_PIN                      17
 
     #define LCD_PINS_RS                       16
     #define LCD_PINS_ENABLE                    5
diff --git a/Marlin/src/pins/mega/pins_HJC2560C_REV2.h b/Marlin/src/pins/mega/pins_HJC2560C_REV2.h
index fa2027fb782..d507d20ca7a 100644
--- a/Marlin/src/pins/mega/pins_HJC2560C_REV2.h
+++ b/Marlin/src/pins/mega/pins_HJC2560C_REV2.h
@@ -156,10 +156,10 @@
   #else
 
     // Buttons attached to a shift register
-    #define SHIFT_CLK                         38
-    #define SHIFT_LD                          42
-    #define SHIFT_OUT                         40
-    #define SHIFT_EN                          17
+    #define SHIFT_CLK_PIN                     38
+    #define SHIFT_LD_PIN                      42
+    #define SHIFT_OUT_PIN                     40
+    #define SHIFT_EN_PIN                      17
 
     #define LCD_PINS_RS                       16
     #define LCD_PINS_ENABLE                    5
diff --git a/Marlin/src/pins/mega/pins_MEGATRONICS_2.h b/Marlin/src/pins/mega/pins_MEGATRONICS_2.h
index 67ec24ed6f7..ef4605edd43 100644
--- a/Marlin/src/pins/mega/pins_MEGATRONICS_2.h
+++ b/Marlin/src/pins/mega/pins_MEGATRONICS_2.h
@@ -146,10 +146,10 @@
     #define BTN_ENC                           43
   #else
     // Buttons attached to shift register of reprapworld keypad v1.1
-    #define SHIFT_CLK                         63
-    #define SHIFT_LD                          42
-    #define SHIFT_OUT                         17
-    #define SHIFT_EN                          17
+    #define SHIFT_CLK_PIN                     63
+    #define SHIFT_LD_PIN                      42
+    #define SHIFT_OUT_PIN                     17
+    #define SHIFT_EN_PIN                      17
   #endif
 
 #endif // HAS_WIRED_LCD
diff --git a/Marlin/src/pins/mega/pins_MEGATRONICS_3.h b/Marlin/src/pins/mega/pins_MEGATRONICS_3.h
index 45ebd163a79..9f85d46a544 100644
--- a/Marlin/src/pins/mega/pins_MEGATRONICS_3.h
+++ b/Marlin/src/pins/mega/pins_MEGATRONICS_3.h
@@ -162,10 +162,10 @@
   #define LCD_PINS_D6                         39
   #define LCD_PINS_D7                         15
 
-  #define SHIFT_CLK                           43
-  #define SHIFT_LD                            35
-  #define SHIFT_OUT                           34
-  #define SHIFT_EN                            44
+  #define SHIFT_CLK_PIN                       43
+  #define SHIFT_LD_PIN                        35
+  #define SHIFT_OUT_PIN                       34
+  #define SHIFT_EN_PIN                        44
 
   #if MB(MEGATRONICS_31, MEGATRONICS_32)
     #define SD_DETECT_PIN                     56
diff --git a/Marlin/src/pins/pinsDebug_list.h b/Marlin/src/pins/pinsDebug_list.h
index 0e1b1b09e56..79a67c34f87 100644
--- a/Marlin/src/pins/pinsDebug_list.h
+++ b/Marlin/src/pins/pinsDebug_list.h
@@ -833,17 +833,17 @@
 #if PIN_EXISTS(SERVO3)
   REPORT_NAME_DIGITAL(__LINE__, SERVO3_PIN)
 #endif
-#if defined(SHIFT_CLK) && SHIFT_CLK >= 0
-  REPORT_NAME_DIGITAL(__LINE__, SHIFT_CLK)
+#if PIN_EXISTS(SHIFT_CLK)
+  REPORT_NAME_DIGITAL(__LINE__, SHIFT_CLK_PIN)
 #endif
-#if defined(SHIFT_EN) && SHIFT_EN >= 0
-  REPORT_NAME_DIGITAL(__LINE__, SHIFT_EN)
+#if PIN_EXISTS(SHIFT_EN)
+  REPORT_NAME_DIGITAL(__LINE__, SHIFT_EN_PIN)
 #endif
-#if defined(SHIFT_LD) && SHIFT_LD >= 0
-  REPORT_NAME_DIGITAL(__LINE__, SHIFT_LD)
+#if PIN_EXISTS(SHIFT_LD)
+  REPORT_NAME_DIGITAL(__LINE__, SHIFT_LD_PIN)
 #endif
-#if defined(SHIFT_OUT) && SHIFT_OUT >= 0
-  REPORT_NAME_DIGITAL(__LINE__, SHIFT_OUT)
+#if PIN_EXISTS(SHIFT_OUT)
+  REPORT_NAME_DIGITAL(__LINE__, SHIFT_OUT_PIN)
 #endif
 #if PIN_EXISTS(SLED)
   REPORT_NAME_DIGITAL(__LINE__, SLED_PIN)
diff --git a/Marlin/src/pins/rambo/pins_RAMBO.h b/Marlin/src/pins/rambo/pins_RAMBO.h
index 7dcaeb8e57e..be2317b146b 100644
--- a/Marlin/src/pins/rambo/pins_RAMBO.h
+++ b/Marlin/src/pins/rambo/pins_RAMBO.h
@@ -239,10 +239,10 @@
 
     // Buttons attached to a shift register
     // Not wired yet
-    //#define SHIFT_CLK                       38
-    //#define SHIFT_LD                        42
-    //#define SHIFT_OUT                       40
-    //#define SHIFT_EN                        17
+    //#define SHIFT_CLK_PIN                   38
+    //#define SHIFT_LD_PIN                    42
+    //#define SHIFT_OUT_PIN                   40
+    //#define SHIFT_EN_PIN                    17
 
     #define LCD_PINS_RS                       75
     #define LCD_PINS_ENABLE                   17
diff --git a/Marlin/src/pins/ramps/pins_RAMPS.h b/Marlin/src/pins/ramps/pins_RAMPS.h
index 57d4c047e2e..ab5711bd5c5 100644
--- a/Marlin/src/pins/ramps/pins_RAMPS.h
+++ b/Marlin/src/pins/ramps/pins_RAMPS.h
@@ -504,10 +504,10 @@
     #if !IS_NEWPANEL
       // Buttons attached to a shift register
       // Not wired yet
-      //#define SHIFT_CLK                     38
-      //#define SHIFT_LD                      42
-      //#define SHIFT_OUT                     40
-      //#define SHIFT_EN                      17
+      //#define SHIFT_CLK_PIN                 38
+      //#define SHIFT_LD_PIN                  42
+      //#define SHIFT_OUT_PIN                 40
+      //#define SHIFT_EN_PIN                  17
     #endif
 
   #endif
@@ -722,9 +722,9 @@
 #endif // HAS_WIRED_LCD
 
 #if IS_RRW_KEYPAD && !HAS_ADC_BUTTONS
-  #define SHIFT_OUT                           40
-  #define SHIFT_CLK                           44
-  #define SHIFT_LD                            42
+  #define SHIFT_OUT_PIN                       40
+  #define SHIFT_CLK_PIN                       44
+  #define SHIFT_LD_PIN                        42
   #ifndef BTN_EN1
     #define BTN_EN1                           64
   #endif
diff --git a/Marlin/src/pins/ramps/pins_TT_OSCAR.h b/Marlin/src/pins/ramps/pins_TT_OSCAR.h
index e6a95fdab9e..ca402553e11 100644
--- a/Marlin/src/pins/ramps/pins_TT_OSCAR.h
+++ b/Marlin/src/pins/ramps/pins_TT_OSCAR.h
@@ -342,10 +342,10 @@
     #if !IS_NEWPANEL
       // Buttons attached to a shift register
       // Not wired yet
-      //#define SHIFT_CLK                     38
-      //#define SHIFT_LD                      42
-      //#define SHIFT_OUT                     40
-      //#define SHIFT_EN                      17
+      //#define SHIFT_CLK_PIN                 38
+      //#define SHIFT_LD_PIN                  42
+      //#define SHIFT_OUT_PIN                 40
+      //#define SHIFT_EN_PIN                  17
     #endif
 
   #endif
@@ -491,9 +491,9 @@
 
       // Buttons are directly attached to AUX-2
       #if IS_RRW_KEYPAD
-        #define SHIFT_OUT                     40
-        #define SHIFT_CLK                     44
-        #define SHIFT_LD                      42
+        #define SHIFT_OUT_PIN                 40
+        #define SHIFT_CLK_PIN                 44
+        #define SHIFT_LD_PIN                  42
         #define BTN_EN1                       64
         #define BTN_EN2                       59
         #define BTN_ENC                       63
diff --git a/Marlin/src/pins/ramps/pins_ULTIMAKER.h b/Marlin/src/pins/ramps/pins_ULTIMAKER.h
index 447138f53e2..22c7fd95b47 100644
--- a/Marlin/src/pins/ramps/pins_ULTIMAKER.h
+++ b/Marlin/src/pins/ramps/pins_ULTIMAKER.h
@@ -142,10 +142,10 @@
   #else                                           // !IS_NEWPANEL - Old style panel with shift register
 
     // Buttons attached to a shift register
-    #define SHIFT_CLK                         38
-    #define SHIFT_LD                          42
-    #define SHIFT_OUT                         40
-    #define SHIFT_EN                          17
+    #define SHIFT_CLK_PIN                     38
+    #define SHIFT_LD_PIN                      42
+    #define SHIFT_OUT_PIN                     40
+    #define SHIFT_EN_PIN                      17
 
     #define LCD_PINS_RS                       16
     #define LCD_PINS_ENABLE                    5
diff --git a/Marlin/src/pins/ramps/pins_ULTIMAKER_OLD.h b/Marlin/src/pins/ramps/pins_ULTIMAKER_OLD.h
index a59a000dff8..37c28ece4ce 100644
--- a/Marlin/src/pins/ramps/pins_ULTIMAKER_OLD.h
+++ b/Marlin/src/pins/ramps/pins_ULTIMAKER_OLD.h
@@ -197,10 +197,10 @@
   #else                                           // !IS_NEWPANEL - Old style panel with shift register
 
     // Buttons attached to a shift register
-    #define SHIFT_CLK                         38
-    #define SHIFT_LD                          42
-    #define SHIFT_OUT                         40
-    #define SHIFT_EN                          17
+    #define SHIFT_CLK_PIN                     38
+    #define SHIFT_LD_PIN                      42
+    #define SHIFT_OUT_PIN                     40
+    #define SHIFT_EN_PIN                      17
 
     #define LCD_PINS_RS                       16
     #define LCD_PINS_ENABLE                    5
diff --git a/Marlin/src/pins/ramps/pins_ZRIB_V20.h b/Marlin/src/pins/ramps/pins_ZRIB_V20.h
index 90433c62d75..6c4b28d0b87 100644
--- a/Marlin/src/pins/ramps/pins_ZRIB_V20.h
+++ b/Marlin/src/pins/ramps/pins_ZRIB_V20.h
@@ -69,9 +69,9 @@
   #undef ADC_KEYPAD_PIN
   #undef BEEPER_PIN
 
-  #undef SHIFT_OUT
-  #undef SHIFT_CLK
-  #undef SHIFT_LD
+  #undef SHIFT_OUT_PIN
+  #undef SHIFT_CLK_PIN
+  #undef SHIFT_LD_PIN
   #undef BTN_EN1
   #undef BTN_EN2
   #undef BTN_ENC
diff --git a/Marlin/src/pins/samd/pins_RAMPS_144.h b/Marlin/src/pins/samd/pins_RAMPS_144.h
index d72b55d3afe..7a72ef651f1 100644
--- a/Marlin/src/pins/samd/pins_RAMPS_144.h
+++ b/Marlin/src/pins/samd/pins_RAMPS_144.h
@@ -363,10 +363,10 @@
     #if !IS_NEWPANEL
       // Buttons attached to a shift register
       // Not wired yet
-      //#define SHIFT_CLK                     38
-      //#define SHIFT_LD                      42
-      //#define SHIFT_OUT                     40
-      //#define SHIFT_EN                      17
+      //#define SHIFT_CLK_PIN                 38
+      //#define SHIFT_LD_PIN                  42
+      //#define SHIFT_OUT_PIN                 40
+      //#define SHIFT_EN_PIN                  17
     #endif
 
   #endif
@@ -567,9 +567,9 @@
       // Buttons are directly attached to AUX-2
       #if IS_RRW_KEYPAD
         // TO TEST
-        //#define SHIFT_OUT                   40
-        //#define SHIFT_CLK                   44
-        //#define SHIFT_LD                    42
+        //#define SHIFT_OUT_PIN               40
+        //#define SHIFT_CLK_PIN               44
+        //#define SHIFT_LD_PIN                42
         //#define BTN_EN1                     56  // Mega/Due:64 - AGCM4:56
         //#define BTN_EN2                     72  // Mega/Due:59 - AGCM4:72
         //#define BTN_ENC                     55  // Mega/Due:63 - AGCM4:55
diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D.h b/Marlin/src/pins/stm32f1/pins_CHITU3D.h
index b18c9dd9140..bb6f5719246 100644
--- a/Marlin/src/pins/stm32f1/pins_CHITU3D.h
+++ b/Marlin/src/pins/stm32f1/pins_CHITU3D.h
@@ -146,10 +146,10 @@
       #define BEEPER_PIN                    PC1   // 33
       // Buttons attached to a shift register
       // Not wired yet
-      //#define SHIFT_CLK                   PC6   // 38
-      //#define SHIFT_LD                    PC10  // 42
-      //#define SHIFT_OUT                   PC8   // 40
-      //#define SHIFT_EN                    PA1   // 17
+      //#define SHIFT_CLK_PIN               PC6   // 38
+      //#define SHIFT_LD_PIN                PC10  // 42
+      //#define SHIFT_OUT_PIN               PC8   // 40
+      //#define SHIFT_EN_PIN                PA1   // 17
     #endif
   #endif
 
@@ -260,9 +260,9 @@
         #define BTN_EN1                     PE0   // 64
         #define BTN_EN2                     PD11  // 59
         #define BTN_ENC                     PD15  // 63
-        #define SHIFT_OUT                   PC8   // 40
-        #define SHIFT_CLK                   PC12  // 44
-        #define SHIFT_LD                    PC10  // 42
+        #define SHIFT_OUT_PIN               PC8   // 40
+        #define SHIFT_CLK_PIN               PC12  // 44
+        #define SHIFT_LD_PIN                PC10  // 42
       #elif ENABLED(PANEL_ONE)
         #define BTN_EN1                     PD11  // 59   // AUX2 PIN 3
         #define BTN_EN2                     PD15  // 63   // AUX2 PIN 4
diff --git a/Marlin/src/pins/teensy3/pins_TEENSY35_36.h b/Marlin/src/pins/teensy3/pins_TEENSY35_36.h
index b8a0ffe2c80..71c348536a7 100644
--- a/Marlin/src/pins/teensy3/pins_TEENSY35_36.h
+++ b/Marlin/src/pins/teensy3/pins_TEENSY35_36.h
@@ -146,7 +146,7 @@
 #endif
 
 #if IS_RRW_KEYPAD
-  #define SHIFT_OUT                           40
-  #define SHIFT_CLK                           44
-  #define SHIFT_LD                            42
+  #define SHIFT_OUT_PIN                       40
+  #define SHIFT_CLK_PIN                       44
+  #define SHIFT_LD_PIN                        42
 #endif