diff --git a/ips/Makefile b/ips/Makefile
index 2f79eeb2ac781e8d55e2f09088a15b65e4f8502b..7dade512d39d630854f64a14b7881a7224e15be9 100644
--- a/ips/Makefile
+++ b/ips/Makefile
@@ -81,6 +81,7 @@ SRCS  += font24CN.c
 SRCS  += image.c
 SRCS  += image2.c
 SRCS  += card10.c
+SRCS  += display.c
 
 
 # Where to find source files for this test
@@ -105,13 +106,16 @@ VPATH += ../lib/bosch/BME680_driver
 IPATH += ../lib/bosch/BMA400-API
 VPATH += ../lib/bosch/BMA400-API
 
-IPATH += LCD
-IPATH += GUI_DEV
-IPATH += Fonts
+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
 
-VPATH += LCD
-VPATH += GUI_DEV
-VPATH += Fonts
 VPATH += image
 
 # Enable assertion checking for development
diff --git a/ips/main.c b/ips/main.c
index eb7bf1d7cf8b8aabf119ef8b26f7898d2c58871e..caa46ddd9b19f60ad6b87dbdb44bb10ab1994b0a 100644
--- a/ips/main.c
+++ b/ips/main.c
@@ -41,15 +41,8 @@
  */
 
 /***** Includes *****/
-#include "mxc_config.h"
-#include "led.h"
-#include "board.h"
 #include "tmr_utils.h"
-#include "i2c.h"
-#include "rtc.h"
-#include "spi.h"
 #include "gpio.h"
-#include "LCD/LCD_Driver.h"
 #include "GUI_DEV/GUI_Paint.h"
 #include "Fonts/fonts.h"
 #include "image/image.h"
@@ -61,78 +54,6 @@
 #include <stdint.h>
 #include <string.h>
 
-// Parameters for PWM output
-#define PORT_PWM   PORT_0  // port
-#define PIN_PWM    PIN_28   // pin
-#define FREQ       200 // (Hz) 
-//#define DUTY_CYCLE 75  // (%)  
-#define DUTY_CYCLE 20  // (%)  
-#define PWM_TIMER  MXC_TMR4  // must change PORT_PWM and PIN_PWM if changed
-
-
-/***** Definitions *****/
-
-#define I2C_DEVICE        MXC_I2C0_BUS0
-
-#define SPI SPI2
-#define SPI_SPEED       1000000  // Bit Rate
-
-/***** Globals *****/
-static const gpio_cfg_t motor_pin = {PORT_0, PIN_8, GPIO_FUNC_OUT, GPIO_PAD_NONE};
-//const gpio_cfg_t DEV_RST_PIN = {PORT_0, PIN_28, GPIO_FUNC_OUT, GPIO_PAD_NONE};
-const gpio_cfg_t DEV_DC_PIN = {PORT_1, PIN_6, GPIO_FUNC_OUT, GPIO_PAD_NONE};
-
-/***** Functions *****/
-void PWM_Output()
-{
-    // Declare variables
-    gpio_cfg_t gpio_pwm;    // to configure GPIO
-    tmr_cfg_t tmr;          // to congigure timer
-    tmr_pwm_cfg_t tmr_pwm;  // for configure PWM
-    unsigned int period_ticks = PeripheralClock / FREQ;
-    unsigned int duty_ticks = period_ticks * DUTY_CYCLE / 100;
-    
-    // Congfigure GPIO port and pin for PWM
-    gpio_pwm.func = GPIO_FUNC_ALT4;
-    gpio_pwm.port = PORT_PWM;
-    gpio_pwm.mask = PIN_PWM; 
-    gpio_pwm.pad = GPIO_PAD_PULL_DOWN;
-    
-    if (GPIO_Config(&gpio_pwm) != E_NO_ERROR) {
-        printf("Failed GPIO_Config for pwm.\n");
-    }
-
-    /*    
-    Steps for configuring a timer for PWM mode:
-    1. Disable the timer
-    2. Set the prescale value
-    3. Configure the timer for PWM mode
-    4. Set polarity, pwm parameters
-    5. Enable Timer
-    */
-
-    TMR_Disable(PWM_TIMER); 
-    
-    TMR_Init(PWM_TIMER, TMR_PRES_1, 0);
-    
-    tmr.mode = TMR_MODE_PWM;
-    tmr.cmp_cnt = period_ticks;
-    tmr.pol = 0;
-    TMR_Config(PWM_TIMER, &tmr);
-    
-    tmr_pwm.pol = 1;
-    tmr_pwm.per_cnt = period_ticks;
-    tmr_pwm.duty_cnt = duty_ticks;
-    
-    if (TMR_PWMConfig(PWM_TIMER, &tmr_pwm) != E_NO_ERROR) {
-        printf("Failed TMR_PWMConfig.\n");
-    }
-    
-    TMR_Enable(PWM_TIMER);
-
-    printf("PWM started.\n");
-}
-
 
 // *****************************************************************************
 int main(void)
@@ -142,18 +63,6 @@ int main(void)
     card10_init();
     card10_diag();
 
