diff --git a/ecgtest/Makefile b/ecgtest/Makefile
index fe06e462c6a867de3e9bcef0e14be3e10b6c094f..32a4c872c2cf34fc2551378aa799ffbacdea1d5a 100644
--- a/ecgtest/Makefile
+++ b/ecgtest/Makefile
@@ -68,14 +68,19 @@ CMSIS_ROOT=$(LIBS_DIR)/CMSIS
 # Source files for this test (add path to VPATH below)
 SRCS  = main.c
 SRCS  += pmic.c
-SRCS  += ../lib/card10/oled96.c
-SRCS  += ../lib/card10/fonts.c
 SRCS  += bosch.c
 SRCS  += bhy_support.c bhy_uc_driver.c bhy.c
 SRCS  += MAX77650-Arduino-Library.c
 SRCS  += bme680.h
 SRCS  += bma400.c
+SRCS  += LCD_Driver.c
+SRCS  += GUI_Paint.c
+SRCS  += DEV_Config.c
+SRCS  += font24.c
+SRCS  += font24CN.c
 SRCS  += card10.c
+SRCS  += display.c
+
 
 # Where to find source files for this test
 VPATH = .
@@ -99,6 +104,16 @@ VPATH += ../lib/bosch/BME680_driver
 IPATH += ../lib/bosch/BMA400-API
 VPATH += ../lib/bosch/BMA400-API
 
+IPATH += ../lib/gfx
+IPATH += ../lib/gfx/LCD
+IPATH += ../lib/gfx/GUI_DEV
+IPATH += ../lib/gfx/Fonts
+
+VPATH += ../lib/gfx
+VPATH += ../lib/gfx/LCD
+VPATH += ../lib/gfx/GUI_DEV
+VPATH += ../lib/gfx/Fonts
+
 # Enable assertion checking for development
 PROJ_CFLAGS+=-DMXC_ASSERT_ENABLE
 
diff --git a/ecgtest/main.c b/ecgtest/main.c
index e314ffa79d7a4feeba240650dc0960db3e201af2..e73149823f017d6046d87256990914e293e15d52 100644
--- a/ecgtest/main.c
+++ b/ecgtest/main.c
@@ -53,7 +53,7 @@
 #include "rtc.h"
 #include "spi.h"
 #include "MAX30003.h"
-#include "oled96.h"
+#include "GUI_DEV/GUI_Paint.h"
 #include "pmic.h"
 #include "card10.h"
 #include <stdbool.h>
@@ -166,34 +166,52 @@ void ecg_config(void)
     return;
 }
 
-uint8_t content[1024];
+#define SIZE_X 160
+#define SIZE_Y 80
+
+uint16_t content[SIZE_X*SIZE_Y];
+uint8_t prev;
 
 void clear(void)
 {
-    memset(content, 0x00, 1024);
+    memset(content, 0x00, sizeof(content));
+    prev = 32;
 }
 
 
 void set(uint8_t index, int8_t val)
 {
-    uint8_t *p = &content[index];
 
     if(val < -31) val = -31;
     if(val > 32) val = 32;
 
-    int8_t pos = -val + 32;
-    p += (pos / 8) * 128;
+    int8_t pos = val + 32;
+
+    int min, max;
+    if(prev < pos) {
+        min = prev;
+        max = pos;
+    } else {
+        min = pos;
+        max = prev;
+    }
+
+    for(int i = min; i < max + 1; i++) {
+        uint16_t *p = content;
+        p += i * SIZE_X + (SIZE_X - index - 1);
+        *p = 0x00F8;
+    }
 
-    *p |= (1 << (pos % 8));
+    prev = pos;
 }
 
