diff --git a/Marlin/src/core/macros.h b/Marlin/src/core/macros.h
index b438db920132b0dc05d012176b26ce17ff95baf4..7a1bb45c5119c9efc81888a60b27a602363a0991 100644
--- a/Marlin/src/core/macros.h
+++ b/Marlin/src/core/macros.h
@@ -194,7 +194,8 @@
 #define DECREMENT_(n) DEC_ ##n
 #define DECREMENT(n) DECREMENT_(n)
 
-#define PIN_EXISTS(PN) (defined(PN ##_PIN) && PN ##_PIN >= 0)
+#define PIN_EXISTS(PN)    (defined(PN ##_PIN) && PN ##_PIN >= 0)
+#define BUTTON_EXISTS(BN) (defined(BTN_## BN) && BTN_## BN >= 0)
 
 #define MMM_TO_MMS(MM_M) ((MM_M)/60.0f)
 #define MMS_TO_MMM(MM_S) ((MM_S)*60.0f)
diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h
index efc91ea67335b2423be030d2f52324db8ff6ea06..1eb610b3d7485a52dc00a9ba355947059cb114cf 100644
--- a/Marlin/src/inc/Conditionals_LCD.h
+++ b/Marlin/src/inc/Conditionals_LCD.h
@@ -320,12 +320,6 @@
 #define HAS_LCD_MENU        (ENABLED(ULTIPANEL) && DISABLED(NO_LCD_MENUS))
 
 #define HAS_ADC_BUTTONS     ENABLED(ADC_KEYPAD)
-#define HAS_DIGITAL_BUTTONS (!HAS_ADC_BUTTONS && ENABLED(NEWPANEL))
-#define HAS_SHIFT_ENCODER   (!HAS_ADC_BUTTONS && (ENABLED(REPRAPWORLD_KEYPAD) || (HAS_SPI_LCD && DISABLED(NEWPANEL))))
-#define HAS_ENCODER_WHEEL   (!HAS_ADC_BUTTONS && ENABLED(NEWPANEL))
-
-// I2C buttons must be read in the main thread
-#define HAS_SLOW_BUTTONS (ENABLED(LCD_I2C_VIKI) || ENABLED(LCD_I2C_PANELOLU2))
 
 #if HAS_GRAPHICAL_LCD
   /**
diff --git a/Marlin/src/lcd/ultralcd.cpp b/Marlin/src/lcd/ultralcd.cpp
index ab973e9e2cca9835f615e5bec0b4ab8659533b71..3a2bc3d3c2229773cedaa0aba447e36b78f37e1c 100644
--- a/Marlin/src/lcd/ultralcd.cpp
+++ b/Marlin/src/lcd/ultralcd.cpp
@@ -1073,15 +1073,15 @@ void MarlinUI::update() {
             | slow_buttons
           #endif
         ;
-
       #elif HAS_ADC_BUTTONS
-
         buttons = 0;
+      #endif
+
+      #if HAS_ADC_BUTTONS
         if (keypad_buttons == 0) {
           const uint8_t b = get_ADC_keyValue();
           if (WITHIN(b, 1, 8)) keypad_buttons = _BV(b - 1);
         }
-
       #endif
 
       #if HAS_SHIFT_ENCODER
diff --git a/Marlin/src/lcd/ultralcd.h b/Marlin/src/lcd/ultralcd.h
index b50272ae9e2cc0351152c372cef239a5f3cfd156..56d097bb934d1f9dbba35a0b38debe7013c7f66e 100644
--- a/Marlin/src/lcd/ultralcd.h
+++ b/Marlin/src/lcd/ultralcd.h
@@ -27,8 +27,19 @@
   #include "../libs/buzzer.h"
 #endif
 
+#define HAS_DIGITAL_BUTTONS (!HAS_ADC_BUTTONS && ENABLED(NEWPANEL)        \
+                            || (BUTTON_EXISTS(EN1) && BUTTON_EXISTS(EN2)) \
+                            || BUTTON_EXISTS(ENC) || BUTTON_EXISTS(BACK)  \
+                            || BUTTON_EXISTS(UP)  || BUTTON_EXISTS(DWN)   \
+                            || BUTTON_EXISTS(LFT) || BUTTON_EXISTS(RT))
+
+#define HAS_SHIFT_ENCODER   (!HAS_ADC_BUTTONS && (ENABLED(REPRAPWORLD_KEYPAD) || (HAS_SPI_LCD && DISABLED(NEWPANEL))))
+#define HAS_ENCODER_WHEEL  ((!HAS_ADC_BUTTONS && ENABLED(NEWPANEL)) || (BUTTON_EXISTS(EN1) && BUTTON_EXISTS(EN2)) )
 #define HAS_ENCODER_ACTION (HAS_LCD_MENU || ENABLED(ULTIPANEL_FEEDMULTIPLY))
 
+// I2C buttons must be read in the main thread
+#define HAS_SLOW_BUTTONS (ENABLED(LCD_I2C_VIKI) || ENABLED(LCD_I2C_PANELOLU2))
+
 #if HAS_SPI_LCD
 
   #include "../Marlin.h"
@@ -133,7 +144,6 @@
   #define EN_A _BV(BLEN_A)
   #define EN_B _BV(BLEN_B)
 
-  #define BUTTON_EXISTS(BN) (defined(BTN_## BN) && BTN_## BN >= 0)
   #define BUTTON_PRESSED(BN) !READ(BTN_## BN)
 
   #if BUTTON_EXISTS(ENC)