diff --git a/lib/card10/display.c b/lib/card10/display.c
index 1e334202880580c194a843f8dc81ca4374ca4a35..e1d66276646f480cde27c063f162d7bd85dd6138 100644
--- a/lib/card10/display.c
+++ b/lib/card10/display.c
@@ -9,38 +9,37 @@
 #include <stdint.h>
 #include <stdio.h>
 /***** Globals *****/
-const gpio_cfg_t DEV_DC_PIN = {PORT_1, PIN_6, 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
-
+#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");
-    }
-
-    /* 
+	// 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
@@ -49,55 +48,55 @@ void PWM_Output(void)
     5. Enable Timer
     */
 
-    TMR_Disable(PWM_TIMER);
+	TMR_Disable(PWM_TIMER);
 
-    TMR_Init(PWM_TIMER, TMR_PRES_1, 0);
+	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.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;
+	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");
-    }
+	if (TMR_PWMConfig(PWM_TIMER, &tmr_pwm) != E_NO_ERROR) {
+		printf("Failed TMR_PWMConfig.\n");
+	}
 
-    TMR_Enable(PWM_TIMER);
+	TMR_Enable(PWM_TIMER);
 
-    printf("PWM started.\n");
+	printf("PWM started.\n");
 }
 
 void display_set_reset_pin(uint8_t state)
 {
-    if(!portexpander_detected()) {
-        MAX77650_setDO(state ? true:false);
-    } else {
-        portexpander_set(4, state);
-    }
+	if (!portexpander_detected()) {
+		MAX77650_setDO(state ? true : false);
+	} else {
+		portexpander_set(4, state);
+	}
 }
 
 void display_init(void)
 {
-    if(!portexpander_detected()) {
-        // Open-drain
-        MAX77650_setDRV(false);
-        // Output
-        MAX77650_setDIR(false);
-    }
+	if (!portexpander_detected()) {
+		// Open-drain
+		MAX77650_setDRV(false);
+		// Output
+		MAX77650_setDIR(false);
+	}
 
-    GPIO_Config(&DEV_DC_PIN);
+	GPIO_Config(&DEV_DC_PIN);
 
-    PWM_Output();
-    LCD_SetBacklight(500);
-    LCD_Init();
-    LCD_Clear(BLACK);
+	PWM_Output();
+	LCD_SetBacklight(500);
+	LCD_Init();
+	LCD_Clear(BLACK);
 
-    Paint_NewImage(LCD_WIDTH, LCD_HEIGHT,0,WHITE);
+	Paint_NewImage(LCD_WIDTH, LCD_HEIGHT, 0, WHITE);
 
-    Paint_Clear(BLACK);
-    Paint_SetRotate(180);
+	Paint_Clear(BLACK);
+	Paint_SetRotate(180);
 }