-int16_t samples[256];
+int16_t samples[SIZE_X*2];
 
 void update(void)
 {
     clear();
     int16_t scale = 0;
-    for(int i=0; i<256; i++) {
+    for(int i=0; i<SIZE_X*2; i++) {
         if(abs(samples[i]) > scale) {
             scale = abs(samples[i]);
         }
@@ -201,19 +219,19 @@ void update(void)
 
     scale /= 32;
 
-    for(int i=0; i<128; i++) {
+    for(int i=0; i<SIZE_X; i++) {
         set(i, ((samples[i*2] + samples[i*2 + 1]) / scale) / 2);
     }
 
-    oledset(content);
+    LCD_Set((uint8_t*)content, sizeof(content));
 }
 
 uint8_t sample_count = 0;
 
 void add_sample(int16_t sample)
 {
-    memmove(samples, samples + 1, sizeof(*samples) * 255);
-    samples[255] = sample;
+    memmove(samples, samples + 1, sizeof(*samples) * (SIZE_X*2-1));
+    samples[SIZE_X*2-1] = sample;
     sample_count++;
 
     if(sample_count == 5) {
diff --git a/lib/card10/card10.c b/lib/card10/card10.c
index 919e1e63c923aab44253b701fc7b4bd843882a7d..d8e378be6a62df53fc03750cbe6e5321fd607007 100644
--- a/lib/card10/card10.c
+++ b/lib/card10/card10.c
@@ -22,7 +22,7 @@
 #include <stdint.h>
 #include <string.h>
 
-#define SPI_SPEED       1000000  // Bit Rate
+#define SPI_SPEED       (15 * 1000 * 1000 * 1)  // Bit Rate. Display has 15 MHz limit
 
 void card10_init(void)
 {
diff --git a/lib/gfx/GUI_DEV/DEV_Config.c b/lib/gfx/GUI_DEV/DEV_Config.c
index 15837a65ebd0ec06ed46fa10d383475325b7881a..328292ef47c276000b6c3e09aec41cce1e8c4b0b 100644
--- a/lib/gfx/GUI_DEV/DEV_Config.c
+++ b/lib/gfx/GUI_DEV/DEV_Config.c
@@ -38,14 +38,16 @@
 //const gpio_cfg_t DEV_BL_PIN = {PORT_0, PIN_8, GPIO_FUNC_OUT, GPIO_PAD_NONE};
 
 /********************************************************************************/
-void lcd_write(uint8_t data)
+void lcd_write(uint8_t *data, int size)
 {
     spi_req_t req;
-    uint8_t tx_data[] = {data};
+    //uint8_t tx_data[] = {data};
     uint8_t rx_data[] = {0};
-    req.tx_data = tx_data;
-    req.rx_data = rx_data;
-    req.len = 1;
+    //req.tx_data = tx_data;
+    req.tx_data = data;
+    //req.rx_data = rx_data;
+    req.rx_data = NULL;
+    req.len = size;
     req.bits = 8;
     req.width = SPI17Y_WIDTH_1;
     req.ssel = 0;
@@ -57,4 +59,3 @@ void lcd_write(uint8_t data)
     SPI_MasterTrans(SPI, &req);
 }
 
-
diff --git a/lib/gfx/GUI_DEV/DEV_Config.h b/lib/gfx/GUI_DEV/DEV_Config.h
index 024feee3017fe0673d6d648251bb8c9e594eb5ba..94eaa7ae50e265cd8f7701ec1e2dbd56faf1dab2 100644
--- a/lib/gfx/GUI_DEV/DEV_Config.h
+++ b/lib/gfx/GUI_DEV/DEV_Config.h
@@ -60,9 +60,9 @@ extern const gpio_cfg_t DEV_DC_PIN;
 /**
  * SPI
 **/
-void lcd_write(uint8_t data);
+void lcd_write(uint8_t* data, int size);
 //#define DEV_SPI_WRITE(_dat)  HAL_SPI_Transmit(&hspi1, (uint8_t *)&_dat, 1, 500);
-#define DEV_SPI_WRITE(_dat) lcd_write(_dat)
+#define DEV_SPI_WRITE(_dat) lcd_write(&_dat, 1)
 
 /**
  * delay x ms
diff --git a/lib/gfx/LCD/LCD_Driver.c b/lib/gfx/LCD/LCD_Driver.c
index a868cb133cbcd221b60b7f451311462aa98f49cc..ecc4d6d856993965a5c3d910b789fa504768b45f 100644
--- a/lib/gfx/LCD/LCD_Driver.c
+++ b/lib/gfx/LCD/LCD_Driver.c
@@ -72,7 +72,8 @@ void LCD_WriteData_Byte(UBYTE da)
 	//DEV_Digital_Write(DEV_CS_PIN,0);
 	DEV_Digital_Write(DEV_DC_PIN,1);
 	DEV_SPI_WRITE(i);
-	DEV_SPI_WRITE(da);
+    uint8_t tmp = da;
+	DEV_SPI_WRITE(tmp);
 	//DEV_Digital_Write(DEV_CS_PIN,1);
 }	  
 
@@ -281,4 +282,9 @@ void LCD_SetUWORD(UWORD x, UWORD y, UWORD Color)
 } 
 
 
-
+void LCD_Set(uint8_t *data, int len)
+{
+	LCD_SetCursor(0,0,160-1,80-1);
+	DEV_Digital_Write(DEV_DC_PIN,1);
+    lcd_write(data, len);
+}