diff --git a/epicardium/epicardium.h b/epicardium/epicardium.h
index 9bc91189382365cb525fcdd49607610f928f3151..60f008a33f8ba4271384af19a7ae0844a856ce23 100644
--- a/epicardium/epicardium.h
+++ b/epicardium/epicardium.h
@@ -53,6 +53,7 @@ typedef _Bool bool;
 #define API_DISP_CIRC              0x27
 #define API_DISP_PIXEL             0x28
 #define API_DISP_FRAMEBUFFER       0x29
+#define API_DISP_BACKLIGHT         0x2a
 
 /* API_BATTERY_VOLTAGE              0x30 */
 #define API_BATTERY_CURRENT        0x31
@@ -1333,6 +1334,17 @@ API(API_DISP_CIRC,
 API(API_DISP_FRAMEBUFFER, int epic_disp_framebuffer(union disp_framebuffer *fb));
 
 
+/**
+ * Set the backlight brightness value
+ *
+ * :param brightness: brightness from 0 - 100
+ * :return: ``0`` on success or negative value in case of an error:
+ *
+ *    - ``-EBUSY``: Display was already locked from another task.
+ */
+API(API_DISP_BACKLIGHT, int epic_disp_backlight(uint16_t brightness));
+
+
 /**
  * Start continuous readout of the light sensor. Will read light level
  * at preconfigured interval and make it available via `epic_light_sensor_get()`.
diff --git a/epicardium/modules/display.c b/epicardium/modules/display.c
index b6bf36249f61aed4b60b3fcbb62900ac72f15756..c8dc51492ba51f3867405784e30719935282147b 100644
--- a/epicardium/modules/display.c
+++ b/epicardium/modules/display.c
@@ -171,6 +171,17 @@ int epic_disp_framebuffer(union disp_framebuffer *fb)
 	return 0;
 }
 
+int epic_disp_backlight(uint16_t brightness)
+{
+	int cl = check_lock();
+	if (cl < 0) {
+		return cl;
+	}
+
+	LCD_SetBacklight(brightness);
+	return 0;
+}
+
 int epic_disp_open()
 {
 	TaskHandle_t task = xTaskGetCurrentTaskHandle();
diff --git a/lib/card10/display.c b/lib/card10/display.c
index 52bca138023930b9057e92a2081c673774a9f722..f5fd471579a41a0ea520f35594dd0553b089490d 100644
--- a/lib/card10/display.c
+++ b/lib/card10/display.c
@@ -4,77 +4,19 @@
 #include "textbuffer.h"
 
 #include "gpio.h"
-#include "tmr.h"
 #include "portexpander.h"
 #include "MAX77650-Arduino-Library.h"
 
 #include <stdint.h>
 #include <stdio.h>
+
 /***** Globals *****/
 const gpio_cfg_t DEV_DC_PIN = { PORT_1, PIN_6, GPIO_FUNC_OUT, GPIO_PAD_NONE };
 
 struct gfx_region display_screen;
 struct txt_buffer display_textb;
 
-// 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_set_reset_pin(uint8_t state)
 {
 	if (!portexpander_detected()) {
@@ -95,8 +37,7 @@ void display_init(void)
 
 	GPIO_Config(&DEV_DC_PIN);
 
-	PWM_Output();
-	LCD_SetBacklight(500);
+	LCD_SetBacklight(20);
 	LCD_Init();
 
 	display_screen = gfx_screen(LCD_framebuffer());
diff --git a/lib/gfx/GUI_DEV/DEV_Config.c b/lib/gfx/GUI_DEV/DEV_Config.c
index 099ce0a419260a7f43c4509d3ff6ecd3d496aacd..bd2475e49b9037f8521fc94ce34257a1acf5fdeb 100644
--- a/lib/gfx/GUI_DEV/DEV_Config.c
+++ b/lib/gfx/GUI_DEV/DEV_Config.c
@@ -1,60 +1,118 @@
-/*****************************************************************************
-* | File        :   DEV_Config.c
-* | Author      :   Waveshare team
-* | Function    :   Hardware underlying interface
-* | Info        :
-*                Used to shield the underlying layers of each master 
-*                and enhance portability
-*----------------
-* | This version:   V1.0
-* | Date        :   2018-11-22
-* | Info        :
-
-# Permission is hereby granted, free of charge, 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 "DEV_Config.h"
-#include "spi.h"
-
-#define SPI SPI2
-
-//const gpio_cfg_t DEV_CS_PIN = {PORT_0, PIN_8, GPIO_FUNC_OUT, GPIO_PAD_NONE};
-//const gpio_cfg_t DEV_BL_PIN = {PORT_0, PIN_8, GPIO_FUNC_OUT, GPIO_PAD_NONE};
-static spi_req_t req = {.rx_data = NULL, .bits=8, .width = SPI17Y_WIDTH_1, .ssel = 0, .deass = 1, .ssel_pol = SPI17Y_POL_LOW, .tx_num = 0, .rx_num = 0};
-#define SPI_SPEED (15 * 1000 * 1000) // Bit Rate. Display has 15 MHz limit
-
-/********************************************************************************/
-void lcd_write(uint8_t *data, int size)
-{
-    sys_cfg_spi_t spi17y_master_cfg;
-
-    spi17y_master_cfg.map = MAP_A;
-    spi17y_master_cfg.ss0 = Enable;
-    spi17y_master_cfg.ss1 = Disable;
-    spi17y_master_cfg.ss2 = Disable;
-    if (SPI_Init(SPI2, 0, SPI_SPEED, spi17y_master_cfg) != 0) {
-        printf("Error configuring SPI\n");
-        while (1)
-            ;
-    }
-    req.tx_data = data;
-    req.len = size;
-    SPI_MasterTrans(SPI, &req);
-}
-
+/*****************************************************************************
+* | File        :   DEV_Config.c
+* | Author      :   Waveshare team
+* | Function    :   Hardware underlying interface
+* | Info        :
+*                Used to shield the underlying layers of each master 
+*                and enhance portability
+*----------------
+* | This version:   V1.0
+* | Date        :   2018-11-22
+* | Info        :
+
+# Permission is hereby granted, free of charge, 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 "DEV_Config.h"
+#include "spi.h"
+
+#define SPI SPI2
+
+//const gpio_cfg_t DEV_CS_PIN = {PORT_0, PIN_8, GPIO_FUNC_OUT, GPIO_PAD_NONE};
+//const gpio_cfg_t DEV_BL_PIN = {PORT_0, PIN_8, GPIO_FUNC_OUT, GPIO_PAD_NONE};
+static spi_req_t req = { .rx_data  = NULL,
+			 .bits     = 8,
+			 .width    = SPI17Y_WIDTH_1,
+			 .ssel     = 0,
+			 .deass    = 1,
+			 .ssel_pol = SPI17Y_POL_LOW,
+			 .tx_num   = 0,
+			 .rx_num   = 0 };
+#define SPI_SPEED (15 * 1000 * 1000) // Bit Rate. Display has 15 MHz limit
+
+/********************************************************************************/
+void lcd_write(uint8_t *data, int size)
+{
+	sys_cfg_spi_t spi17y_master_cfg;
+
+	spi17y_master_cfg.map = MAP_A;
+	spi17y_master_cfg.ss0 = Enable;
+	spi17y_master_cfg.ss1 = Disable;
+	spi17y_master_cfg.ss2 = Disable;
+	if (SPI_Init(SPI2, 0, SPI_SPEED, spi17y_master_cfg) != 0) {
+		printf("Error configuring SPI\n");
+		while (1)
+			;
+	}
+	req.tx_data = data;
+	req.len     = size;
+	SPI_MasterTrans(SPI, &req);
+}
+
+// Parameters for PWM output
+#define PORT_PWM PORT_0    // port
+#define PIN_PWM PIN_28     // pin
+#define FREQ 1000          // (Hz)
+#define PWM_TIMER MXC_TMR4 // must change PORT_PWM and PIN_PWM if changed
+void DEV_Set_BL(uint16_t _Value)
+{
+	// 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
+
+	if (_Value > 100) {
+		_Value = 100;
+	}
+
+	unsigned int period_ticks = PeripheralClock / FREQ;
+	unsigned int duty_ticks   = period_ticks * _Value / 100;
+
+	TMR_Disable(PWM_TIMER);
+
+	if (duty_ticks > 0) {
+		// 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;
+		GPIO_Config(&gpio_pwm);
+
+		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;
+
+		TMR_PWMConfig(PWM_TIMER, &tmr_pwm);
+		TMR_Enable(PWM_TIMER);
+	} else {
+		gpio_pwm.func = GPIO_FUNC_OUT;
+		gpio_pwm.port = PORT_PWM;
+		gpio_pwm.mask = PIN_PWM;
+		gpio_pwm.pad  = GPIO_PAD_PULL_DOWN;
+		GPIO_Config(&gpio_pwm);
+		GPIO_OutClr(&gpio_pwm);
+	}
+}
diff --git a/lib/gfx/GUI_DEV/DEV_Config.h b/lib/gfx/GUI_DEV/DEV_Config.h
index 644870058ac120db1f3a83f6dcdb3e890c11344f..cbc4c5f655d5cb6a3d2fcfa5c46a2235bc0027ed 100644
--- a/lib/gfx/GUI_DEV/DEV_Config.h
+++ b/lib/gfx/GUI_DEV/DEV_Config.h
@@ -34,6 +34,7 @@
 
 #include "Debug.h"
 #include "spi.h"
+#include "tmr.h"
 #include "tmr_utils.h"
 #include <stdint.h>
 #include <stdio.h>
@@ -72,7 +73,7 @@ void display_set_reset_pin(uint8_t state);
 **/
 
 //#define DEV_Set_BL(_Value)     DEV_BL_PIN= _Value
-#define DEV_Set_BL(_Value)
+void DEV_Set_BL(uint16_t _Value);
 /*-----------------------------------------------------------------------------*/
 
 #endif
diff --git a/lib/gfx/LCD/LCD_Driver.c b/lib/gfx/LCD/LCD_Driver.c
index 481d6929ffdca96dc4711788621200d9faecd9b9..55c872a824ad9ef355bdb9eb4db7018c6d44eeaa 100644
--- a/lib/gfx/LCD/LCD_Driver.c
+++ b/lib/gfx/LCD/LCD_Driver.c
@@ -50,7 +50,7 @@ static void LCD_Reset(void)
 function:
 	Setting backlight
 parameter	:
-		value : Range 0~1000   Duty cycle is value/1000	
+		value : Range 0~100   Duty cycle is value/100
 *******************************************************************************/
 void LCD_SetBacklight(UWORD Value)
 {
diff --git a/pycardium/modules/py/display.py b/pycardium/modules/py/display.py
index 3a93af78cc5d359ee96cceb10cc28b10a33e0351..e957977d6fc3603889f3155e515d351dc8f1753b 100644
--- a/pycardium/modules/py/display.py
+++ b/pycardium/modules/py/display.py
@@ -91,6 +91,16 @@ class Display:
         sys_display.pixel(x, y, col)
         return self
 
+    def backlight(self, brightness):
+        """
+        Set display backlight brightness
+
+        :param brightness: backlight brightness 0 <= brightness <= 100
+        """
+
+        sys_display.backlight(brightness)
+        return self
+
     def line(self, xs, ys, xe, ye, *, col=None, dotted=False, size=1):
         """
         Draws a line on the display.
diff --git a/pycardium/modules/qstrdefs.h b/pycardium/modules/qstrdefs.h
index e418c24db58105796aa5b2cb34a1d80acd82af3b..5c9c63a17f50dcf976d2001f641feb3ce274b86d 100644
--- a/pycardium/modules/qstrdefs.h
+++ b/pycardium/modules/qstrdefs.h
@@ -85,6 +85,7 @@ Q(sys_display)
 Q(display)
 Q(print)
 Q(pixel)
+Q(backlight)
 Q(line)
 Q(rect)
 Q(circ)
diff --git a/pycardium/modules/sys_display.c b/pycardium/modules/sys_display.c
index cc550be6d1124b3e3dde68b477e726574f5feb16..f5523d54831695679965ddcb76e7df8c6fa2ba29 100644
--- a/pycardium/modules/sys_display.c
+++ b/pycardium/modules/sys_display.c
@@ -79,6 +79,21 @@ static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(
 	display_pixel_obj, 3, 3, mp_display_pixel
 );
 
+/* set display backlight brightness */
+static mp_obj_t mp_display_backlight(size_t n_args, const mp_obj_t *args)
+{
+	uint16_t brightness = mp_obj_get_int(args[0]);
+
+	int res = epic_disp_backlight(brightness);
+	if (res < 0) {
+		mp_raise_OSError(-res);
+	}
+	return mp_const_none;
+}
+static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(
+	display_backlight_obj, 1, 1, mp_display_backlight
+);
+
 /* draw line on the display */
 static mp_obj_t mp_display_line(size_t n_args, const mp_obj_t *args)
 {
@@ -220,6 +235,7 @@ static const mp_rom_map_elem_t display_module_globals_table[] = {
 	{ MP_ROM_QSTR(MP_QSTR_close), MP_ROM_PTR(&display_close_obj) },
 	{ MP_ROM_QSTR(MP_QSTR_print), MP_ROM_PTR(&display_print_obj) },
 	{ MP_ROM_QSTR(MP_QSTR_pixel), MP_ROM_PTR(&display_pixel_obj) },
+	{ MP_ROM_QSTR(MP_QSTR_backlight), MP_ROM_PTR(&display_backlight_obj) },
 	{ MP_ROM_QSTR(MP_QSTR_line), MP_ROM_PTR(&display_line_obj) },
 	{ MP_ROM_QSTR(MP_QSTR_rect), MP_ROM_PTR(&display_rect_obj) },
 	{ MP_ROM_QSTR(MP_QSTR_circ), MP_ROM_PTR(&display_circ_obj) },