diff --git a/stm/lcd.c b/stm/lcd.c
index 0567b43333e0b99493f44b87a9faa5875ed02aeb..a7d473bf6aa63f93452e26c23269e373958c9354 100644
--- a/stm/lcd.c
+++ b/stm/lcd.c
@@ -13,12 +13,35 @@
 #include "font_petme128_8x8.h"
 #include "lcd.h"
 
+#if defined(PYBOARD)
 #define PYB_LCD_PORT        (GPIOA)
 #define PYB_LCD_CS1_PIN     (GPIO_Pin_0)
 #define PYB_LCD_RST_PIN     (GPIO_Pin_1)
 #define PYB_LCD_A0_PIN      (GPIO_Pin_2)
 #define PYB_LCD_SCL_PIN     (GPIO_Pin_3)
 #define PYB_LCD_SI_PIN      (GPIO_Pin_4)
+#elif defined(PYBOARD4)
+// X position
+#define PYB_LCD_PORT       (GPIOA)
+#define PYB_LCD_CS1_PIN    (GPIO_Pin_2) // X3
+#define PYB_LCD_RST_PIN    (GPIO_Pin_3) // X4
+#define PYB_LCD_A0_PIN     (GPIO_Pin_4) // X5
+#define PYB_LCD_SCL_PIN    (GPIO_Pin_5) // X6
+#define PYB_LCD_SI_PIN     (GPIO_Pin_7) // X8
+#define PYB_LCD_BL_PORT    (GPIOC)
+#define PYB_LCD_BL_PIN     (GPIO_Pin_5) // X12
+/*
+// Y position
+#define PYB_LCD_PORT       (GPIOB)
+#define PYB_LCD_CS1_PIN    (GPIO_Pin_8) // Y3 = PB8
+#define PYB_LCD_RST_PIN    (GPIO_Pin_9) // Y4 = PB9
+#define PYB_LCD_A0_PIN     (GPIO_Pin_12) // Y5 = PB12
+#define PYB_LCD_SCL_PIN    (GPIO_Pin_13) // Y6 = PB13
+#define PYB_LCD_SI_PIN     (GPIO_Pin_15) // Y8 = PB15
+#define PYB_LCD_BL_PORT    (GPIOB)
+#define PYB_LCD_BL_PIN     (GPIO_Pin_1) // Y12 = PB1
+*/
+#endif
 
 #define LCD_INSTR (0)
 #define LCD_DATA (1)
@@ -171,7 +194,25 @@ mp_obj_t lcd_print(mp_obj_t text) {
     return mp_const_none;
 }
 