-    //GPIO_Config(&DEV_RST_PIN);
-    GPIO_Config(&DEV_DC_PIN);
-
-    PWM_Output();
-    LCD_SetBacklight(500);
-    LCD_Init();
-    LCD_Clear(BLACK);
-
-    Paint_NewImage(LCD_WIDTH, LCD_HEIGHT,0,WHITE);
-
-    Paint_Clear(BLACK);
-    Paint_SetRotate(180);
     Paint_DrawString_EN(0, 0, "123", &Font24, 0x000f, 0xfff0);
     Paint_DrawString_EN(0, 23, "ABC", &Font24, BLUE, CYAN);
     Paint_DrawString_CN(20,42, "΢ѩµç×Ó",  &Font24CN, WHITE, RED);
diff --git a/lib/card10/card10.c b/lib/card10/card10.c
index 6c3d94cb4b520f4e77a725d429733554f15421cd..919e1e63c923aab44253b701fc7b4bd843882a7d 100644
--- a/lib/card10/card10.c
+++ b/lib/card10/card10.c
@@ -1,5 +1,6 @@
 #include "pmic.h"
 #include "bosch.h"
+#include "display.h"
 
 #include "bhy_uc_driver.h"
 #include "Bosch_PCB_7183_di03_BMI160_BMM150-7183_di03.2.1.11696_170103.h"
@@ -21,7 +22,6 @@
 #include <stdint.h>
 #include <string.h>
 
-#define SPI SPI0
 #define SPI_SPEED       1000000  // Bit Rate
 
 void card10_init(void)
@@ -52,14 +52,22 @@ void card10_init(void)
     spi17y_master_cfg.ss1 = Disable;
     spi17y_master_cfg.ss2 = Disable;
 
-    if (SPI_Init(SPI, 0, SPI_SPEED, spi17y_master_cfg) != 0) {
+    if (SPI_Init(SPI0, 0, SPI_SPEED, spi17y_master_cfg) != 0) {
         printf("Error configuring SPI\n");
         while (1);
     }
 
+    if (SPI_Init(SPI2, 0, SPI_SPEED, spi17y_master_cfg) != 0) {
+        printf("Error configuring SPI\n");
+        while (1);
+    }
+
+
     if(bhy_driver_init(bhy1_fw)) {
         printf("Failed to init bhy\n");
     }
+
+    display_init();
 }
 
 static uint32_t ecg_read_reg(uint8_t reg)
