diff --git a/Marlin/src/feature/touch/xpt2046.cpp b/Marlin/src/feature/touch/xpt2046.cpp
index d93e99681955853198b71c8186e6620631492e7b..a080e880cefa774cda69e4e8d99909295b8c9a90 100644
--- a/Marlin/src/feature/touch/xpt2046.cpp
+++ b/Marlin/src/feature/touch/xpt2046.cpp
@@ -44,13 +44,16 @@ XPT2046 touch;
 extern int8_t encoderDiff;
 
 void XPT2046::init(void) {
-  SET_INPUT(TOUCH_INT_PIN); // Pendrive interrupt pin, used as polling in getInTouch
   SET_INPUT(TOUCH_MISO_PIN);
   SET_OUTPUT(TOUCH_MOSI_PIN);
-
-  OUT_WRITE(TOUCH_SCK_PIN, 0);
+  SET_OUTPUT(TOUCH_SCK_PIN);
   OUT_WRITE(TOUCH_CS_PIN, 1);
 
+  #if PIN_EXISTS(TOUCH_INT)
+    // Optional Pendrive interrupt pin
+    SET_INPUT(TOUCH_INT_PIN);
+  #endif
+
   // Read once to enable pendrive status pin
   getInTouch(XPT2046_X);
 }
@@ -74,10 +77,10 @@ uint8_t XPT2046::read_buttons() {
 
   // We rely on XPT2046 compatible mode to ADS7843, hence no Z1 and Z2 measurements possible.
 
-  if (READ(TOUCH_INT_PIN)) return 0; // If HIGH there are no screen presses.
+  if (!isTouched()) return 0;
   const uint16_t x = uint16_t(((uint32_t(getInTouch(XPT2046_X))) * tsoffsets[0]) >> 16) + tsoffsets[1],
                  y = uint16_t(((uint32_t(getInTouch(XPT2046_Y))) * tsoffsets[2]) >> 16) + tsoffsets[3];
-  if (READ(TOUCH_INT_PIN)) return 0; // Fingers must still be on the TS for a valid read.
+  if (!isTouched()) return 0; // Fingers must still be on the TS for a valid read.
 
   if (y < 185 || y > 224) return 0;
 
@@ -88,6 +91,16 @@ uint8_t XPT2046::read_buttons() {
   return 0;
 }
 
+bool XPT2046::isTouched() {
+  return (
+    #if PIN_EXISTS(TOUCH_INT)
+      READ(TOUCH_INT_PIN) != HIGH
+    #else
+      getInTouch(XPT2046_Z1) >= XPT2046_Z1_TRESHHOLD
+    #endif
+  );
+}
+
 uint16_t XPT2046::getInTouch(const XPTCoordinate coordinate) {
   uint16_t data[3];
 
diff --git a/Marlin/src/feature/touch/xpt2046.h b/Marlin/src/feature/touch/xpt2046.h
index 26814926a474c1bcaa587f54641f7cc1d1978e11..901c3c4a4d71d38176614d0caa3d3e498508ac17 100644
--- a/Marlin/src/feature/touch/xpt2046.h
+++ b/Marlin/src/feature/touch/xpt2046.h
@@ -28,15 +28,20 @@
 #define XPT2046_CONTROL  0x80
 
 enum XPTCoordinate : uint8_t {
-  XPT2046_X = 0x10,
-  XPT2046_Y = 0x50
+  XPT2046_X  = 0x10,
+  XPT2046_Y  = 0x50,
+  XPT2046_Z1 = 0x30,
+  XPT2046_Z2 = 0x40
 };
 
+#define XPT2046_Z1_TRESHHOLD 10
+
 class XPT2046 {
 public:
   static void init(void);
   static uint8_t read_buttons();
 private:
+  static bool isTouched();
   static uint16_t getInTouch(const XPTCoordinate coordinate);
 };
 
diff --git a/Marlin/src/pins/pinsDebug_list.h b/Marlin/src/pins/pinsDebug_list.h
index 19bdb0aad60ba1a62c80703f2463005b0eeeab7a..3d3c9bb82f8b066d2cbfbb47f02a690f892ae30f 100644
--- a/Marlin/src/pins/pinsDebug_list.h
+++ b/Marlin/src/pins/pinsDebug_list.h
@@ -1172,3 +1172,6 @@
 #if PIN_EXISTS(TOUCH_CS)
   REPORT_NAME_DIGITAL(__LINE__, TOUCH_CS_PIN)
 #endif
+#if PIN_EXISTS(TOUCH_INT)
+  REPORT_NAME_DIGITAL(__LINE__, TOUCH_INT_PIN)
+#endif