diff --git a/examples/max7219_8x8/Makefile b/examples/max7219_8x8/Makefile
new file mode 100644
index 0000000..a2e7c00
--- /dev/null
+++ b/examples/max7219_8x8/Makefile
@@ -0,0 +1,3 @@
+PROGRAM = max7219_8x8
+EXTRA_COMPONENTS = extras/max7219
+include ../../common.mk
diff --git a/examples/max7219_8x8/digit_font.h b/examples/max7219_8x8/digit_font.h
new file mode 100644
index 0000000..3ee2aa2
--- /dev/null
+++ b/examples/max7219_8x8/digit_font.h
@@ -0,0 +1,95 @@
+const uint8_t DIGITS[][8] = {
+  {
+    0x0,
+    0x3c,
+    0x66,
+    0x6e,
+    0x76,
+    0x66,
+    0x66,
+    0x3c
+  }, {
+    0x0,
+    0x18,
+    0x18,
+    0x38,
+    0x18,
+    0x18,
+    0x18,
+    0x7e
+  }, {
+    0x0,
+    0x3c,
+    0x66,
+    0x6,
+    0xc,
+    0x30,
+    0x60,
+    0x7e
+  }, {
+    0x0,
+    0x3c,
+    0x66,
+    0x6,
+    0x1c,
+    0x6,
+    0x66,
+    0x3c
+  }, {
+    0x0,
+    0xc,
+    0x1c,
+    0x2c,
+    0x4c,
+    0x7e,
+    0xc,
+    0xc
+  }, {
+    0x0,
+    0x7e,
+    0x60,
+    0x7c,
+    0x6,
+    0x6,
+    0x66,
+    0x3c
+  }, {
+    0x0,
+    0x3c,
+    0x66,
+    0x60,
+    0x7c,
+    0x66,
+    0x66,
+    0x3c
+  }, {
+    0x0,
+    0x7e,
+    0x66,
+    0xc,
+    0xc,
+    0x18,
+    0x18,
+    0x18
+  }, {
+    0x0,
+    0x3c,
+    0x66,
+    0x66,
+    0x3c,
+    0x66,
+    0x66,
+    0x3c
+  }, {
+    0x0,
+    0x3c,
+    0x66,
+    0x66,
+    0x3e,
+    0x6,
+    0x66,
+    0x3c
+  }
+};
+
+const int DIGITS_LEN = sizeof(DIGITS)/8;
diff --git a/examples/max7219_8x8/main.c b/examples/max7219_8x8/main.c
new file mode 100644
index 0000000..9610846
--- /dev/null
+++ b/examples/max7219_8x8/main.c
@@ -0,0 +1,48 @@
+/*
+ * Example of using MAX7219 driver with 8x8 LED Matrix displays
+ *
+ * MAX7219 driver uses the hardware SPI bus, so connect with pinout:
+ *  DIN -> HSPID/HMOSI
+ *  CS -> HSPICS/HCS
+ *  CLK -> HSPICLK/HSCLK
+ */
+#include <esp/uart.h>
+#include <espressif/esp_common.h>
+#include <stdio.h>
+#include <max7219/max7219.h>
+#include <FreeRTOS.h>
+#include <task.h>
+
+#include "./digit_font.h"
+
+#define CS_PIN 15
+#define DELAY 1000
+
+static max7219_display_t disp = {
+  .cs_pin       = CS_PIN,
+  .digits       = 8,
+  .cascade_size = 4,
+  .mirrored     = false
+};
+
+void user_init(void) {
+  uart_set_baud(0, 115200);
+  printf("SDK version:%s\n", sdk_system_get_sdk_version());
+
+  max7219_init(&disp);
+  //max7219_set_decode_mode(&disp, true);
+
+  uint8_t counter = 0;
+  while (true) {
+    max7219_clear(&disp);
+
+    max7219_draw_image_8x8(&disp, 0, DIGITS[counter % 10]);
+    max7219_draw_image_8x8(&disp, 1, DIGITS[(counter+1) % 10]);
+    max7219_draw_image_8x8(&disp, 2, DIGITS[(counter+2) % 10]);
+    max7219_draw_image_8x8(&disp, 3, DIGITS[(counter+3) % 10]);
+
+    vTaskDelay(DELAY / portTICK_PERIOD_MS);
+
+    counter++;
+  }
+}
diff --git a/extras/max7219/max7219.c b/extras/max7219/max7219.c
index 34ad069..2b84028 100644
--- a/extras/max7219/max7219.c
+++ b/extras/max7219/max7219.c
@@ -119,7 +119,7 @@ void max7219_set_shutdown_mode(const max7219_display_t *disp, bool shutdown)
 
 bool max7219_set_digit(const max7219_display_t *disp, uint8_t digit, uint8_t val)
 {
-    if (digit >= disp->digits)
+    if (digit >= (disp->digits * disp->cascade_size))
     {
         debug("Invalid digit: %d", digit);
         return false;
@@ -187,3 +187,9 @@ void max7219_draw_text(const max7219_display_t *disp, uint8_t pos, const char *s
         s++;
     }
 }
+
+void max7219_draw_image_8x8(const max7219_display_t *disp, uint8_t pos, const void *image)
+{
+    for (uint8_t i = (pos * disp->digits), offset = 0; i < (disp->digits * disp->cascade_size) && offset < 8; i++, offset++)
+        max7219_set_digit(disp, i, *((uint8_t *)image + offset));
+}
diff --git a/extras/max7219/max7219.h b/extras/max7219/max7219.h
index 59756d4..e2d4175 100644
--- a/extras/max7219/max7219.h
+++ b/extras/max7219/max7219.h
@@ -88,6 +88,14 @@ void max7219_clear(const max7219_display_t *disp);
  */
 void max7219_draw_text(const max7219_display_t *disp, uint8_t pos, const char *s);
 
+/**
+ * Draw 64-bit image on 8x8 matrix.
+ * @param disp Pointer to display descriptor
+ * @param pos Start digit
+ * @param image 64-bit buffer with image data
+ */
+void max7219_draw_image_8x8(const max7219_display_t *disp, uint8_t pos, const void *image);
+
 #ifdef __cplusplus
 }
 #endif