diff --git a/ips/Fonts/Release_Notes.html b/lib/gfx/Fonts/Release_Notes.html
similarity index 100%
rename from ips/Fonts/Release_Notes.html
rename to lib/gfx/Fonts/Release_Notes.html
diff --git a/ips/Fonts/font12.c b/lib/gfx/Fonts/font12.c
similarity index 100%
rename from ips/Fonts/font12.c
rename to lib/gfx/Fonts/font12.c
diff --git a/ips/Fonts/font12CN.c b/lib/gfx/Fonts/font12CN.c
similarity index 100%
rename from ips/Fonts/font12CN.c
rename to lib/gfx/Fonts/font12CN.c
diff --git a/ips/Fonts/font16.c b/lib/gfx/Fonts/font16.c
similarity index 100%
rename from ips/Fonts/font16.c
rename to lib/gfx/Fonts/font16.c
diff --git a/ips/Fonts/font20.c b/lib/gfx/Fonts/font20.c
similarity index 100%
rename from ips/Fonts/font20.c
rename to lib/gfx/Fonts/font20.c
diff --git a/ips/Fonts/font24.c b/lib/gfx/Fonts/font24.c
similarity index 100%
rename from ips/Fonts/font24.c
rename to lib/gfx/Fonts/font24.c
diff --git a/ips/Fonts/font24CN.c b/lib/gfx/Fonts/font24CN.c
similarity index 100%
rename from ips/Fonts/font24CN.c
rename to lib/gfx/Fonts/font24CN.c
diff --git a/ips/Fonts/font8.c b/lib/gfx/Fonts/font8.c
similarity index 100%
rename from ips/Fonts/font8.c
rename to lib/gfx/Fonts/font8.c
diff --git a/ips/Fonts/fonts.h b/lib/gfx/Fonts/fonts.h
similarity index 100%
rename from ips/Fonts/fonts.h
rename to lib/gfx/Fonts/fonts.h
diff --git a/ips/GUI_DEV/DEV_Config.c b/lib/gfx/GUI_DEV/DEV_Config.c
similarity index 100%
rename from ips/GUI_DEV/DEV_Config.c
rename to lib/gfx/GUI_DEV/DEV_Config.c
diff --git a/ips/GUI_DEV/DEV_Config.h b/lib/gfx/GUI_DEV/DEV_Config.h
similarity index 100%
rename from ips/GUI_DEV/DEV_Config.h
rename to lib/gfx/GUI_DEV/DEV_Config.h
diff --git a/ips/GUI_DEV/GUI_Paint.c b/lib/gfx/GUI_DEV/GUI_Paint.c
similarity index 100%
rename from ips/GUI_DEV/GUI_Paint.c
rename to lib/gfx/GUI_DEV/GUI_Paint.c
diff --git a/ips/GUI_DEV/GUI_Paint.h b/lib/gfx/GUI_DEV/GUI_Paint.h
similarity index 100%
rename from ips/GUI_DEV/GUI_Paint.h
rename to lib/gfx/GUI_DEV/GUI_Paint.h
diff --git a/ips/LCD/LCD_Driver.c b/lib/gfx/LCD/LCD_Driver.c
similarity index 100%
rename from ips/LCD/LCD_Driver.c
rename to lib/gfx/LCD/LCD_Driver.c
diff --git a/ips/LCD/LCD_Driver.h b/lib/gfx/LCD/LCD_Driver.h
similarity index 100%
rename from ips/LCD/LCD_Driver.h
rename to lib/gfx/LCD/LCD_Driver.h
diff --git a/lib/gfx/display.c b/lib/gfx/display.c
new file mode 100644
index 0000000000000000000000000000000000000000..e68e23910e0705d8270a8c5f83788206567ed061
--- /dev/null
+++ b/lib/gfx/display.c
@@ -0,0 +1,89 @@
+#include "LCD/LCD_Driver.h"
+#include "GUI_DEV/GUI_Paint.h"
+
+#include "gpio.h"
+#include "tmr.h"
+
+#include <stdint.h>
+#include <stdio.h>
+/***** Globals *****/
+static const gpio_cfg_t motor_pin = {PORT_0, PIN_8, GPIO_FUNC_OUT, GPIO_PAD_NONE};
+//const gpio_cfg_t DEV_RST_PIN = {PORT_0, PIN_28, GPIO_FUNC_OUT, GPIO_PAD_NONE};
+const gpio_cfg_t DEV_DC_PIN = {PORT_1, PIN_6, GPIO_FUNC_OUT, GPIO_PAD_NONE};
+
+// Parameters for PWM output
+#define PORT_PWM   PORT_0  // port
+#define PIN_PWM    PIN_28   // pin
+#define FREQ       200 // (Hz) 
+//#define DUTY_CYCLE 75  // (%)  
+#define DUTY_CYCLE 20  // (%)  
+#define PWM_TIMER  MXC_TMR4  // must change PORT_PWM and PIN_PWM if changed
+
+
+/***** Functions *****/
+void PWM_Output(void)
+{
+    // Declare variables
+    gpio_cfg_t gpio_pwm;    // to configure GPIO
+    tmr_cfg_t tmr;          // to congigure timer
+    tmr_pwm_cfg_t tmr_pwm;  // for configure PWM
+    unsigned int period_ticks = PeripheralClock / FREQ;
+    unsigned int duty_ticks = period_ticks * DUTY_CYCLE / 100;
+
+    // Congfigure GPIO port and pin for PWM
+    gpio_pwm.func = GPIO_FUNC_ALT4;
+    gpio_pwm.port = PORT_PWM;
+    gpio_pwm.mask = PIN_PWM; 
+    gpio_pwm.pad = GPIO_PAD_PULL_DOWN;
+
+    if (GPIO_Config(&gpio_pwm) != E_NO_ERROR) {
+        printf("Failed GPIO_Config for pwm.\n");
+    }
+
+    /* 
+    Steps for configuring a timer for PWM mode:
+    1. Disable the timer
+    2. Set the prescale value
+    3. Configure the timer for PWM mode
+    4. Set polarity, pwm parameters
+    5. Enable Timer
+    */
+
+    TMR_Disable(PWM_TIMER);
+
+    TMR_Init(PWM_TIMER, TMR_PRES_1, 0);
+
+    tmr.mode = TMR_MODE_PWM;
+    tmr.cmp_cnt = period_ticks;
+    tmr.pol = 0;
+    TMR_Config(PWM_TIMER, &tmr);
+
+    tmr_pwm.pol = 1;
+    tmr_pwm.per_cnt = period_ticks;
+    tmr_pwm.duty_cnt = duty_ticks;
+
+    if (TMR_PWMConfig(PWM_TIMER, &tmr_pwm) != E_NO_ERROR) {
+        printf("Failed TMR_PWMConfig.\n");
+    }
+
+    TMR_Enable(PWM_TIMER);
+
+    printf("PWM started.\n");
+}
+
+
+void display_init(void)
+{
+    //GPIO_Config(&DEV_RST_PIN);
+    GPIO_Config(&DEV_DC_PIN);
+
+    PWM_Output();
+    LCD_SetBacklight(500);
+    LCD_Init();
+    LCD_Clear(BLACK);
+
+    Paint_NewImage(LCD_WIDTH, LCD_HEIGHT,0,WHITE);
+
+    Paint_Clear(BLACK);
+    Paint_SetRotate(180);
+}
diff --git a/lib/gfx/display.h b/lib/gfx/display.h
new file mode 100644
index 0000000000000000000000000000000000000000..e4244b58a672eed1706ea4c81e4e268fee4147b8
--- /dev/null
+++ b/lib/gfx/display.h
@@ -0,0 +1,5 @@
+#ifndef DISPLAY_H
+
+void display_init(void);
+
+#endif