-void lcd_init(void) {
+mp_obj_t lcd_light(mp_obj_t value) {
+#if defined(PYB_LCD_BL_PORT)
+    if (rt_is_true(value)) {
+        PYB_LCD_BL_PORT->BSRRL = PYB_LCD_BL_PIN; // set pin high to turn backlight on
+    } else {
+        PYB_LCD_BL_PORT->BSRRH = PYB_LCD_BL_PIN; // set pin low to turn backlight off
+    }
+#endif
+    return mp_const_none;
+}
+
+static mp_obj_t mp_lcd = MP_OBJ_NULL;
+
+static mp_obj_t pyb_lcd_init(void) {
+    if (mp_lcd != MP_OBJ_NULL) {
+        // already init'd
+        return mp_lcd;
+    }
+
     // set the outputs high
     PYB_LCD_PORT->BSRRL = PYB_LCD_CS1_PIN;
     PYB_LCD_PORT->BSRRL = PYB_LCD_RST_PIN;
@@ -188,6 +229,17 @@ void lcd_init(void) {
     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
     GPIO_Init(PYB_LCD_PORT, &GPIO_InitStructure);
 
+#if defined(PYB_LCD_BL_PORT)
+    // backlight drive pin, starts low (off)
+    PYB_LCD_BL_PORT->BSRRH = PYB_LCD_BL_PIN;
+    GPIO_InitStructure.GPIO_Pin = PYB_LCD_BL_PIN;
+    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
+    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
+    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
+    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
+    GPIO_Init(PYB_LCD_BL_PORT, &GPIO_InitStructure);
+#endif
+
     // init the LCD
     sys_tick_delay_ms(1); // wait a bit
     PYB_LCD_PORT->BSRRH = PYB_LCD_RST_PIN; // RST=0; reset
@@ -221,16 +273,25 @@ void lcd_init(void) {
     lcd_column = 0;
     lcd_next_line = 0;
 
-    // Python interface
-    mp_obj_t m = mp_obj_new_module(QSTR_FROM_STR_STATIC("lcd"));
-    rt_store_attr(m, QSTR_FROM_STR_STATIC("lcd8"), rt_make_function_n(2, lcd_draw_pixel_8));
-    rt_store_attr(m, QSTR_FROM_STR_STATIC("clear"), rt_make_function_n(0, lcd_pix_clear));
-    rt_store_attr(m, QSTR_FROM_STR_STATIC("get"), rt_make_function_n(2, lcd_pix_get));
-    rt_store_attr(m, QSTR_FROM_STR_STATIC("set"), rt_make_function_n(2, lcd_pix_set));
-    rt_store_attr(m, QSTR_FROM_STR_STATIC("reset"), rt_make_function_n(2, lcd_pix_reset));
-    rt_store_attr(m, QSTR_FROM_STR_STATIC("show"), rt_make_function_n(0, lcd_pix_show));
-    rt_store_attr(m, QSTR_FROM_STR_STATIC("text"), rt_make_function_n(1, lcd_print));
-    rt_store_name(QSTR_FROM_STR_STATIC("lcd"), m);
+    // Micro Python interface
+    mp_obj_t o = mp_obj_new_type("LCD", mp_const_empty_tuple, mp_obj_new_dict(0));
+    rt_store_attr(o, qstr_from_str("lcd8"), rt_make_function_n(2, lcd_draw_pixel_8));
+    rt_store_attr(o, qstr_from_str("clear"), rt_make_function_n(0, lcd_pix_clear));
+    rt_store_attr(o, qstr_from_str("get"), rt_make_function_n(2, lcd_pix_get));
+    rt_store_attr(o, qstr_from_str("set"), rt_make_function_n(2, lcd_pix_set));
+    rt_store_attr(o, qstr_from_str("reset"), rt_make_function_n(2, lcd_pix_reset));
+    rt_store_attr(o, qstr_from_str("show"), rt_make_function_n(0, lcd_pix_show));
+    rt_store_attr(o, qstr_from_str("text"), rt_make_function_n(1, lcd_print));
+    rt_store_attr(o, qstr_from_str("light"), rt_make_function_n(1, lcd_light));
+    mp_lcd = o;
+    return o;
+}
+
+static MP_DEFINE_CONST_FUN_OBJ_0(pyb_lcd_init_obj, pyb_lcd_init);
+
+void lcd_init(void) {
+    mp_lcd = MP_OBJ_NULL;
+    rt_store_name(qstr_from_str("LCD"), (mp_obj_t)&pyb_lcd_init_obj);
 }
 
 void lcd_print_str(const char *str) {
diff --git a/stm/main.c b/stm/main.c
index 40831c9930729bceebf3ed9165e6997cb8e660a7..00ce564736e2f8509ab05361d2e83aa346f41be9 100644
--- a/stm/main.c
+++ b/stm/main.c
@@ -768,8 +768,8 @@ soft_reset:
     qstr_init();
     rt_init();
 
-    // LCD init
-    //lcd_init(); disabled while servos on PA0 PA1
+    // LCD init (create in with LCD())
+    lcd_init();
 
     // servo
     servo_init();
diff --git a/stm/mma.c b/stm/mma.c
index a32b0ddebe718e4301d60f0071eea920fd6cbc4f..8418c5b41909915bf9f6110221e4169b88733c8f 100644
--- a/stm/mma.c
+++ b/stm/mma.c
@@ -263,12 +263,12 @@ mp_obj_t pyb_mma_read(void) {
     int jolt_info = mma_read_nack();
 
     mp_obj_t data[4];
-    data[0] = mp_obj_new_int(jolt_info);
-    data[1] = mp_obj_new_int(mma_buf[2] + mma_buf[5] + mma_buf[8] + mma_buf[11]);
-    data[2] = mp_obj_new_int(mma_buf[1] + mma_buf[4] + mma_buf[7] + mma_buf[10]);
-    data[3] = mp_obj_new_int(mma_buf[0] + mma_buf[3] + mma_buf[6] + mma_buf[9]);
+    data[0] = mp_obj_new_int(mma_buf[0] + mma_buf[3] + mma_buf[6] + mma_buf[9]);
+    data[1] = mp_obj_new_int(mma_buf[1] + mma_buf[4] + mma_buf[7] + mma_buf[10]);
+    data[2] = mp_obj_new_int(mma_buf[2] + mma_buf[5] + mma_buf[8] + mma_buf[11]);
+    data[3] = mp_obj_new_int(jolt_info);
 
-    return rt_build_tuple(4, data); // items in reverse order in data
+    return rt_build_tuple(4, data);
 }
 
 MP_DEFINE_CONST_FUN_OBJ_0(pyb_mma_read_obj, pyb_mma_read);
@@ -279,11 +279,11 @@ mp_obj_t pyb_mma_read_all(void) {
     mma_send_byte(0);
     mma_restart(MMA_ADDR, 0);
     for (int i = 0; i <= 9; i++) {
-        data[10 - i] = mp_obj_new_int(mma_read_ack());
+        data[i] = mp_obj_new_int(mma_read_ack());
     }
-    data[0] = mp_obj_new_int(mma_read_nack());
+    data[10] = mp_obj_new_int(mma_read_nack());
 
-    return rt_build_tuple(11, data); // items in reverse order in data
+    return rt_build_tuple(11, data);
 }
 
 MP_DEFINE_CONST_FUN_OBJ_0(pyb_mma_read_all_obj, pyb_mma_read_all);
@@ -298,4 +298,3 @@ mp_obj_t pyb_mma_write_mode(mp_obj_t o_int, mp_obj_t o_mode) {
 }
 
 MP_DEFINE_CONST_FUN_OBJ_2(pyb_mma_write_mode_obj, pyb_mma_write_mode);
-