diff --git a/lib/card10/portexpander.c b/lib/card10/portexpander.c
index 67192cc06d767f62cdd5942ca05a75d6350422f4..e372e71fe3c389c617c3934f355bfc58d548bb10 100644
--- a/lib/card10/portexpander.c
+++ b/lib/card10/portexpander.c
@@ -12,72 +12,76 @@ static uint8_t output_state;
 
 void portexpander_init(void)
 {
-    uint8_t addr = 0x21;
-    int ret;
-
-    // Enable pull-ups for buttons
-    uint8_t command[] = {0x43, 0x68};
-    ret = I2C_MasterWrite(MXC_I2C1_BUS0, addr << 1, command, 2, 0);
-
-    if(ret != 2) {
-        printf("portexpander NOT detected\n");
-        detected = false;
-        return;
-    }
-    detected = true;
-
-    // Set _all_ outputs to open-drain to support the high side p-channel transistors.
-    command[0] = 0x4F; command[1] = 0x01;
-    I2C_MasterWrite(MXC_I2C1_BUS0, addr << 1, command, 2, 0);
-
-    // Enable outputs for the transistors, the LED and the LCD reset
-    command[0] = 0x03; command[1] = 0x68;
-    I2C_MasterWrite(MXC_I2C1_BUS0, addr << 1, command, 2, 0);
-
-    // Set outputs to high (i.e. open-drain)
-    output_state = 0x97;
-    command[0] = 0x01; command[1] = output_state;
-    I2C_MasterWrite(MXC_I2C1_BUS0, addr << 1, command, 2, 0);
-
-    // Turn on LEDs
-    // TODO: only turn on LEDs if value != 0,0,0 && dim > 0
-    command[0] = 0x01; command[1] = 0x90;
-    I2C_MasterWrite(MXC_I2C1_BUS0, addr << 1, command, 2, 0);
-
+	uint8_t addr = 0x21;
+	int ret;
+
+	// Enable pull-ups for buttons
+	uint8_t command[] = { 0x43, 0x68 };
+	ret = I2C_MasterWrite(MXC_I2C1_BUS0, addr << 1, command, 2, 0);
+
+	if (ret != 2) {
+		printf("portexpander NOT detected\n");
+		detected = false;
+		return;
+	}
+	detected = true;
+
+	// Set _all_ outputs to open-drain to support the high side p-channel transistors.
+	command[0] = 0x4F;
+	command[1] = 0x01;
+	I2C_MasterWrite(MXC_I2C1_BUS0, addr << 1, command, 2, 0);
+
+	// Enable outputs for the transistors, the LED and the LCD reset
+	command[0] = 0x03;
+	command[1] = 0x68;
+	I2C_MasterWrite(MXC_I2C1_BUS0, addr << 1, command, 2, 0);
+
+	// Set outputs to high (i.e. open-drain)
+	output_state = 0x97;
+	command[0]   = 0x01;
+	command[1]   = output_state;
+	I2C_MasterWrite(MXC_I2C1_BUS0, addr << 1, command, 2, 0);
+
+	// Turn on LEDs
+	// TODO: only turn on LEDs if value != 0,0,0 && dim > 0
+	command[0] = 0x01;
+	command[1] = 0x90;
+	I2C_MasterWrite(MXC_I2C1_BUS0, addr << 1, command, 2, 0);
 }
 
 uint8_t portexpander_get(void)
 {
-    uint8_t addr = 0x21;
-    uint8_t command[] = {0x00};
-    uint8_t buf = 0xFF;
+	uint8_t addr      = 0x21;
+	uint8_t command[] = { 0x00 };
+	uint8_t buf       = 0xFF;
 
-    if(detected) {
-        I2C_MasterWrite(MXC_I2C1_BUS0, addr << 1, command, 1, 1);
-        I2C_MasterRead(MXC_I2C1_BUS0, addr << 1, &buf, 1, 0);
-    }
+	if (detected) {
+		I2C_MasterWrite(MXC_I2C1_BUS0, addr << 1, command, 1, 1);
+		I2C_MasterRead(MXC_I2C1_BUS0, addr << 1, &buf, 1, 0);
+	}
 
-    return buf;
+	return buf;
 }
 
 bool portexpander_detected(void)
 {
-    return detected;
+	return detected;
 }
 
 void portexpander_set(uint8_t pin, uint8_t value)
 {
-    uint8_t addr = 0x21;
-    uint8_t command[2];
-
-    if(detected && pin < 8) {
-        if(value) {
-            output_state |= (1 << pin);
-        } else {
-            output_state &= ~(1 << pin);
-        }
-
-        command[0] = 0x01; command[1] = output_state;
-        I2C_MasterWrite(MXC_I2C1_BUS0, addr << 1, command, 2, 0);
-    }
+	uint8_t addr = 0x21;
+	uint8_t command[2];
+
+	if (detected && pin < 8) {
+		if (value) {
+			output_state |= (1 << pin);
+		} else {
+			output_state &= ~(1 << pin);
+		}
+
+		command[0] = 0x01;
+		command[1] = output_state;
+		I2C_MasterWrite(MXC_I2C1_BUS0, addr << 1, command, 2, 0);
+	}
 }
diff --git a/lib/gfx/LCD/LCD_Driver.c b/lib/gfx/LCD/LCD_Driver.c
index 7005fda5244f2fa109bba77e40c8cc30948fd095..7cc1d15f1282df8506290471e87720b73bc246b0 100644
--- a/lib/gfx/LCD/LCD_Driver.c
+++ b/lib/gfx/LCD/LCD_Driver.c
@@ -1,315 +1,316 @@
-/*****************************************************************************
-* | File      	:		LCD_Driver.c
-* | Author      :   Waveshare team
-* | Function    :   Electronic paper driver
-* | Info        :
-*----------------
-* |	This version:   V1.0
-* | Date        :   2018-11-18
-* | Info        :   
-#
-# Permission is hereby granted, free of UBYTEge, to any person obtaining a copy
-# of this software and associated documnetation files (the "Software"), to deal
-# in the Software without restriction, including without limitation the rights
-# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-# copies of the Software, and to permit persons to  whom the Software is
-# furished to do so, subject to the following conditions:
-#
-# The above copyright notice and this permission notice shall be included in
-# all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-# LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-# THE SOFTWARE.
-#
-******************************************************************************/
-#include "LCD_Driver.h"
-static uint8_t screen[LCD_HEIGHT][LCD_WIDTH][2];
-
-/*******************************************************************************
-function:
-	Hardware reset
-*******************************************************************************/
-static void LCD_Reset(void)
-{
-	//DEV_Digital_Write(DEV_CS_PIN,0);
-	DEV_Delay_ms(20);
-    DEV_RESET_LOW();
-	DEV_Delay_ms(20);
-    DEV_RESET_HIGH();
-	DEV_Delay_ms(20);
-}
-
-/*******************************************************************************
-function:
-	Setting backlight
-parameter	:
-		value : Range 0~1000   Duty cycle is value/1000	
-*******************************************************************************/
-void LCD_SetBacklight(UWORD Value)
-{
-	DEV_Set_BL(Value);
-}
-
-/*******************************************************************************
-function:
-		Write register address and data
-*******************************************************************************/
-void LCD_WriteData_Byte(UBYTE da) 
-{	
-	//DEV_Digital_Write(DEV_CS_PIN,0);
-	DEV_Digital_Write(DEV_DC_PIN,1);
-	DEV_SPI_WRITE(da);  
-	//DEV_Digital_Write(DEV_CS_PIN,1);
-}  
-
- void LCD_WriteData_Word(UWORD da)
-{
-	UBYTE i=(da>>8)&0xff;
-	//DEV_Digital_Write(DEV_CS_PIN,0);
-	DEV_Digital_Write(DEV_DC_PIN,1);
-	DEV_SPI_WRITE(i);
-    uint8_t tmp = da;
-	DEV_SPI_WRITE(tmp);
-	//DEV_Digital_Write(DEV_CS_PIN,1);
-}	  
-
-void LCD_WriteReg(UBYTE da)	 
-{	
-	//DEV_Digital_Write(DEV_CS_PIN,0);
-	DEV_Digital_Write(DEV_DC_PIN,0);
-	DEV_SPI_WRITE(da);
-	//DEV_Digital_Write(DEV_CS_PIN,1);
-}
-
-/******************************************************************************
-function:	
-		Common register initialization
-******************************************************************************/
-void LCD_Init(void)
-{
-	LCD_Reset();
-
-	//************* Start Initial Sequence **********// 
-	LCD_WriteReg(0x11);//Sleep exit 
-	DEV_Delay_ms (120);
-  LCD_WriteReg(0x21); 
-  LCD_WriteReg(0x21); 
-
-  LCD_WriteReg(0xB1); 
-  LCD_WriteData_Byte(0x05);
-  LCD_WriteData_Byte(0x3A);
-  LCD_WriteData_Byte(0x3A);
-
-  LCD_WriteReg(0xB2);
-  LCD_WriteData_Byte(0x05);
-  LCD_WriteData_Byte(0x3A);
-  LCD_WriteData_Byte(0x3A);
-
-  LCD_WriteReg(0xB3); 
-  LCD_WriteData_Byte(0x05);  
-  LCD_WriteData_Byte(0x3A);
-  LCD_WriteData_Byte(0x3A);
-  LCD_WriteData_Byte(0x05);
-  LCD_WriteData_Byte(0x3A);
-  LCD_WriteData_Byte(0x3A);
-
-  LCD_WriteReg(0xB4);
-  LCD_WriteData_Byte(0x03);
-
-  LCD_WriteReg(0xC0);
-  LCD_WriteData_Byte(0x62);
-  LCD_WriteData_Byte(0x02);
-  LCD_WriteData_Byte(0x04);
-
-  LCD_WriteReg(0xC1);
-  LCD_WriteData_Byte(0xC0);
-
-  LCD_WriteReg(0xC2);
-  LCD_WriteData_Byte(0x0D);
-  LCD_WriteData_Byte(0x00);
-
-  LCD_WriteReg(0xC3);
-  LCD_WriteData_Byte(0x8D);
-  LCD_WriteData_Byte(0x6A);   
-
-  LCD_WriteReg(0xC4);
-  LCD_WriteData_Byte(0x8D); 
-  LCD_WriteData_Byte(0xEE); 
-
-  LCD_WriteReg(0xC5);  /*VCOM*/
-  LCD_WriteData_Byte(0x0E);    
-
-  LCD_WriteReg(0xE0);
-  LCD_WriteData_Byte(0x10);
-  LCD_WriteData_Byte(0x0E);
-  LCD_WriteData_Byte(0x02);
-  LCD_WriteData_Byte(0x03);
-  LCD_WriteData_Byte(0x0E);
-  LCD_WriteData_Byte(0x07);
-  LCD_WriteData_Byte(0x02);
-  LCD_WriteData_Byte(0x07);
-  LCD_WriteData_Byte(0x0A);
-  LCD_WriteData_Byte(0x12);
-  LCD_WriteData_Byte(0x27);
-  LCD_WriteData_Byte(0x37);
-  LCD_WriteData_Byte(0x00);
-  LCD_WriteData_Byte(0x0D);
-  LCD_WriteData_Byte(0x0E);
-  LCD_WriteData_Byte(0x10);
-
-  LCD_WriteReg(0xE1);
-  LCD_WriteData_Byte(0x10);
-  LCD_WriteData_Byte(0x0E);
-  LCD_WriteData_Byte(0x03);
-  LCD_WriteData_Byte(0x03);
-  LCD_WriteData_Byte(0x0F);
-  LCD_WriteData_Byte(0x06);
-  LCD_WriteData_Byte(0x02);
-  LCD_WriteData_Byte(0x08);
-  LCD_WriteData_Byte(0x0A);
-  LCD_WriteData_Byte(0x13);
-  LCD_WriteData_Byte(0x26);
-  LCD_WriteData_Byte(0x36);
-  LCD_WriteData_Byte(0x00);
-  LCD_WriteData_Byte(0x0D);
-  LCD_WriteData_Byte(0x0E);
-  LCD_WriteData_Byte(0x10);
-
-  LCD_WriteReg(0x3A); 
-  LCD_WriteData_Byte(0x05);
-
-  LCD_WriteReg(0x36);
-  LCD_WriteData_Byte(0xA8);//
-
-  LCD_WriteReg(0x29); 
-} 
-
-/******************************************************************************
-function:	Set the cursor position
-parameter	:
-		Xstart: 	Start UWORD x coordinate
-	  Ystart:		Start UWORD y coordinate
-	  Xend  :		End UWORD coordinates
-	  Yend  :		End UWORD coordinatesen
-******************************************************************************/
-void LCD_SetCursor(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD  Yend)
-{ 
-	Xstart = Xstart + 1;
-	Xend = Xend + 1;
-	Ystart = Ystart + 26;
-	Yend = Yend+26;
-	LCD_WriteReg(0x2a);
-	LCD_WriteData_Byte(Xstart>>8);
-	LCD_WriteData_Byte(Xstart);
-	LCD_WriteData_Byte(Xend >>8);
-	LCD_WriteData_Byte(Xend );
-
-	LCD_WriteReg(0x2b);
-	LCD_WriteData_Byte(Ystart>>8);
-	LCD_WriteData_Byte(Ystart);
-	LCD_WriteData_Byte(Yend>>8);
-	LCD_WriteData_Byte(Yend);
-
-	LCD_WriteReg(0x2C);
-}
-#if 0
-/******************************************************************************
-function:	Clear screen function, refresh the screen to a certain color
-parameter	:
-		Color :		The color you want to clear all the screen
-******************************************************************************/
-void LCD_Clear(UWORD Color)
-{
-	UWORD i,j;  	
-	LCD_SetCursor(0,0,LCD_WIDTH-1,LCD_HEIGHT-1);
-	for(i = 0; i < LCD_WIDTH; i++){
-		for(j = 0; j < LCD_HEIGHT; j++){
-			LCD_WriteData_Word(Color);
-		}
-	 }
-}
-#endif
-
-/******************************************************************************
-function:	Refresh a certain area to the same color
-parameter	:
-		Xstart: 	Start UWORD x coordinate
-	  Ystart:		Start UWORD y coordinate
-	  Xend  :		End UWORD coordinates
-	  Yend  :		End UWORD coordinates
-	  color :		Set the color
-******************************************************************************/
-void LCD_ClearWindow(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend,UWORD color)
-{          
-	UWORD i,j; 
-	LCD_SetCursor(Xstart, Ystart, Xend-1,Yend-1);
-	for(i = Ystart; i <= Yend-1; i++){													   	 	
-		for(j = Xstart; j <= Xend-1; j++){
-			LCD_WriteData_Word(color);
-		}
-	} 					  	    
-}  
-
-/******************************************************************************
-function: Set the color of an area
-parameter	:
-		Xstart: 	Start UWORD x coordinate
-	  Ystart:		Start UWORD y coordinate
-	  Xend  :		End UWORD coordinates
-	  Yend  :		End UWORD coordinates
-	  Color :		Set the color
-******************************************************************************/
-void LCD_SetWindowColor(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend,UWORD  Color)
-{
-	LCD_SetCursor( Xstart,Ystart,Xend,Yend);
-	LCD_WriteData_Word(Color); 	    
-}
-
-/******************************************************************************
-function: Draw a UWORD
-parameter	:
-		X			: 	Set the X coordinate
-	  Y			:		Set the Y coordinate
-	  Color :		Set the color
-******************************************************************************/
-#if 0
-void LCD_SetUWORD(UWORD x, UWORD y, UWORD Color)
-{
-	LCD_SetCursor(x,y,x,y);
-	LCD_WriteData_Word(Color); 	    
-} 
-#endif
-
-void LCD_SetUWORD(UWORD x, UWORD y, UWORD Color)
-{
-    screen[y][x][0] = (Color >> 8);
-    screen[y][x][1] = (Color & 0xFF);
-}
-
-void LCD_Clear(UWORD Color)
-{
-	UWORD i,j;
-	for(i = 0; i < LCD_WIDTH; i++){
-		for(j = 0; j < LCD_HEIGHT; j++){
-			LCD_SetUWORD(i, j, 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);
-}
-
-void LCD_Update(void)
-{
-    LCD_Set((uint8_t*)screen, sizeof(screen));
-}
-
+/*****************************************************************************
+* | File      	:		LCD_Driver.c
+* | Author      :   Waveshare team
+* | Function    :   Electronic paper driver
+* | Info        :
+*----------------
+* |	This version:   V1.0
+* | Date        :   2018-11-18
+* | Info        :   
+#
+# Permission is hereby granted, free of UBYTEge, to any person obtaining a copy
+# of this software and associated documnetation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to  whom the Software is
+# furished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+#
+******************************************************************************/
+#include "LCD_Driver.h"
+static uint8_t screen[LCD_HEIGHT][LCD_WIDTH][2];
+
+/*******************************************************************************
+function:
+	Hardware reset
+*******************************************************************************/
+static void LCD_Reset(void)
+{
+	//DEV_Digital_Write(DEV_CS_PIN,0);
+	DEV_Delay_ms(20);
+	DEV_RESET_LOW();
+	DEV_Delay_ms(20);
+	DEV_RESET_HIGH();
+	DEV_Delay_ms(20);
+}
+
+/*******************************************************************************
+function:
+	Setting backlight
+parameter	:
+		value : Range 0~1000   Duty cycle is value/1000	
+*******************************************************************************/
+void LCD_SetBacklight(UWORD Value)
+{
+	DEV_Set_BL(Value);
+}
+
+/*******************************************************************************
+function:
+		Write register address and data
+*******************************************************************************/
+void LCD_WriteData_Byte(UBYTE da)
+{
+	//DEV_Digital_Write(DEV_CS_PIN,0);
+	DEV_Digital_Write(DEV_DC_PIN, 1);
+	DEV_SPI_WRITE(da);
+	//DEV_Digital_Write(DEV_CS_PIN,1);
+}
+
+void LCD_WriteData_Word(UWORD da)
+{
+	UBYTE i = (da >> 8) & 0xff;
+	//DEV_Digital_Write(DEV_CS_PIN,0);
+	DEV_Digital_Write(DEV_DC_PIN, 1);
+	DEV_SPI_WRITE(i);
+	uint8_t tmp = da;
+	DEV_SPI_WRITE(tmp);
+	//DEV_Digital_Write(DEV_CS_PIN,1);
+}
+
+void LCD_WriteReg(UBYTE da)
+{
+	//DEV_Digital_Write(DEV_CS_PIN,0);
+	DEV_Digital_Write(DEV_DC_PIN, 0);
+	DEV_SPI_WRITE(da);
+	//DEV_Digital_Write(DEV_CS_PIN,1);
+}
+
+/******************************************************************************
+function:	
+		Common register initialization
+******************************************************************************/
+void LCD_Init(void)
+{
+	LCD_Reset();
+
+	//************* Start Initial Sequence **********//
+	LCD_WriteReg(0x11); //Sleep exit
+	DEV_Delay_ms(120);
+	LCD_WriteReg(0x21);
+	LCD_WriteReg(0x21);
+
+	LCD_WriteReg(0xB1);
+	LCD_WriteData_Byte(0x05);
+	LCD_WriteData_Byte(0x3A);
+	LCD_WriteData_Byte(0x3A);
+
+	LCD_WriteReg(0xB2);
+	LCD_WriteData_Byte(0x05);
+	LCD_WriteData_Byte(0x3A);
+	LCD_WriteData_Byte(0x3A);
+
+	LCD_WriteReg(0xB3);
+	LCD_WriteData_Byte(0x05);
+	LCD_WriteData_Byte(0x3A);
+	LCD_WriteData_Byte(0x3A);
+	LCD_WriteData_Byte(0x05);
+	LCD_WriteData_Byte(0x3A);
+	LCD_WriteData_Byte(0x3A);
+
+	LCD_WriteReg(0xB4);
+	LCD_WriteData_Byte(0x03);
+
+	LCD_WriteReg(0xC0);
+	LCD_WriteData_Byte(0x62);
+	LCD_WriteData_Byte(0x02);
+	LCD_WriteData_Byte(0x04);
+
+	LCD_WriteReg(0xC1);
+	LCD_WriteData_Byte(0xC0);
+
+	LCD_WriteReg(0xC2);
+	LCD_WriteData_Byte(0x0D);
+	LCD_WriteData_Byte(0x00);
+
+	LCD_WriteReg(0xC3);
+	LCD_WriteData_Byte(0x8D);
+	LCD_WriteData_Byte(0x6A);
+
+	LCD_WriteReg(0xC4);
+	LCD_WriteData_Byte(0x8D);
+	LCD_WriteData_Byte(0xEE);
+
+	LCD_WriteReg(0xC5); /*VCOM*/
+	LCD_WriteData_Byte(0x0E);
+
+	LCD_WriteReg(0xE0);
+	LCD_WriteData_Byte(0x10);
+	LCD_WriteData_Byte(0x0E);
+	LCD_WriteData_Byte(0x02);
+	LCD_WriteData_Byte(0x03);
+	LCD_WriteData_Byte(0x0E);
+	LCD_WriteData_Byte(0x07);
+	LCD_WriteData_Byte(0x02);
+	LCD_WriteData_Byte(0x07);
+	LCD_WriteData_Byte(0x0A);
+	LCD_WriteData_Byte(0x12);
+	LCD_WriteData_Byte(0x27);
+	LCD_WriteData_Byte(0x37);
+	LCD_WriteData_Byte(0x00);
+	LCD_WriteData_Byte(0x0D);
+	LCD_WriteData_Byte(0x0E);
+	LCD_WriteData_Byte(0x10);
+
+	LCD_WriteReg(0xE1);
+	LCD_WriteData_Byte(0x10);
+	LCD_WriteData_Byte(0x0E);
+	LCD_WriteData_Byte(0x03);
+	LCD_WriteData_Byte(0x03);
+	LCD_WriteData_Byte(0x0F);
+	LCD_WriteData_Byte(0x06);
+	LCD_WriteData_Byte(0x02);
+	LCD_WriteData_Byte(0x08);
+	LCD_WriteData_Byte(0x0A);
+	LCD_WriteData_Byte(0x13);
+	LCD_WriteData_Byte(0x26);
+	LCD_WriteData_Byte(0x36);
+	LCD_WriteData_Byte(0x00);
+	LCD_WriteData_Byte(0x0D);
+	LCD_WriteData_Byte(0x0E);
+	LCD_WriteData_Byte(0x10);
+
+	LCD_WriteReg(0x3A);
+	LCD_WriteData_Byte(0x05);
+
+	LCD_WriteReg(0x36);
+	LCD_WriteData_Byte(0xA8); //
+
+	LCD_WriteReg(0x29);
+}
+
+/******************************************************************************
+function:	Set the cursor position
+parameter	:
+		Xstart: 	Start UWORD x coordinate
+	  Ystart:		Start UWORD y coordinate
+	  Xend  :		End UWORD coordinates
+	  Yend  :		End UWORD coordinatesen
+******************************************************************************/
+void LCD_SetCursor(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend)
+{
+	Xstart = Xstart + 1;
+	Xend   = Xend + 1;
+	Ystart = Ystart + 26;
+	Yend   = Yend + 26;
+	LCD_WriteReg(0x2a);
+	LCD_WriteData_Byte(Xstart >> 8);
+	LCD_WriteData_Byte(Xstart);
+	LCD_WriteData_Byte(Xend >> 8);
+	LCD_WriteData_Byte(Xend);
+
+	LCD_WriteReg(0x2b);
+	LCD_WriteData_Byte(Ystart >> 8);
+	LCD_WriteData_Byte(Ystart);
+	LCD_WriteData_Byte(Yend >> 8);
+	LCD_WriteData_Byte(Yend);
+
+	LCD_WriteReg(0x2C);
+}
+#if 0
+/******************************************************************************
+function:	Clear screen function, refresh the screen to a certain color
+parameter	:
+		Color :		The color you want to clear all the screen
+******************************************************************************/
+void LCD_Clear(UWORD Color)
+{
+	UWORD i,j;  	
+	LCD_SetCursor(0,0,LCD_WIDTH-1,LCD_HEIGHT-1);
+	for(i = 0; i < LCD_WIDTH; i++){
+		for(j = 0; j < LCD_HEIGHT; j++){
+			LCD_WriteData_Word(Color);
+		}
+	 }
+}
+#endif
+
+/******************************************************************************
+function:	Refresh a certain area to the same color
+parameter	:
+		Xstart: 	Start UWORD x coordinate
+	  Ystart:		Start UWORD y coordinate
+	  Xend  :		End UWORD coordinates
+	  Yend  :		End UWORD coordinates
+	  color :		Set the color
+******************************************************************************/
+void LCD_ClearWindow(
+	UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend, UWORD color
+) {
+	UWORD i, j;
+	LCD_SetCursor(Xstart, Ystart, Xend - 1, Yend - 1);
+	for (i = Ystart; i <= Yend - 1; i++) {
+		for (j = Xstart; j <= Xend - 1; j++) {
+			LCD_WriteData_Word(color);
+		}
+	}
+}
+
+/******************************************************************************
+function: Set the color of an area
+parameter	:
+		Xstart: 	Start UWORD x coordinate
+	  Ystart:		Start UWORD y coordinate
+	  Xend  :		End UWORD coordinates
+	  Yend  :		End UWORD coordinates
+	  Color :		Set the color
+******************************************************************************/
+void LCD_SetWindowColor(
+	UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend, UWORD Color
+) {
+	LCD_SetCursor(Xstart, Ystart, Xend, Yend);
+	LCD_WriteData_Word(Color);
+}
+
+/******************************************************************************
+function: Draw a UWORD
+parameter	:
+		X			: 	Set the X coordinate
+	  Y			:		Set the Y coordinate
+	  Color :		Set the color
+******************************************************************************/
+#if 0
+void LCD_SetUWORD(UWORD x, UWORD y, UWORD Color)
+{
+	LCD_SetCursor(x,y,x,y);
+	LCD_WriteData_Word(Color);
+}
+#endif
+
+void LCD_SetUWORD(UWORD x, UWORD y, UWORD Color)
+{
+	screen[y][x][0] = (Color >> 8);
+	screen[y][x][1] = (Color & 0xFF);
+}
+
+void LCD_Clear(UWORD Color)
+{
+	UWORD i, j;
+	for (i = 0; i < LCD_WIDTH; i++) {
+		for (j = 0; j < LCD_HEIGHT; j++) {
+			LCD_SetUWORD(i, j, 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);
+}
+
+void LCD_Update(void)
+{
+	LCD_Set((uint8_t *)screen, sizeof(screen));
+}