Fork of EFM32 Segment LCD library - used as pull request source for bugfixes

Fork of EFM32_SegmentLCD by Silicon Labs

Files at this revision

API Documentation at this revision

Comitter:
Steven Cooreman
Date:
Tue Mar 17 11:45:46 2015 -0500
Child:
1:5335eb33bfcb
Commit message:
Initial commit

Changed in this revision

EFM32_SegmentLCD.cpp Show annotated file Show diff for this revision Revisions of this file
EFM32_SegmentLCD.h Show annotated file Show diff for this revision Revisions of this file
segmentlcd.c Show annotated file Show diff for this revision Revisions of this file
segmentlcd.h Show annotated file Show diff for this revision Revisions of this file
segmentlcdconfig_stk_g.h Show annotated file Show diff for this revision Revisions of this file
segmentlcdconfig_stk_gg.h Show annotated file Show diff for this revision Revisions of this file
segmentlcdconfig_stk_lg.h Show annotated file Show diff for this revision Revisions of this file
segmentlcdconfig_stk_tg.h Show annotated file Show diff for this revision Revisions of this file
segmentlcdconfig_stk_wg.h Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/EFM32_SegmentLCD.cpp	Tue Mar 17 11:45:46 2015 -0500
@@ -0,0 +1,157 @@
+/***************************************************************************//**
+ * @file EFM32_SegmentLCD.cpp
+ * @brief Driver class for the segment LCD's on some of the EFM32 kits.
+ *******************************************************************************
+ * @section License
+ * <b>(C) Copyright 2015 Silicon Labs, http://www.silabs.com</b>
+ *******************************************************************************
+ *
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ *
+ * 1. The origin of this software must not be misrepresented; you must not
+ *    claim that you wrote the original software.
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ *    misrepresented as being the original software.
+ * 3. This notice may not be removed or altered from any source distribution.
+ *
+ * DISCLAIMER OF WARRANTY/LIMITATION OF REMEDIES: Silicon Labs has no
+ * obligation to support this Software. Silicon Labs is providing the
+ * Software "AS IS", with no express or implied warranties of any kind,
+ * including, but not limited to, any implied warranties of merchantability
+ * or fitness for any particular purpose or warranties against infringement
+ * of any proprietary rights of a third party.
+ *
+ * Silicon Labs will not be liable for any consequential, incidental, or
+ * special damages, or any other relief, or for any claim by any third party,
+ * arising from your use of this Software.
+ *
+ ******************************************************************************/
+
+#include <mbed.h>
+#include "pinmap.h"
+#include "EFM32_SegmentLCD.h"
+#include "segmentlcd.h"
+
+namespace silabs {
+/*
+ * Constructor.
+ */
+EFM32_SegmentLCD::EFM32_SegmentLCD() {
+	/* Set all pins used for the LCD to disabled. */
+	uint32_t num_pins = sizeof(outPins) / sizeof(outPins[0]);
+	for(uint8_t i = 0; i < num_pins; i++) {
+		pin_mode(outPins[i], Disabled);
+	}
+
+	/* Initialize the LCD without voltage booster */
+	SegmentLCD_Init(false);
+}
+
+void EFM32_SegmentLCD::AllOff( void ) {
+	SegmentLCD_AllOff();
+}
+
+void EFM32_SegmentLCD::AllOn( void ) {
+	SegmentLCD_AllOn();
+}
+
+/*
+ * Switch off (clear) the alphanumeric portion of the display
+ */
+void EFM32_SegmentLCD::AlphaNumberOff(void) {
+	SegmentLCD_AlphaNumberOff();
+}
+
+/*
+ * Switch specified segment on the ring on/off
+ * anum: ring segment index
+ * on: true to turn on, false to turn off
+ */
+void EFM32_SegmentLCD::ARing(int anum, bool on) {
+	SegmentLCD_ARing(anum, (on ? 1 : 0));
+}
+
+/*
+ * Display a battery level on the LCD.
+ * 0 = off
+ * 1 = lowest block
+ * 2 = lowest + second-to-lowest
+ * ...
+ */
+void EFM32_SegmentLCD::Battery(int batteryLevel) {
+	SegmentLCD_Battery(batteryLevel);
+}
+
+/*
+ * Display an energy mode ring on the LCD.
+ * em = energy mode number to display
+ * on = true to turn on, false to turn off.
+ */
+void EFM32_SegmentLCD::EnergyMode(int em, bool on) {
+	SegmentLCD_EnergyMode(em, (on ? 1 : 0));
+}
+
+/*
+ * Display an unsigned integer on the alphanumeric
+ * portion of the display as a hex value.
+ *
+ * num = number to display
+ */
+void EFM32_SegmentLCD::LowerHex( uint32_t num ) {
+	SegmentLCD_LowerHex(num);
+}
+
+/*
+ * Display a signed integer as decimal number on
+ * the alphanumeric part of the display.
+ */
+void EFM32_SegmentLCD::LowerNumber( int num ) {
+	SegmentLCD_LowerNumber(num);
+}
+
+/*
+ * Display a signed integer on the numeric part
+ * of the display (clock area).
+ * max = 9999, min = -9999
+ */
+void EFM32_SegmentLCD::Number(int value) {
+	SegmentLCD_Number(value);
+}
+
+/*
+ * Clear the numeric part of the display.
+ */
+void EFM32_SegmentLCD::NumberOff(void) {
+	SegmentLCD_NumberOff();
+}
+
+/*
+ * Turn a predefined symbol on or off.
+ * lcdSymbol = predefined symbol in segmentlcdconfig_*.h
+ * on = true to turn on, false to turn off.
+ */
+void EFM32_SegmentLCD::Symbol(lcdSymbol s, bool on) {
+	SegmentLCD_Symbol(s, (on ? 1 : 0));
+}
+
+/*
+ * Display an unsigned short integer as a hex value
+ * on the numeric part of the display.
+ * max = FFFF, min = 0
+ */
+void EFM32_SegmentLCD::UnsignedHex(uint16_t value) {
+	SegmentLCD_UnsignedHex(value);
+}
+
+/*
+ * Display a 7-character string on the alphanumeric
+ * portion of the display.
+ */
+void EFM32_SegmentLCD::Write(char *string) {
+	SegmentLCD_Write(string);
+}
+
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/EFM32_SegmentLCD.h	Tue Mar 17 11:45:46 2015 -0500
@@ -0,0 +1,143 @@
+/***************************************************************************//**
+ * @file EFM32_SegmentLCD.h
+ * @brief Driver class for the segment LCD's on some of the EFM32 kits.
+ *******************************************************************************
+ * @section License
+ * <b>(C) Copyright 2015 Silicon Labs, http://www.silabs.com</b>
+ *******************************************************************************
+ *
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ *
+ * 1. The origin of this software must not be misrepresented; you must not
+ *    claim that you wrote the original software.
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ *    misrepresented as being the original software.
+ * 3. This notice may not be removed or altered from any source distribution.
+ *
+ * DISCLAIMER OF WARRANTY/LIMITATION OF REMEDIES: Silicon Labs has no
+ * obligation to support this Software. Silicon Labs is providing the
+ * Software "AS IS", with no express or implied warranties of any kind,
+ * including, but not limited to, any implied warranties of merchantability
+ * or fitness for any particular purpose or warranties against infringement
+ * of any proprietary rights of a third party.
+ *
+ * Silicon Labs will not be liable for any consequential, incidental, or
+ * special damages, or any other relief, or for any claim by any third party,
+ * arising from your use of this Software.
+ *
+ ******************************************************************************/
+
+#ifndef SILABS_SEGMENTLCD_H
+#define SILABS_SEGMENTLCD_H
+
+#define TARGET_EFM32
+#define TARGET_EFM32GG_STK3700
+
+#ifndef TARGET_EFM32
+#error "The Silicon Labs SegmentLCD library is specifically designed for EFM32 targets."
+#else
+#include "platform.h"
+#include <mbed.h>
+
+#include "segmentlcd.h"
+
+namespace silabs {
+class EFM32_SegmentLCD {
+public:
+	/*
+	 * Constructor.
+	 */
+	EFM32_SegmentLCD();
+
+	/*
+	 * Switch off all elements
+	 */
+	void AllOff( void );
+
+	/*
+	 * Switch on all elements
+	 */
+	void AllOn( void );
+
+	/*
+	 * Switch off (clear) the alphanumeric portion of the display
+	 */
+	void AlphaNumberOff(void);
+
+	/*
+	 * Switch specified segment on the ring on/off
+	 * anum: ring segment index
+	 * on: true to turn on, false to turn off
+	 */
+	void ARing(int anum, bool on);
+
+	/*
+	 * Display a battery level on the LCD.
+	 * 0 = off
+	 * 1 = lowest block
+	 * 2 = lowest + second-to-lowest
+	 * ...
+	 */
+	void Battery(int batteryLevel);
+
+	/*
+	 * Display an energy mode ring on the LCD.
+	 * em = energy mode number to display
+	 * on = true to turn on, false to turn off.
+	 */
+	void EnergyMode(int em, bool on);
+
+	/*
+	 * Display an unsigned integer on the alphanumeric
+	 * portion of the display as a hex value.
+	 *
+	 * num = number to display
+	 */
+	void LowerHex( uint32_t num );
+
+	/*
+	 * Display a signed integer as decimal number on
+	 * the alphanumeric part of the display.
+	 */
+	void LowerNumber( int num );
+
+	/*
+	 * Display a signed integer on the numeric part
+	 * of the display (clock area).
+	 * max = 9999, min = -9999
+	 */
+	void Number(int value);
+
+	/*
+	 * Clear the numeric part of the display.
+	 */
+	void NumberOff(void);
+
+	/*
+	 * Turn a predefined symbol on or off.
+	 * lcdSymbol = predefined symbol in segmentlcdconfig_*.h
+	 * on = true to turn on, false to turn off.
+	 */
+	void Symbol(lcdSymbol s, bool on);
+
+	/*
+	 * Display an unsigned short integer as a hex value
+	 * on the numeric part of the display.
+	 * max = FFFF, min = 0
+	 */
+	void UnsignedHex(uint16_t value);
+
+	/*
+	 * Display a 7-character string on the alphanumeric
+	 * portion of the display.
+	 */
+	void Write(char *string);
+protected:
+
+};
+}
+
+#endif //TARGET_EFM32
+#endif //SILABS_SEGMENTLCD_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/segmentlcd.c	Tue Mar 17 11:45:46 2015 -0500
@@ -0,0 +1,827 @@
+/**************************************************************************//**
+ * @file
+ * @brief EFM32 Segment LCD Display driver
+ * @version 3.20.9
+ ******************************************************************************
+ * @section License
+ * <b>(C) Copyright 2014 Silicon Labs, http://www.silabs.com</b>
+ *******************************************************************************
+ *
+ * This file is licensensed under the Silabs License Agreement. See the file
+ * "Silabs_License_Agreement.txt" for details. Before using this software for
+ * any purpose, you must agree to the terms of that agreement.
+ *
+ ******************************************************************************/
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include "em_device.h"
+#include "em_cmu.h"
+#include "em_gpio.h"
+
+#include "device_peripherals.h"
+
+#include "segmentlcd.h"
+
+/**************************************************************************//**
+ * @brief
+ * Defines each text symbol's segment in terms of COM and BIT numbers,
+ * in a way that we can enumerate each bit for each text segment in the
+ * following bit pattern:
+ * @verbatim
+ *  -------0------
+ *
+ * |   \7  |8  /9 |
+ * |5   \  |  /   |1
+ *
+ *  --6---  ---10--
+ *
+ * |    /  |  \11 |
+ * |4  /13 |12 \  |2
+ *
+ *  -------3------
+ * @endverbatim
+ * E.g.: First text character bit pattern #3 (above) is
+ *  Segment 1D for Display
+ *  Location COM 3, BIT 0
+ *****************************************************************************/
+typedef struct
+{
+  uint8_t com[14]; /**< LCD COM line (for multiplexing) */
+  uint8_t bit[14]; /**< LCD bit number */
+} CHAR_TypeDef;
+
+
+/**************************************************************************//**
+ * @brief Defines segment COM and BIT fields numeric display
+ *****************************************************************************/
+typedef struct
+{
+  uint8_t com[7]; /**< LCD COM line (for multiplexing) */
+  uint8_t bit[7]; /**< LCD bit number */
+} NUMBER_TypeDef;
+
+/**************************************************************************//**
+ * @brief Defines segment COM and BIT fields for Energy Modes on display
+ *****************************************************************************/
+typedef struct
+{
+  uint8_t com[5]; /**< LCD COM line (for multiplexing) */
+  uint8_t bit[5]; /**< LCD bit number */
+} EM_TypeDef;
+
+/**************************************************************************//**
+ * @brief Defines segment COM and BIT fields for A-wheel (suited for Anim)
+ *****************************************************************************/
+typedef struct
+{
+  uint8_t com[8]; /**< LCD COM line (for multiplexing) */
+  uint8_t bit[8]; /**< LCD bit number */
+} ARING_TypeDef;
+
+/**************************************************************************//**
+ * @brief Defines segment COM and BIT fields for A-wheel (suited for Anim)
+ *****************************************************************************/
+typedef struct
+{
+  uint8_t com[4]; /**< LCD COM line (for multiplexing) */
+  uint8_t bit[4]; /**< LCD bit number */
+} BATTERY_TypeDef;
+
+/**************************************************************************//**
+ * @brief Defines prototype for all segments in display
+ *****************************************************************************/
+typedef struct
+{
+  CHAR_TypeDef    Text[7];      /**< Text on display */
+  NUMBER_TypeDef  Number[4];    /**< Numbers on display */
+  EM_TypeDef      EMode;        /**< Display energy mode */
+  ARING_TypeDef   ARing;        /**< Display ring */
+  BATTERY_TypeDef Battery;      /**< Display battery */
+} MCU_DISPLAY;
+
+/**************************************************************************//**
+ * @brief Working instance of LCD display
+ *****************************************************************************/
+static const MCU_DISPLAY EFM_Display = EFM_DISPLAY_DEF;
+
+
+/**************************************************************************//**
+ * @brief
+ * Defines higlighted segments for the alphabet, starting from "blank" (SPACE)
+ * Uses bit pattern as defined for text segments above.
+ * E.g. a capital O, would have bits 0 1 2 3 4 5 => 0x003f defined
+ *****************************************************************************/
+static const uint16_t EFM_Alphabet[] = {
+  0x0000, /* space */
+  0x1100, /* ! */
+  0x0280, /* " */
+  0x0000, /* # */
+  0x0000, /* $ */
+  0x0602, /* % */
+  0x0000, /* & */
+  0x0020, /* ' */
+  0x0039, /* ( */
+  0x000f, /* ) */
+  0x0000, /* * */
+  0x1540, /* + */
+  0x2000, /* , */
+  0x0440, /* - */
+  0x1000, /* . */
+  0x2200, /* / */
+
+  0x003f, /* 0 */
+  0x0006, /* 1 */
+  0x045b, /* 2 */
+  0x044f, /* 3 */
+  0x0466, /* 4 */
+  0x046d, /* 5 */
+  0x047d, /* 6 */
+  0x0007, /* 7 */
+  0x047f, /* 8 */
+  0x046f, /* 9 */
+
+  0x0000, /* : */
+  0x0000, /* ; */
+  0x0a00, /* < */
+  0x0000, /* = */
+  0x2080, /* > */
+  0x0000, /* ? */
+  0xffff, /* @ */
+
+  0x0477, /* A */
+  0x0a79, /* B */
+  0x0039, /* C */
+  0x20b0, /* D */
+  0x0079, /* E */
+  0x0071, /* F */
+  0x047d, /* G */
+  0x0476, /* H */
+  0x0006, /* I */
+  0x000e, /* J */
+  0x0a70, /* K */
+  0x0038, /* L */
+  0x02b6, /* M */
+  0x08b6, /* N */
+  0x003f, /* O */
+  0x0473, /* P */
+  0x083f, /* Q */
+  0x0c73, /* R */
+  0x046d, /* S */
+  0x1101, /* T */
+  0x003e, /* U */
+  0x2230, /* V */
+  0x2836, /* W */
+  0x2a80, /* X */
+  0x046e, /* Y */
+  0x2209, /* Z */
+
+  0x0039, /* [ */
+  0x0880, /* backslash */
+  0x000f, /* ] */
+  0x0001, /* ^ */
+  0x0008, /* _ */
+  0x0100, /* ` */
+
+  0x1058, /* a */
+  0x047c, /* b */
+  0x0058, /* c */
+  0x045e, /* d */
+  0x2058, /* e */
+  0x0471, /* f */
+  0x0c0c, /* g */
+  0x0474, /* h */
+  0x0004, /* i */
+  0x000e, /* j */
+  0x0c70, /* k */
+  0x0038, /* l */
+  0x1454, /* m */
+  0x0454, /* n */
+  0x045c, /* o */
+  0x0473, /* p */
+  0x0467, /* q */
+  0x0450, /* r */
+  0x0c08, /* s */
+  0x0078, /* t */
+  0x001c, /* u */
+  0x2010, /* v */
+  0x2814, /* w */
+  0x2a80, /* x */
+  0x080c, /* y */
+  0x2048, /* z */
+
+  0x0000,
+};
+
+/**************************************************************************//**
+ * @brief
+ * Defines higlighted segments for the numeric display
+ *****************************************************************************/
+
+static const uint16_t EFM_Numbers[] = {
+  0x003f, /* 0 */
+  0x0006, /* 1 */
+  0x005b, /* 2 */
+  0x004f, /* 3 */
+  0x0066, /* 4 */
+  0x006d, /* 5 */
+  0x007d, /* 6 */
+  0x0007, /* 7 */
+  0x007f, /* 8 */
+  0x006f, /* 9 */
+  0x0077, /* A */
+  0x007c, /* b */
+  0x0039, /* C */
+  0x005e, /* d */
+  0x0079, /* E */
+  0x0071, /* F */
+  0x0040  /* - */
+};
+
+/** @cond DO_NOT_INCLUDE_WITH_DOXYGEN */
+/* sign is last element of the table  */
+static const uint16_t signIndex = sizeof(EFM_Numbers)/sizeof(uint16_t) - 1 ;
+
+static const LCD_Init_TypeDef lcdInit = LCD_INIT_DEF;
+/** @endcond */
+
+
+/**************************************************************************//**
+ * @brief Disable all segments
+ *****************************************************************************/
+void SegmentLCD_AllOff(void)
+{
+  /* Turn on low segments */
+  LCD_ALL_SEGMENTS_OFF();
+}
+
+
+/**************************************************************************//**
+ * @brief Enable all segments
+ *****************************************************************************/
+void SegmentLCD_AllOn(void)
+{
+  LCD_ALL_SEGMENTS_ON();
+}
+
+
+/**************************************************************************//**
+ * @brief Turn all segments on alpha characters in display off
+ *****************************************************************************/
+void SegmentLCD_AlphaNumberOff(void)
+{
+  LCD_ALPHA_NUMBER_OFF();
+  return;
+}
+
+
+/**************************************************************************//**
+ * @brief Light up or shut off Ring of Indicators
+ * @param anum "Segment number" on "Ring", range 0 - 7
+ * @param on Zero is off, non-zero is on
+ *****************************************************************************/
+void SegmentLCD_ARing(int anum, int on)
+{
+  uint32_t com, bit;
+
+  com = EFM_Display.ARing.com[anum];
+  bit = EFM_Display.ARing.bit[anum];
+
+  if (on)
+  {
+    LCD_SegmentSet(com, bit, true);
+  }
+  else
+  {
+    LCD_SegmentSet(com, bit, false);
+  }
+}
+
+
+/**************************************************************************//**
+ * @brief Light up or shut off Battery Indicator
+ * @param batteryLevel Battery Level, 0 to 4 (0 turns all off)
+ *****************************************************************************/
+void SegmentLCD_Battery(int batteryLevel)
+{
+  uint32_t com, bit;
+  int      i, on;
+
+  for (i = 0; i < 4; i++)
+  {
+    if (i < batteryLevel)
+    {
+      on = 1;
+    }
+    else
+    {
+      on = 0;
+    }
+    com = EFM_Display.Battery.com[i];
+    bit = EFM_Display.Battery.bit[i];
+
+    if (on)
+    {
+      LCD_SegmentSet(com, bit, true);
+    }
+    else
+    {
+      LCD_SegmentSet(com, bit, false);
+    }
+  }
+}
+
+
+/**************************************************************************//**
+ * @brief Disables LCD controller
+ *****************************************************************************/
+void SegmentLCD_Disable(void)
+{
+  /* Disable LCD */
+  LCD_Enable(false);
+
+  /* Make sure CTRL register has been updated */
+  LCD_SyncBusyDelay(LCD_SYNCBUSY_CTRL);
+
+  /* Turn off LCD clock */
+  CMU_ClockEnable(cmuClock_LCD, false);
+
+  /* Turn off voltage boost if enabled */
+  CMU->LCDCTRL = 0;
+}
+
+
+/**************************************************************************//**
+ * @brief Light up or shut off Energy Mode indicator
+ * @param em Energy Mode numer 0 to 4
+ * @param on Zero is off, non-zero is on
+ *****************************************************************************/
+void SegmentLCD_EnergyMode(int em, int on)
+{
+  uint32_t com, bit;
+
+  com = EFM_Display.EMode.com[em];
+  bit = EFM_Display.EMode.bit[em];
+
+  if (on)
+  {
+    LCD_SegmentSet(com, bit, true);
+  }
+  else
+  {
+    LCD_SegmentSet(com, bit, false);
+  }
+}
+
+/**************************************************************************//**
+ * @brief Get frame rate division value corresponding to mux selection
+ * @param mux enum
+ *****************************************************************************/
+uint8_t SegmentLCD_GetFrameRateDiv(LCD_Mux_TypeDef muxSetting) {
+	switch(muxSetting) {
+	  /** Static (segments can be multiplexed with LCD_COM[0]) */
+	case lcdMuxStatic: return 2;
+	  /** Duplex / 1/2 Duty cycle (segments can be multiplexed with LCD_COM[0:1]) */
+	case lcdMuxDuplex: return 4;
+	  /** Triplex / 1/3 Duty cycle (segments can be multiplexed with LCD_COM[0:2]) */
+	case lcdMuxTriplex: return 6;
+	  /** Quadruplex / 1/4 Duty cycle (segments can be multiplexed with LCD_COM[0:3]) */
+	case lcdMuxQuadruplex: return 8;
+	#if defined(_EFM32_TINY_FAMILY) || defined(_EFM32_GIANT_FAMILY) || defined(_EFM32_WONDER_FAMILY)
+	  /** Sextaplex / 1/6 Duty cycle (segments can be multiplexed with LCD_COM[0:5]) */
+	case lcdMuxSextaplex: return 12;
+	  /** Octaplex / 1/6 Duty cycle (segments can be multiplexed with LCD_COM[0:5]) */
+	case lcdMuxOctaplex: return 16;
+	#endif
+	default: return 1;
+	}
+}
+
+/**************************************************************************//**
+ * @brief Segment LCD Initialization routine for EFM32 STK display
+ * @param useBoost Set to use voltage boost
+ *****************************************************************************/
+void SegmentLCD_Init(bool useBoost)
+{
+
+  /* Ensure LE modules are accessible */
+  CMU_ClockEnable(cmuClock_CORELE, true);
+
+  /* Enable LFRCO as LFACLK in CMU (will also enable oscillator if not enabled) */
+  CMU_ClockSelectSet(cmuClock_LFA, cmuSelect_LFRCO);
+
+  /* LCD Controller Prescaler  */
+
+  /* Calculate value. Approach 50Hz for framerate. */
+  uint32_t prescaler = (LOW_ENERGY_CLOCK_FREQUENCY / 32) / SegmentLCD_GetFrameRateDiv(lcdInit.mux);
+
+  CMU_ClockDivSet(cmuClock_LCDpre, prescaler);
+
+  /* Frame Rate */
+  CMU_LCDClkFDIVSet(0);
+
+  /* Enable clock to LCD module */
+  CMU_ClockEnable(cmuClock_LCD, true);
+
+  LCD_DISPLAY_ENABLE();
+
+  /* Disable interrupts */
+  LCD_IntDisable(0xFFFFFFFF);
+
+  /* Initialize and enable LCD controller */
+  LCD_Init(&lcdInit);
+
+  /* Enable all display segments */
+  LCD_SEGMENTS_ENABLE();
+
+  /* Enable boost if necessary */
+  if (useBoost)
+  {
+    LCD_VBoostSet(LCD_BOOST_LEVEL);
+    LCD_VLCDSelect(lcdVLCDSelVExtBoost);
+    CMU->LCDCTRL |= CMU_LCDCTRL_VBOOSTEN;
+  }
+
+  /* Turn all segments off */
+  SegmentLCD_AllOff();
+
+  LCD_SyncBusyDelay(0xFFFFFFFF);
+}
+
+
+/**************************************************************************//**
+ * @brief Write a hexadecimal number on lower alphanumeric part of
+ *        Segment LCD display
+ * @param num Hexadecimal number value to put on display, in range 0
+ *        to 0x0FFFFFFF
+ *****************************************************************************/
+void SegmentLCD_LowerHex( uint32_t num )
+{
+  int       i;
+  char      str[7];
+  uint32_t  nibble;
+
+  SegmentLCD_Symbol(LCD_SYMBOL_MINUS, 0);
+
+  for ( i=6; i>=0; i-- )
+  {
+    nibble = num & 0xF;
+
+    if ( nibble < 10 )
+      str[i] = nibble + '0';
+    else if ( nibble == 11 )
+      str[i] = 'b';
+    else if ( nibble == 13 )
+      str[i] = 'd';
+    else
+      str[i] = (nibble - 10) + 'A';
+
+    num >>= 4;
+  }
+
+  SegmentLCD_Write(str);
+}
+
+/**************************************************************************//**
+ * @brief Write number on lower alphanumeric part of Segment LCD display
+ * @param num Numeric value to put on display, in range -9999999 to +9999999
+ *****************************************************************************/
+void SegmentLCD_LowerNumber( int num )
+{
+  int i;
+  char str[7];
+
+  SegmentLCD_Symbol(LCD_SYMBOL_MINUS, 0);
+
+  if ( ( num > 9999999 ) || ( num < -9999999 ) )
+  {
+    SegmentLCD_Write("Ovrflow");
+    return;
+  }
+
+  if ( num < 0 )
+  {
+    SegmentLCD_Symbol(LCD_SYMBOL_MINUS, 1);
+    num = -num;
+  }
+
+  for ( i=6; i>=0; i-- )
+  {
+    if ( ( i < 6 ) && ( num == 0 ) )
+    {
+      str[i] = ' ';
+    }
+    else
+    {
+      str[i] = (num % 10) + '0';
+      num /= 10;
+    }
+  }
+
+  SegmentLCD_Write(str);
+}
+
+
+/**************************************************************************//**
+ * @brief Write number on numeric part on Segment LCD display
+ * @param value Numeric value to put on display, in range -999 to +9999
+ *****************************************************************************/
+void SegmentLCD_Number(int value)
+{
+  int      i, com, bit, digit, div, neg;
+  uint16_t bitpattern;
+  uint16_t num;
+
+  /* Parameter consistancy check */
+  if (value >= 9999)
+  {
+    value = 9999;
+  }
+  if (value <= -1000)
+  {
+    value = -999;
+  }
+  if (value < 0)
+  {
+    value = abs(value);
+    neg   = 1;
+  }
+  else
+  {
+    neg = 0;
+  }
+
+  /* If an update is in progress we must block, or there might be tearing */
+  LCD_SyncBusyDelay(0xFFFFFFFF);
+
+  /* Freeze updates to avoid partial refresh of display */
+  LCD_FreezeEnable(true);
+
+  /* Turn off all number LCD segments */
+  SegmentLCD_NumberOff();
+
+  /* Extract useful digits */
+  div = 1;
+  for (digit = 0; digit < 4; digit++)
+  {
+    num = (value / div) % 10;
+    if ((neg == 1) && (digit == 3)) num = signIndex;
+    /* Get number layout of display */
+    bitpattern = EFM_Numbers[num];
+    for (i = 0; i < 7; i++)
+    {
+      bit = EFM_Display.Number[digit].bit[i];
+      com = EFM_Display.Number[digit].com[i];
+      if (bitpattern & (1 << i))
+      {
+        LCD_SegmentSet(com, bit, true);
+      }
+    }
+    div = div * 10;
+  }
+  /* Sync LCD registers to LE domain */
+  LCD_FreezeEnable(false);
+}
+
+
+/**************************************************************************//**
+ * @brief Turn all segments on numeric digits in display off
+ *****************************************************************************/
+void SegmentLCD_NumberOff(void)
+{
+  /* Turn off all number segments */
+  LCD_NUMBER_OFF();
+  return;
+}
+
+
+/**************************************************************************//**
+ * @brief Light up or shut off various symbols on Segment LCD
+ * @param s Which symbol to turn on or off
+ * @param on Zero is off, non-zero is on
+ *****************************************************************************/
+void SegmentLCD_Symbol(lcdSymbol s, int on)
+{
+  int com = 0;
+  int bit = 0;
+
+  switch (s)
+  {
+  case LCD_SYMBOL_GECKO:
+    com = LCD_SYMBOL_GECKO_COM;
+    bit = LCD_SYMBOL_GECKO_SEG;
+    break;
+  case LCD_SYMBOL_ANT:
+    com = LCD_SYMBOL_ANT_COM;
+    bit = LCD_SYMBOL_ANT_SEG;
+    break;
+  case LCD_SYMBOL_PAD0:
+    com = LCD_SYMBOL_PAD0_COM;
+    bit = LCD_SYMBOL_PAD0_SEG;
+    break;
+  case LCD_SYMBOL_PAD1:
+    com = LCD_SYMBOL_PAD1_COM;
+    bit = LCD_SYMBOL_PAD1_SEG;
+    break;
+  case LCD_SYMBOL_EFM32:
+    com = LCD_SYMBOL_EFM32_COM;
+    bit = LCD_SYMBOL_EFM32_SEG;
+    break;
+  case LCD_SYMBOL_MINUS:
+    com = LCD_SYMBOL_MINUS_COM;
+    bit = LCD_SYMBOL_MINUS_SEG;
+    break;
+  case LCD_SYMBOL_COL3:
+    com = LCD_SYMBOL_COL3_COM;
+    bit = LCD_SYMBOL_COL3_SEG;
+    break;
+  case LCD_SYMBOL_COL5:
+    com = LCD_SYMBOL_COL5_COM;
+    bit = LCD_SYMBOL_COL5_SEG;
+    break;
+  case LCD_SYMBOL_COL10:
+    com = LCD_SYMBOL_COL10_COM;
+    bit = LCD_SYMBOL_COL10_SEG;
+    break;
+#ifdef LCD_SYMBOL_DEGC_SEG
+  case LCD_SYMBOL_DEGC:
+    com = LCD_SYMBOL_DEGC_COM;
+    bit = LCD_SYMBOL_DEGC_SEG;
+    break;
+#endif
+#ifdef LCD_SYMBOL_DEGF_SEG
+  case LCD_SYMBOL_DEGF:
+    com = LCD_SYMBOL_DEGF_COM;
+    bit = LCD_SYMBOL_DEGF_SEG;
+    break;
+#endif
+#ifdef LCD_SYMBOL_DP2_SEG
+  case LCD_SYMBOL_DP2:
+    com = LCD_SYMBOL_DP2_COM;
+    bit = LCD_SYMBOL_DP2_SEG;
+    break;
+#endif
+#ifdef LCD_SYMBOL_DP3_SEG
+  case LCD_SYMBOL_DP3:
+    com = LCD_SYMBOL_DP3_COM;
+    bit = LCD_SYMBOL_DP3_SEG;
+    break;
+#endif
+#ifdef LCD_SYMBOL_DP4_SEG
+  case LCD_SYMBOL_DP4:
+    com = LCD_SYMBOL_DP4_COM;
+    bit = LCD_SYMBOL_DP4_SEG;
+    break;
+#endif
+#ifdef LCD_SYMBOL_DP5_SEG
+  case LCD_SYMBOL_DP5:
+    com = LCD_SYMBOL_DP5_COM;
+    bit = LCD_SYMBOL_DP5_SEG;
+    break;
+#endif
+  case LCD_SYMBOL_DP6:
+    com = LCD_SYMBOL_DP6_COM;
+    bit = LCD_SYMBOL_DP6_SEG;
+    break;
+  case LCD_SYMBOL_DP10:
+    com = LCD_SYMBOL_DP10_COM;
+    bit = LCD_SYMBOL_DP10_SEG;
+    break;
+#ifdef LCD_SYMBOL_AM_SEG
+  case LCD_SYMBOL_AM:
+    com = LCD_SYMBOL_AM_COM;
+    bit = LCD_SYMBOL_AM_SEG;
+    break;
+#endif
+#ifdef LCD_SYMBOL_PM_SEG
+  case LCD_SYMBOL_PM:
+    com = LCD_SYMBOL_PM_COM;
+    bit = LCD_SYMBOL_PM_SEG;
+    break;
+#endif
+#ifdef LCD_SYMBOL_MICROAMP_SEG
+  case LCD_SYMBOL_MICROAMP:
+    com = LCD_SYMBOL_MICROAMP_COM;
+    bit = LCD_SYMBOL_MICROAMP_SEG;
+    break;
+#endif
+#ifdef LCD_SYMBOL_MILLIAMP_SEG
+  case LCD_SYMBOL_MILLIAMP:
+    com = LCD_SYMBOL_MILLIAMP_COM;
+    bit = LCD_SYMBOL_MILLIAMP_SEG;
+    break;
+#endif
+
+  }
+  if (on)
+  {
+    LCD_SegmentSet(com, bit, true);
+  }
+  else
+  {
+    LCD_SegmentSet(com, bit, false);
+  }
+}
+
+
+/**************************************************************************//**
+ * @brief Write hexadecimal number on numeric part on Segment LCD display
+ * @param value Numeric value to put on display, in range 0x0000-0xFFFF
+ *****************************************************************************/
+void SegmentLCD_UnsignedHex(uint16_t value)
+{
+  int      num, i, com, bit, digit;
+  uint16_t bitpattern;
+
+  /* Parameter consistancy check */
+  if (value >= 0xffff)
+  {
+    value = 0xffff;
+  }
+
+  /* If an update is in progress we must block, or there might be tearing */
+  LCD_SyncBusyDelay(0xFFFFFFFF);
+
+  /* Freeze updates to avoid partial refresh of display */
+  LCD_FreezeEnable(true);
+
+  /* Turn off all number LCD segments */
+  SegmentLCD_NumberOff();
+
+  for (digit = 0; digit < 4; digit++)
+  {
+    num        = (value >> (4 * digit)) & 0x0f;
+    bitpattern = EFM_Numbers[num];
+    for (i = 0; i < 7; i++)
+    {
+      bit = EFM_Display.Number[digit].bit[i];
+      com = EFM_Display.Number[digit].com[i];
+      if (bitpattern & (1 << i))
+      {
+        LCD_SegmentSet(com, bit, true);
+      }
+    }
+  }
+
+  /* Sync LCD registers to LE domain */
+  LCD_FreezeEnable(false);
+}
+
+
+/**************************************************************************//**
+ * @brief Write text on LCD display
+ * @param string Text string to show on display
+ *****************************************************************************/
+void SegmentLCD_Write(char *string)
+{
+  int      data, length, index;
+  uint16_t bitfield;
+  uint32_t com, bit;
+  int      i;
+
+  length = strlen(string);
+  index  = 0;
+
+  /* If an update is in progress we must block, or there might be tearing */
+  LCD_SyncBusyDelay(0xFFFFFFFF);
+
+  /* Freeze LCD to avoid partial updates */
+  LCD_FreezeEnable(true);
+
+  /* Turn all segments off */
+  SegmentLCD_AlphaNumberOff();
+
+  /* Fill out all characters on display */
+  for (index = 0; index < 7; index++)
+  {
+    if (index < length)
+    {
+      data = (int) *string;
+    }
+    else           /* Padding with space */
+    {
+      data = 0x20; /* SPACE */
+    }
+    /* Defined letters currently starts at "SPACE" - ASCII 0x20; */
+    data = data - 0x20;
+    /* Get font for this letter */
+    bitfield = EFM_Alphabet[data];
+
+    for (i = 0; i < 14; i++)
+    {
+      bit = EFM_Display.Text[index].bit[i];
+      com = EFM_Display.Text[index].com[i];
+
+      if (bitfield & (1 << i))
+      {
+        /* Turn on segment */
+        LCD_SegmentSet(com, bit, true);
+      }
+    }
+    string++;
+  }
+  /* Enable update */
+  LCD_FreezeEnable(false);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/segmentlcd.h	Tue Mar 17 11:45:46 2015 -0500
@@ -0,0 +1,79 @@
+/**************************************************************************//**
+ * @file
+ * @brief EFM32 Segment LCD Display driver, header file
+ * @version 3.20.9
+ ******************************************************************************
+ * @section License
+ * <b>(C) Copyright 2014 Silicon Labs, http://www.silabs.com</b>
+ *******************************************************************************
+ *
+ * This file is licensensed under the Silabs License Agreement. See the file
+ * "Silabs_License_Agreement.txt" for details. Before using this software for
+ * any purpose, you must agree to the terms of that agreement.
+ *
+ ******************************************************************************/
+
+
+#ifndef __SEGMENTLCD_H
+#define __SEGMENTLCD_H
+
+#include <stdint.h>
+#include <stdbool.h>
+
+#if defined( TARGET_EFM32GG_STK3700 )
+#include "segmentlcdconfig_stk_gg.h"
+#elif defined( TARGET_EFM32_G8XX_STK )
+#include "segmentlcdconfig_stk_g.h"
+#elif defined( TARGET_EFM32LG_STK3600 )
+#include "segmentlcdconfig_stk_lg.h"
+#elif defined( TARGET_EFM32TG_STK3300 )
+#include "segmentlcdconfig_stk_tg.h"
+#elif defined( TARGET_EFM32WG_STK3800 )
+#include "segmentlcdconfig_stk_wg.h"
+#elif defined( TARGET_EFM32ZG_STK3200 )
+#error "No segment LCD available on the Zero Gecko STK."
+#elif defined( TARGET_EFM32HG_STK3400 )
+#error "No segment LCD available on the Happy Gecko STK."
+#else
+#error "No EFM32 target STK defined."
+#endif
+
+/***************************************************************************//**
+ * @addtogroup Drivers
+ * @{
+ ******************************************************************************/
+
+/***************************************************************************//**
+ * @addtogroup SegmentLcd
+ * @{
+ ******************************************************************************/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Regular functions */
+void SegmentLCD_AllOff(void);
+void SegmentLCD_AllOn(void);
+void SegmentLCD_AlphaNumberOff(void);
+void SegmentLCD_ARing(int anum, int on);
+void SegmentLCD_Battery(int batteryLevel);
+void SegmentLCD_Disable(void);
+void SegmentLCD_EnergyMode(int em, int on);
+void SegmentLCD_Init(bool useBoost);
+void SegmentLCD_LowerHex( uint32_t num );
+void SegmentLCD_LowerNumber( int num );
+void SegmentLCD_Number(int value);
+void SegmentLCD_NumberOff(void);
+void SegmentLCD_Symbol(lcdSymbol s, int on);
+void SegmentLCD_UnsignedHex(uint16_t value);
+void SegmentLCD_Write(char *string);
+
+#ifdef __cplusplus
+}
+#endif
+
+/** @} (end group SegmentLcd) */
+/** @} (end group Drivers) */
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/segmentlcdconfig_stk_g.h	Tue Mar 17 11:45:46 2015 -0500
@@ -0,0 +1,333 @@
+/**************************************************************************//**
+ * @file
+ * @brief Segment LCD Config for the EFM32_G8xx_STK
+ * @version 3.20.5
+ ******************************************************************************
+ * @section License
+ * <b>(C) Copyright 2014 Silicon Labs, http://www.silabs.com</b>
+ *******************************************************************************
+ *
+ * This file is licensensed under the Silabs License Agreement. See the file
+ * "Silabs_License_Agreement.txt" for details. Before using this software for
+ * any purpose, you must agree to the terms of that agreement.
+ *
+ ******************************************************************************/
+
+#ifndef __SEGMENTLCDCONFIG_H
+#define __SEGMENTLCDCONFIG_H
+
+#include "em_lcd.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** Range of symbols available on display */
+typedef enum
+{
+  LCD_SYMBOL_GECKO,
+  LCD_SYMBOL_ANT,
+  LCD_SYMBOL_PAD0,
+  LCD_SYMBOL_PAD1,
+  LCD_SYMBOL_AM,
+  LCD_SYMBOL_PM,
+  LCD_SYMBOL_EFM32,
+  LCD_SYMBOL_MINUS,
+  LCD_SYMBOL_COL3,
+  LCD_SYMBOL_COL5,
+  LCD_SYMBOL_COL10,
+  LCD_SYMBOL_DEGC,
+  LCD_SYMBOL_DEGF,
+  LCD_SYMBOL_MICROAMP,
+  LCD_SYMBOL_MILLIAMP,
+  LCD_SYMBOL_DP6,
+  LCD_SYMBOL_DP10,
+} lcdSymbol;
+
+
+#define LCD_SYMBOL_GECKO_COM  3
+#define LCD_SYMBOL_GECKO_SEG  8
+#define LCD_SYMBOL_ANT_COM  3
+#define LCD_SYMBOL_ANT_SEG  1
+#define LCD_SYMBOL_PAD0_COM  1
+#define LCD_SYMBOL_PAD0_SEG  8
+#define LCD_SYMBOL_PAD1_COM  2
+#define LCD_SYMBOL_PAD1_SEG  8
+#define LCD_SYMBOL_AM_COM  0
+#define LCD_SYMBOL_AM_SEG  32
+#define LCD_SYMBOL_PM_COM  0
+#define LCD_SYMBOL_PM_SEG  35
+#define LCD_SYMBOL_EFM32_COM  0
+#define LCD_SYMBOL_EFM32_SEG  8
+#define LCD_SYMBOL_MINUS_COM  0
+#define LCD_SYMBOL_MINUS_SEG  9
+#define LCD_SYMBOL_COL3_COM  0
+#define LCD_SYMBOL_COL3_SEG  16
+#define LCD_SYMBOL_COL5_COM  0
+#define LCD_SYMBOL_COL5_SEG  24
+#define LCD_SYMBOL_COL10_COM  0
+#define LCD_SYMBOL_COL10_SEG  39
+#define LCD_SYMBOL_DEGC_COM  0
+#define LCD_SYMBOL_DEGC_SEG  34
+#define LCD_SYMBOL_DEGF_COM  1
+#define LCD_SYMBOL_DEGF_SEG  34
+#define LCD_SYMBOL_MICROAMP_COM  2
+#define LCD_SYMBOL_MICROAMP_SEG  34
+#define LCD_SYMBOL_MILLIAMP_COM  3
+#define LCD_SYMBOL_MILLIAMP_SEG  34
+#define LCD_SYMBOL_DP6_COM  0
+#define LCD_SYMBOL_DP6_SEG  21
+#define LCD_SYMBOL_DP10_COM  0
+#define LCD_SYMBOL_DP10_SEG  37
+
+/* LCD Controller Prescaler (divide by 128) */
+/* CLKlcd = 256 Hz */
+#define LCD_CMU_CLK_PRE         cmuClkDiv_128
+#define LCD_CMU_CLK_DIV         0
+
+#define LCD_BOOST_LEVEL         lcdVBoostLevel0
+
+#define LCD_INIT_DEF \
+{ true,\
+  lcdMuxQuadruplex,\
+  lcdBiasOneThird,\
+  lcdWaveLowPower,\
+  lcdVLCDSelVDD,\
+  lcdConConfVLCD }
+
+#define LCD_NUMBER_OFF() \
+do { \
+  LCD_SegmentSetLow(0, 0x80000000, 0x00000000);\
+  LCD_SegmentSetLow(1, 0x80000000, 0x00000000);\
+  LCD_SegmentSetLow(2, 0x80000000, 0x00000000);\
+  LCD_SegmentSetLow(3, 0x80000000, 0x00000000);\
+  LCD_SegmentSetHigh(0, 0x52, 0x00000000);\
+  LCD_SegmentSetHigh(1, 0xFB, 0x00000000);\
+  LCD_SegmentSetHigh(2, 0xFB, 0x00000000);\
+  LCD_SegmentSetHigh(3, 0xFB, 0x00000000);\
+} while (0)
+
+#define LCD_ALPHA_NUMBER_OFF() \
+do { \
+  LCD_SegmentSetLow(0, 0x7ECCCC00, 0x00000000);\
+  LCD_SegmentSetLow(1, 0x7FFFFEFC, 0x00000000);\
+  LCD_SegmentSetLow(2, 0x7FFFFEFC, 0x00000000);\
+  LCD_SegmentSetLow(3, 0x7FFFFEFC, 0x00000000);\
+} while(0)
+
+#define LCD_ALL_SEGMENTS_OFF() \
+do { \
+  LCD_SegmentSetLow(0, 0xFFFFFFFF, 0x00000000);\
+  LCD_SegmentSetLow(1, 0xFFFFFFFF, 0x00000000);\
+  LCD_SegmentSetLow(2, 0xFFFFFFFF, 0x00000000);\
+  LCD_SegmentSetLow(3, 0xFFFFFFFF, 0x00000000);\
+  LCD_SegmentSetHigh(0, 0xFF, 0x00000000);\
+  LCD_SegmentSetHigh(1, 0xFF, 0x00000000);\
+  LCD_SegmentSetHigh(2, 0xFF, 0x00000000);\
+  LCD_SegmentSetHigh(3, 0xFF, 0x00000000);\
+} while(0)
+
+#define LCD_ALL_SEGMENTS_ON() \
+do { \
+  LCD_SegmentSetLow(0, 0xFFFFFFFF, 0xFFFFFFFF);\
+  LCD_SegmentSetLow(1, 0xFFFFFFFF, 0xFFFFFFFF);\
+  LCD_SegmentSetLow(2, 0xFFFFFFFF, 0xFFFFFFFF);\
+  LCD_SegmentSetLow(3, 0xFFFFFFFF, 0xFFFFFFFF);\
+  LCD_SegmentSetHigh(0, 0xFF, 0xFFFFFFFF);\
+  LCD_SegmentSetHigh(1, 0xFF, 0xFFFFFFFF);\
+  LCD_SegmentSetHigh(2, 0xFF, 0xFFFFFFFF);\
+  LCD_SegmentSetHigh(3, 0xFF, 0xFFFFFFFF);\
+} while(0)
+
+#define LCD_SEGMENTS_ENABLE() \
+do { \
+  LCD_SegmentRangeEnable(lcdSegmentAll, true);\
+} while(0)
+
+#define LCD_DISPLAY_ENABLE() \
+do { \
+  ;\
+} while(0)
+
+#define EFM_DISPLAY_DEF {\
+  .Text        = {\
+    { /* 1 */\
+      .com[0] = 3, .com[1] = 3, .com[2] = 1, .com[3] = 0,\
+      .bit[0] = 10, .bit[1] = 12, .bit[2] = 12, .bit[3] = 10,\
+      .com[4] = 1, .com[5] = 3, .com[6] = 2, .com[7] = 2,\
+      .bit[4] = 9, .bit[5] = 9, .bit[6] = 9, .bit[7] = 10,\
+      .com[8] = 2, .com[9] = 3, .com[10] = 2, .com[11] = 0,\
+      .bit[8] = 11, .bit[9] = 11, .bit[10] = 12, .bit[11] = 11,\
+      .com[12] = 1, .com[13] = 1,\
+      .bit[12] = 11, .bit[13] = 10\
+    },\
+    { /* 2 */\
+      .com[0] = 3, .com[1] = 3, .com[2] = 1, .com[3] = 0,\
+      .bit[0] = 14, .bit[1] = 16, .bit[2] = 16, .bit[3] = 14,\
+      .com[4] = 1, .com[5] = 3, .com[6] = 2, .com[7] = 2,\
+      .bit[4] = 13, .bit[5] = 13, .bit[6] = 13, .bit[7] = 14,\
+      .com[8] = 2, .com[9] = 3, .com[10] = 2, .com[11] = 0,\
+      .bit[8] = 15, .bit[9] = 15, .bit[10] = 16, .bit[11] = 15,\
+      .com[12] = 1, .com[13] = 1,\
+      .bit[12] = 15, .bit[13] = 14\
+    },\
+    { /* 3 */\
+      .com[0] = 3, .com[1] = 3, .com[2] = 1, .com[3] = 0,\
+      .bit[0] = 18, .bit[1] = 20, .bit[2] = 20, .bit[3] = 18,\
+      .com[4] = 1, .com[5] = 3, .com[6] = 2, .com[7] = 2,\
+      .bit[4] = 17, .bit[5] = 17, .bit[6] = 17, .bit[7] = 18,\
+      .com[8] = 2, .com[9] = 3, .com[10] = 2, .com[11] = 0,\
+      .bit[8] = 19, .bit[9] = 19, .bit[10] = 20, .bit[11] = 19,\
+      .com[12] = 1, .com[13] = 1,\
+      .bit[12] = 19, .bit[13] = 18\
+    },\
+    { /* 4 */\
+      .com[0] = 3, .com[1] = 3, .com[2] = 1, .com[3] = 0,\
+      .bit[0] = 22, .bit[1] = 24, .bit[2] = 24, .bit[3] = 22,\
+      .com[4] = 1, .com[5] = 3, .com[6] = 2, .com[7] = 2,\
+      .bit[4] = 21, .bit[5] = 21, .bit[6] = 21, .bit[7] = 22,\
+      .com[8] = 2, .com[9] = 3, .com[10] = 2, .com[11] = 0,\
+      .bit[8] = 23, .bit[9] = 23, .bit[10] = 24, .bit[11] = 23,\
+      .com[12] = 1, .com[13] = 1,\
+      .bit[12] = 23, .bit[13] = 22\
+    },\
+    { /* 5 */\
+      .com[0] = 3, .com[1] = 3, .com[2] = 1, .com[3] = 0,\
+      .bit[0] = 25, .bit[1] = 6, .bit[2] = 6, .bit[3] = 25,\
+      .com[4] = 1, .com[5] = 3, .com[6] = 2, .com[7] = 2,\
+      .bit[4] = 7, .bit[5] = 7, .bit[6] = 7, .bit[7] = 25,\
+      .com[8] = 2, .com[9] = 3, .com[10] = 2, .com[11] = 0,\
+      .bit[8] = 26, .bit[9] = 26, .bit[10] = 6, .bit[11] = 26,\
+      .com[12] = 1, .com[13] = 1,\
+      .bit[12] = 26, .bit[13] = 25\
+    },\
+    { /* 6 */\
+      .com[0] = 3, .com[1] = 3, .com[2] = 1, .com[3] = 0,\
+      .bit[0] = 27, .bit[1] = 04, .bit[2] = 04, .bit[3] = 27,\
+      .com[4] = 1, .com[5] = 3, .com[6] = 2, .com[7] = 2,\
+      .bit[4] = 5, .bit[5] = 5, .bit[6] = 5, .bit[7] = 27,\
+      .com[8] = 2, .com[9] = 3, .com[10] = 2, .com[11] = 0,\
+      .bit[8] = 28, .bit[9] = 28, .bit[10] = 4, .bit[11] = 28,\
+      .com[12] = 1, .com[13] = 1,\
+      .bit[12] = 28, .bit[13] = 27\
+    },\
+    { /* 7 */\
+      .com[0] = 3, .com[1] = 3, .com[2] = 1, .com[3] = 0,\
+      .bit[0] = 29, .bit[1] = 2, .bit[2] = 2, .bit[3] = 29,\
+      .com[4] = 1, .com[5] = 3, .com[6] = 2, .com[7] = 2,\
+      .bit[4] = 03, .bit[5] = 3, .bit[6] = 3, .bit[7] = 29,\
+      .com[8] = 2, .com[9] = 3, .com[10] = 2, .com[11] = 0,\
+      .bit[8] = 30, .bit[9] = 30, .bit[10] = 2, .bit[11] = 30,\
+      .com[12] = 1, .com[13] = 1,\
+      .bit[12] = 30, .bit[13] = 29\
+    }\
+  },\
+  .Number      = {\
+    {\
+      .com[0] = 3, .com[1] = 2, .com[2] = 1, .com[3] = 0,\
+      .bit[0] = 31, .bit[1] = 31, .bit[2] = 31, .bit[3] = 31,\
+      .com[4] = 1, .com[5] = 3, .com[6] = 2,\
+      .bit[4] = 32, .bit[5] = 32, .bit[6] = 32,\
+    },\
+    {\
+      .com[0] = 3, .com[1] = 2, .com[2] = 1, .com[3] = 0,\
+      .bit[0] = 33, .bit[1] = 33, .bit[2] = 33, .bit[3] = 33,\
+      .com[4] = 1, .com[5] = 3, .com[6] = 2,\
+      .bit[4] = 35, .bit[5] = 35, .bit[6] = 35,\
+    },\
+    {\
+      .com[0] = 3, .com[1] = 2, .com[2] = 1, .com[3] = 0,\
+      .bit[0] = 36, .bit[1] = 36, .bit[2] = 36, .bit[3] = 36,\
+      .com[4] = 1, .com[5] = 3, .com[6] = 2,\
+      .bit[4] = 37, .bit[5] = 37, .bit[6] = 37,\
+    },\
+    {\
+      .com[0] = 3, .com[1] = 2, .com[2] = 1, .com[3] = 0,\
+      .bit[0] = 38, .bit[1] = 38, .bit[2] = 38, .bit[3] = 38,\
+      .com[4] = 1, .com[5] = 3, .com[6] = 2,\
+      .bit[4] = 39, .bit[5] = 39, .bit[6] = 39,\
+    },\
+  },\
+  .EMode       = {\
+    .com[0] = 1, .bit[0] = 1,\
+    .com[1] = 2, .bit[1] = 1,\
+    .com[2] = 1, .bit[2] = 0,\
+    .com[3] = 2, .bit[3] = 0,\
+    .com[4] = 3, .bit[4] = 0,\
+  },\
+  .ARing       = {\
+    .com[0] = 0, .bit[0] = 0,\
+    .com[1] = 0, .bit[1] = 1,\
+    .com[2] = 0, .bit[2] = 2,\
+    .com[3] = 0, .bit[3] = 3,\
+    .com[4] = 0, .bit[4] = 4,\
+    .com[5] = 0, .bit[5] = 5,\
+    .com[6] = 0, .bit[6] = 6,\
+    .com[7] = 0, .bit[7] = 7,\
+  },\
+  .Battery     = {\
+    .com[0] = 0, .bit[0] = 12,\
+    .com[1] = 0, .bit[1] = 17,\
+    .com[2] = 0, .bit[2] = 20,\
+    .com[3] = 0, .bit[3] = 13,\
+  }\
+}
+
+static const PinName outPins[] = {
+        /* SEG28..39 */
+		PA7,	//LCD_SEG35
+		PA8,	//LCD_SEG36
+		PA9,	//LCD_SEG37
+		PA10,	//LCD_SEG38
+		PA11,	//LCD_SEG39
+		PB0,	//LCD_SEG32
+		PB1,	//LCD_SEG33
+		PB2,	//LCD_SEG34
+		PD9,	//LCD_SEG28
+		PD10,	//LCD_SEG29
+		PD11,	//LCD_SEG30
+		PD12,	//LCD_SEG31
+        /* SEG 20..27 */
+        PB3,    //LCD_SEG20
+        PB4,    //LCD_SEG21
+        PB5,    //LCD_SEG22
+        PB6,    //LCD_SEG23
+        PF6,    //LCD_SEG24
+        PF7,    //LCD_SEG25
+        PF8,    //LCD_SEG26
+        PF9,    //LCD_SEG27
+        /* SEG12..19 */
+		PA0,	//LCD_SEG13
+		PA1,	//LCD_SEG14
+		PA2,	//LCD_SEG15
+		PA3,	//LCD_SEG16
+		PA4,	//LCD_SEG17
+		PA5,	//LCD_SEG18
+		PA6,	//LCD_SEG19
+		PA15,	//LCD_SEG12
+        /* SEG0..11 */
+        PF2,    //LCD_SEG0
+        PF3,    //LCD_SEG1
+        PF4,    //LCD_SEG2
+        PF5,    //LCD_SEG3
+        PE8,    //LCD_SEG4
+        PE9,    //LCD_SEG5
+        PE10,   //LCD_SEG6
+        PE11,   //LCD_SEG7
+        PE12,   //LCD_SEG8
+        PE13,   //LCD_SEG9
+        PE14,   //LCD_SEG10
+        PE15,   //LCD_SEG11
+        PA15,   //LCD_SEG12
+        /* COM0..3 */
+		PE4,	//LCD_COM0
+		PE5,	//LCD_COM1
+		PE6,	//LCD_COM2
+		PE7		//LCD_COM3
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/segmentlcdconfig_stk_gg.h	Tue Mar 17 11:45:46 2015 -0500
@@ -0,0 +1,347 @@
+/**************************************************************************//**
+ * @file
+ * @brief Segment LCD Config
+ * @version 3.20.5
+ ******************************************************************************
+ * @section License
+ * <b>(C) Copyright 2014 Silicon Labs, http://www.silabs.com</b>
+ *******************************************************************************
+ *
+ * This file is licensensed under the Silabs License Agreement. See the file
+ * "Silabs_License_Agreement.txt" for details. Before using this software for
+ * any purpose, you must agree to the terms of that agreement.
+ *
+ ******************************************************************************/
+
+#ifndef __SEGMENTLCDCONFIG_H
+#define __SEGMENTLCDCONFIG_H
+
+#include "em_lcd.h"
+#include "PinNames.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** Range of symbols available on display */
+typedef enum {
+    LCD_SYMBOL_GECKO,
+    LCD_SYMBOL_ANT,
+    LCD_SYMBOL_PAD0,
+    LCD_SYMBOL_PAD1,
+    LCD_SYMBOL_EFM32,
+    LCD_SYMBOL_MINUS,
+    LCD_SYMBOL_COL3,
+    LCD_SYMBOL_COL5,
+    LCD_SYMBOL_COL10,
+    LCD_SYMBOL_DEGC,
+    LCD_SYMBOL_DEGF,
+    LCD_SYMBOL_DP2,
+    LCD_SYMBOL_DP3,
+    LCD_SYMBOL_DP4,
+    LCD_SYMBOL_DP5,
+    LCD_SYMBOL_DP6,
+    LCD_SYMBOL_DP10,
+} lcdSymbol;
+
+#define LCD_SYMBOL_GECKO_COM  1
+#define LCD_SYMBOL_GECKO_SEG  12
+#define LCD_SYMBOL_ANT_COM  0
+#define LCD_SYMBOL_ANT_SEG  32
+#define LCD_SYMBOL_PAD0_COM  3
+#define LCD_SYMBOL_PAD0_SEG  39
+#define LCD_SYMBOL_PAD1_COM  2
+#define LCD_SYMBOL_PAD1_SEG  12
+#define LCD_SYMBOL_EFM32_COM  0
+#define LCD_SYMBOL_EFM32_SEG  28
+#define LCD_SYMBOL_MINUS_COM  3
+#define LCD_SYMBOL_MINUS_SEG  12
+#define LCD_SYMBOL_COL3_COM  4
+#define LCD_SYMBOL_COL3_SEG  12
+#define LCD_SYMBOL_COL5_COM  0
+#define LCD_SYMBOL_COL5_SEG  30
+#define LCD_SYMBOL_COL10_COM  5
+#define LCD_SYMBOL_COL10_SEG  39
+#define LCD_SYMBOL_DEGC_COM  0
+#define LCD_SYMBOL_DEGC_SEG  34
+#define LCD_SYMBOL_DEGF_COM  0
+#define LCD_SYMBOL_DEGF_SEG  35
+#define LCD_SYMBOL_DP2_COM  7
+#define LCD_SYMBOL_DP2_SEG  12
+#define LCD_SYMBOL_DP3_COM  5
+#define LCD_SYMBOL_DP3_SEG  12
+#define LCD_SYMBOL_DP4_COM  6
+#define LCD_SYMBOL_DP4_SEG  12
+#define LCD_SYMBOL_DP5_COM  7
+#define LCD_SYMBOL_DP5_SEG  29
+#define LCD_SYMBOL_DP6_COM  7
+#define LCD_SYMBOL_DP6_SEG  31
+#define LCD_SYMBOL_DP10_COM  4
+#define LCD_SYMBOL_DP10_SEG  39
+
+/* LCD Controller Prescaler (divide LFACLK / 64) */
+/* LFACLK_LCDpre = 512 Hz */
+/* Set FDIV=0, means 512/1 = 512 Hz */
+/* With octaplex mode, 512/16 => 32 Hz Frame Rate */
+#define LCD_CMU_CLK_PRE         cmuClkDiv_64
+#define LCD_CMU_CLK_DIV         1
+
+#define LCD_BOOST_LEVEL         lcdVBoostLevel3
+
+
+#define LCD_INIT_DEF \
+{ true,\
+  lcdMuxOctaplex,\
+  lcdBiasOneFourth,\
+  lcdWaveLowPower,\
+  lcdVLCDSelVDD, \
+  lcdConConfVLCD }
+
+#define LCD_NUMBER_OFF() \
+do { \
+  LCD_SegmentSetHigh(1, 0x00000078, 0x00000000); \
+  LCD_SegmentSetHigh(2, 0x00000078, 0x00000000); \
+  LCD_SegmentSetHigh(3, 0x00000078, 0x00000000); \
+  LCD_SegmentSetHigh(4, 0x00000078, 0x00000000); \
+  LCD_SegmentSetHigh(5, 0x00000078, 0x00000000); \
+  LCD_SegmentSetHigh(6, 0x00000078, 0x00000000); \
+  LCD_SegmentSetHigh(7, 0x00000078, 0x00000000); \
+} while (0)
+
+#define LCD_ALPHA_NUMBER_OFF() \
+do { \
+  LCD_SegmentSetLow(7, 0x500FE000, 0x00000000);\
+  LCD_SegmentSetLow(6, 0xF00FE000, 0x00000000);\
+  LCD_SegmentSetLow(5, 0xF00FE000, 0x00000000);\
+  LCD_SegmentSetLow(4, 0xF00FE000, 0x00000000);\
+  LCD_SegmentSetLow(3, 0xF00FE000, 0x00000000);\
+  LCD_SegmentSetLow(2, 0xF00FE000, 0x00000000);\
+  LCD_SegmentSetLow(1, 0xF00FE000, 0x00000000);\
+  LCD_SegmentSetLow(0, 0xA0000000, 0x00000000);\
+  LCD_SegmentSetHigh(7, 0x00000007, 0x00000000);\
+  LCD_SegmentSetHigh(6, 0x00000007, 0x00000000);\
+  LCD_SegmentSetHigh(5, 0x00000007, 0x00000000);\
+  LCD_SegmentSetHigh(4, 0x00000007, 0x00000000);\
+  LCD_SegmentSetHigh(3, 0x00000007, 0x00000000);\
+  LCD_SegmentSetHigh(2, 0x00000007, 0x00000000);\
+  LCD_SegmentSetHigh(1, 0x00000007, 0x00000000);\
+} while(0)
+
+#define LCD_ALL_SEGMENTS_OFF() \
+do { \
+  LCD_SegmentSetLow(0, 0xF00FF000, 0x00000000);\
+  LCD_SegmentSetLow(1, 0xF00FF000, 0x00000000);\
+  LCD_SegmentSetLow(2, 0xF00FF000, 0x00000000);\
+  LCD_SegmentSetLow(3, 0xF00FF000, 0x00000000);\
+  LCD_SegmentSetLow(4, 0xF00FF000, 0x00000000);\
+  LCD_SegmentSetLow(5, 0xF00FF000, 0x00000000);\
+  LCD_SegmentSetLow(6, 0xF00FF000, 0x00000000);\
+  LCD_SegmentSetLow(7, 0xF00FF000, 0x00000000);\
+  LCD_SegmentSetHigh(0, 0x000000FF, 0x00000000);\
+  LCD_SegmentSetHigh(1, 0x000000FF, 0x00000000);\
+  LCD_SegmentSetHigh(2, 0x000000FF, 0x00000000);\
+  LCD_SegmentSetHigh(3, 0x000000FF, 0x00000000);\
+  LCD_SegmentSetHigh(4, 0x000000FF, 0x00000000);\
+  LCD_SegmentSetHigh(5, 0x000000FF, 0x00000000);\
+  LCD_SegmentSetHigh(6, 0x000000FF, 0x00000000);\
+  LCD_SegmentSetHigh(7, 0x000000FF, 0x00000000);\
+} while(0)
+
+#define LCD_ALL_SEGMENTS_ON() \
+do { \
+  LCD_SegmentSetLow(0, 0xF00FF000, 0xFFFFFFFF);\
+  LCD_SegmentSetLow(1, 0xF00FF000, 0xFFFFFFFF);\
+  LCD_SegmentSetLow(2, 0xF00FF000, 0xFFFFFFFF);\
+  LCD_SegmentSetLow(3, 0xF00FF000, 0xFFFFFFFF);\
+  LCD_SegmentSetLow(4, 0xF00FF000, 0xFFFFFFFF);\
+  LCD_SegmentSetLow(5, 0xF00FF000, 0xFFFFFFFF);\
+  LCD_SegmentSetLow(6, 0xF00FF000, 0xFFFFFFFF);\
+  LCD_SegmentSetLow(7, 0xF00FF000, 0xFFFFFFFF);\
+  LCD_SegmentSetHigh(0, 0x000000FF, 0xFFFFFFFF);\
+  LCD_SegmentSetHigh(1, 0x000000FF, 0xFFFFFFFF);\
+  LCD_SegmentSetHigh(2, 0x000000FF, 0xFFFFFFFF);\
+  LCD_SegmentSetHigh(3, 0x000000FF, 0xFFFFFFFF);\
+  LCD_SegmentSetHigh(4, 0x000000FF, 0xFFFFFFFF);\
+  LCD_SegmentSetHigh(5, 0x000000FF, 0xFFFFFFFF);\
+  LCD_SegmentSetHigh(6, 0x000000FF, 0xFFFFFFFF);\
+  LCD_SegmentSetHigh(7, 0x000000FF, 0xFFFFFFFF);\
+} while(0)
+
+#define LCD_SEGMENTS_ENABLE() \
+do { \
+LCD_SegmentRangeEnable(lcdSegment12_15, true);\
+LCD_SegmentRangeEnable(lcdSegment16_19, true);\
+LCD_SegmentRangeEnable(lcdSegment28_31, true);\
+LCD_SegmentRangeEnable(lcdSegment32_35, true);\
+LCD_SegmentRangeEnable(lcdSegment36_39, true);\
+} while(0)
+
+#define LCD_DISPLAY_ENABLE() \
+do { \
+	LCD_Enable(true);\
+} while(0)
+
+#define EFM_DISPLAY_DEF {\
+  .Text        = {\
+    { /* 1 */\
+      .com[0] = 1, .com[1] = 1, .com[2] = 5, .com[3] = 7,\
+      .bit[0] = 13, .bit[1] = 14, .bit[2] = 14, .bit[3] = 14,\
+      .com[4] = 7, .com[5] = 3, .com[6] = 4, .com[7] = 2,\
+      .bit[4] = 13, .bit[5] = 13, .bit[6] = 13, .bit[7] = 13,\
+      .com[8] = 3, .com[9] = 2, .com[10] = 4, .com[11] = 6,\
+      .bit[8] = 14, .bit[9] = 14, .bit[10] = 14, .bit[11] = 14,\
+      .com[12] = 5, .com[13] = 6,\
+      .bit[12] = 13, .bit[13] = 13\
+    },\
+    { /* 2 */\
+      .com[0] = 1, .com[1] = 1, .com[2] = 5, .com[3] = 7,\
+      .bit[0] = 15, .bit[1] = 16, .bit[2] = 16, .bit[3] = 16,\
+      .com[4] = 7, .com[5] = 3, .com[6] = 4, .com[7] = 2,\
+      .bit[4] = 15, .bit[5] = 15, .bit[6] = 15, .bit[7] = 15,\
+      .com[8] = 3, .com[9] = 2, .com[10] = 4, .com[11] = 6,\
+      .bit[8] = 16, .bit[9] = 16, .bit[10] = 16, .bit[11] = 16,\
+      .com[12] = 5, .com[13] = 6,\
+      .bit[12] = 15, .bit[13] = 15\
+    },\
+    { /* 3 */\
+      .com[0] = 1, .com[1] = 1, .com[2] = 5, .com[3] = 7,\
+      .bit[0] = 17, .bit[1] = 18, .bit[2] = 18, .bit[3] = 18,\
+      .com[4] = 7, .com[5] = 3, .com[6] = 4, .com[7] = 2,\
+      .bit[4] = 17, .bit[5] = 17, .bit[6] = 17, .bit[7] = 17,\
+      .com[8] = 3, .com[9] = 2, .com[10] = 4, .com[11] = 6,\
+      .bit[8] = 18, .bit[9] = 18, .bit[10] = 18, .bit[11] = 18,\
+      .com[12] = 5, .com[13] = 6,\
+      .bit[12] = 17, .bit[13] = 17\
+    },\
+    { /* 4 */\
+      .com[0] = 1, .com[1] = 1, .com[2] = 5, .com[3] = 7,\
+      .bit[0] = 19, .bit[1] = 28, .bit[2] = 28, .bit[3] = 28,\
+      .com[4] = 7, .com[5] = 3, .com[6] = 4, .com[7] = 2,\
+      .bit[4] = 19, .bit[5] = 19, .bit[6] = 19, .bit[7] = 19,\
+      .com[8] = 3, .com[9] = 2, .com[10] = 4, .com[11] = 6,\
+      .bit[8] = 28, .bit[9] = 28, .bit[10] = 28, .bit[11] = 28,\
+      .com[12] = 5, .com[13] = 6,\
+      .bit[12] = 19, .bit[13] = 19\
+    },\
+    { /* 5 */\
+      .com[0] = 0, .com[1] = 1, .com[2] = 5, .com[3] = 7,\
+      .bit[0] = 29, .bit[1] = 30, .bit[2] = 30, .bit[3] = 30,\
+      .com[4] = 6, .com[5] = 2, .com[6] = 3, .com[7] = 1,\
+      .bit[4] = 29, .bit[5] = 29, .bit[6] = 29, .bit[7] = 29,\
+      .com[8] = 3, .com[9] = 2, .com[10] = 4, .com[11] = 6,\
+      .bit[8] = 30, .bit[9] = 30, .bit[10] = 30, .bit[11] = 30,\
+      .com[12] = 4, .com[13] = 5,\
+      .bit[12] = 29, .bit[13] = 29\
+    },\
+    { /* 6 */\
+      .com[0] = 0, .com[1] = 1, .com[2] = 5, .com[3] = 7,\
+      .bit[0] = 31, .bit[1] = 32, .bit[2] = 32, .bit[3] = 32,\
+      .com[4] = 6, .com[5] = 2, .com[6] = 3, .com[7] = 1,\
+      .bit[4] = 31, .bit[5] = 31, .bit[6] = 31, .bit[7] = 31,\
+      .com[8] = 3, .com[9] = 2, .com[10] = 4, .com[11] = 6,\
+      .bit[8] = 32, .bit[9] = 32, .bit[10] = 32, .bit[11] = 32,\
+      .com[12] = 4, .com[13] = 5,\
+      .bit[12] = 31, .bit[13] = 31\
+    },\
+    { /* 7 */\
+      .com[0] = 1, .com[1] = 1, .com[2] = 5, .com[3] = 7,\
+      .bit[0] = 33, .bit[1] = 34, .bit[2] = 34, .bit[3] = 34,\
+      .com[4] = 7, .com[5] = 3, .com[6] = 4, .com[7] = 2,\
+      .bit[4] = 33, .bit[5] = 33, .bit[6] = 33, .bit[7] = 33,\
+      .com[8] = 3, .com[9] = 2, .com[10] = 4, .com[11] = 6,\
+      .bit[8] = 34, .bit[9] = 34, .bit[10] = 34, .bit[11] = 34,\
+      .com[12] = 5, .com[13] = 6,\
+      .bit[12] = 33, .bit[13] = 33\
+    },\
+  },\
+  .Number      = {\
+    {\
+      .com[0] = 7, .com[1] = 5, .com[2] = 2, .com[3] = 1,\
+      .bit[0] = 35, .bit[1] = 35, .bit[2] = 35, .bit[3] = 35,\
+      .com[4] = 3, .com[5] = 6, .com[6] = 4,\
+      .bit[4] = 35, .bit[5] = 35, .bit[6] = 35,\
+    },\
+    {\
+      .com[0] = 7, .com[1] = 5, .com[2] = 2, .com[3] = 1,\
+      .bit[0] = 36, .bit[1] = 36, .bit[2] = 36, .bit[3] = 36,\
+      .com[4] = 3, .com[5] = 6, .com[6] = 4,\
+      .bit[4] = 36, .bit[5] = 36, .bit[6] = 36,\
+    },\
+    {\
+      .com[0] = 7, .com[1] = 5, .com[2] = 2, .com[3] = 1,\
+      .bit[0] = 37, .bit[1] = 37, .bit[2] = 37, .bit[3] = 37,\
+      .com[4] = 3, .com[5] = 6, .com[6] = 4,\
+      .bit[4] = 37, .bit[5] = 37, .bit[6] = 37,\
+    },\
+    {\
+      .com[0] = 7, .com[1] = 5, .com[2] = 2, .com[3] = 1,\
+      .bit[0] = 38, .bit[1] = 38, .bit[2] = 38, .bit[3] = 38,\
+      .com[4] = 3, .com[5] = 6, .com[6] = 4,\
+      .bit[4] = 38, .bit[5] = 38, .bit[6] = 38,\
+    },\
+  },\
+  .EMode       = {\
+    .com[0] = 0, .bit[0] = 39,\
+    .com[1] = 1, .bit[1] = 39,\
+    .com[2] = 7, .bit[2] = 39,\
+    .com[3] = 2, .bit[3] = 39,\
+    .com[4] = 6, .bit[4] = 39,\
+  },\
+  .ARing       = {\
+    .com[0] = 0, .bit[0] = 19,\
+    .com[1] = 0, .bit[1] = 18,\
+    .com[2] = 0, .bit[2] = 17,\
+    .com[3] = 0, .bit[3] = 16,\
+    .com[4] = 0, .bit[4] = 15,\
+    .com[5] = 0, .bit[5] = 14,\
+    .com[6] = 0, .bit[6] = 13,\
+    .com[7] = 0, .bit[7] = 12,\
+  },\
+  .Battery     = {\
+    .com[0] = 0, .bit[0] = 33,\
+    .com[1] = 0, .bit[1] = 37,\
+    .com[2] = 0, .bit[2] = 36,\
+    .com[3] = 0, .bit[3] = 38,\
+  }\
+}
+
+static const PinName outPins[] = {
+        /* SEG28..39 */
+		PA7,	//LCD_SEG35
+		PA8,	//LCD_SEG36
+		PA9,	//LCD_SEG37
+		PA10,	//LCD_SEG38
+		PA11,	//LCD_SEG39
+		PB0,	//LCD_SEG32
+		PB1,	//LCD_SEG33
+		PB2,	//LCD_SEG34
+		PD9,	//LCD_SEG28
+		PD10,	//LCD_SEG29
+		PD11,	//LCD_SEG30
+		PD12,	//LCD_SEG31
+        /* SEG12..19 */
+		PA0,	//LCD_SEG13
+		PA1,	//LCD_SEG14
+		PA2,	//LCD_SEG15
+		PA3,	//LCD_SEG16
+		PA4,	//LCD_SEG17
+		PA5,	//LCD_SEG18
+		PA6,	//LCD_SEG19
+		PA15,	//LCD_SEG12
+        /* COM4..7 */
+		PB3,	//LCD_COM4
+		PB4,	//LCD_COM5
+		PB5,	//LCD_COM6
+		PB6,	//LCD_COM7
+        /* COM0..3 */
+		PE4,	//LCD_COM0
+		PE5,	//LCD_COM1
+		PE6,	//LCD_COM2
+		PE7		//LCD_COM3
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/segmentlcdconfig_stk_lg.h	Tue Mar 17 11:45:46 2015 -0500
@@ -0,0 +1,346 @@
+/**************************************************************************//**
+ * @file
+ * @brief Segment LCD Config
+ * @version 3.20.5
+ ******************************************************************************
+ * @section License
+ * <b>(C) Copyright 2014 Silicon Labs, http://www.silabs.com</b>
+ *******************************************************************************
+ *
+ * This file is licensensed under the Silabs License Agreement. See the file
+ * "Silabs_License_Agreement.txt" for details. Before using this software for
+ * any purpose, you must agree to the terms of that agreement.
+ *
+ ******************************************************************************/
+
+#ifndef __SEGMENTLCDCONFIG_H
+#define __SEGMENTLCDCONFIG_H
+
+#include "em_lcd.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** Range of symbols available on display */
+typedef enum {
+    LCD_SYMBOL_GECKO,
+    LCD_SYMBOL_ANT,
+    LCD_SYMBOL_PAD0,
+    LCD_SYMBOL_PAD1,
+    LCD_SYMBOL_EFM32,
+    LCD_SYMBOL_MINUS,
+    LCD_SYMBOL_COL3,
+    LCD_SYMBOL_COL5,
+    LCD_SYMBOL_COL10,
+    LCD_SYMBOL_DEGC,
+    LCD_SYMBOL_DEGF,
+    LCD_SYMBOL_DP2,
+    LCD_SYMBOL_DP3,
+    LCD_SYMBOL_DP4,
+    LCD_SYMBOL_DP5,
+    LCD_SYMBOL_DP6,
+    LCD_SYMBOL_DP10,
+} lcdSymbol;
+
+#define LCD_SYMBOL_GECKO_COM  1
+#define LCD_SYMBOL_GECKO_SEG  12
+#define LCD_SYMBOL_ANT_COM  0
+#define LCD_SYMBOL_ANT_SEG  32
+#define LCD_SYMBOL_PAD0_COM  3
+#define LCD_SYMBOL_PAD0_SEG  39
+#define LCD_SYMBOL_PAD1_COM  2
+#define LCD_SYMBOL_PAD1_SEG  12
+#define LCD_SYMBOL_EFM32_COM  0
+#define LCD_SYMBOL_EFM32_SEG  28
+#define LCD_SYMBOL_MINUS_COM  3
+#define LCD_SYMBOL_MINUS_SEG  12
+#define LCD_SYMBOL_COL3_COM  4
+#define LCD_SYMBOL_COL3_SEG  12
+#define LCD_SYMBOL_COL5_COM  0
+#define LCD_SYMBOL_COL5_SEG  30
+#define LCD_SYMBOL_COL10_COM  5
+#define LCD_SYMBOL_COL10_SEG  39
+#define LCD_SYMBOL_DEGC_COM  0
+#define LCD_SYMBOL_DEGC_SEG  34
+#define LCD_SYMBOL_DEGF_COM  0
+#define LCD_SYMBOL_DEGF_SEG  35
+#define LCD_SYMBOL_DP2_COM  7
+#define LCD_SYMBOL_DP2_SEG  12
+#define LCD_SYMBOL_DP3_COM  5
+#define LCD_SYMBOL_DP3_SEG  12
+#define LCD_SYMBOL_DP4_COM  6
+#define LCD_SYMBOL_DP4_SEG  12
+#define LCD_SYMBOL_DP5_COM  7
+#define LCD_SYMBOL_DP5_SEG  29
+#define LCD_SYMBOL_DP6_COM  7
+#define LCD_SYMBOL_DP6_SEG  31
+#define LCD_SYMBOL_DP10_COM  4
+#define LCD_SYMBOL_DP10_SEG  39
+
+/* LCD Controller Prescaler (divide LFACLK / 64) */
+/* LFACLK_LCDpre = 512 Hz */
+/* Set FDIV=0, means 512/1 = 512 Hz */
+/* With octaplex mode, 512/16 => 32 Hz Frame Rate */
+#define LCD_CMU_CLK_PRE         cmuClkDiv_64
+#define LCD_CMU_CLK_DIV         cmuClkDiv_1
+
+#define LCD_BOOST_LEVEL         lcdVBoostLevel3
+
+
+#define LCD_INIT_DEF \
+{ true,\
+  lcdMuxOctaplex,\
+  lcdBiasOneFourth,\
+  lcdWaveLowPower,\
+  lcdVLCDSelVDD, \
+  lcdConConfVLCD }
+
+#define LCD_NUMBER_OFF() \
+do { \
+  LCD_SegmentSetHigh(1, 0x00000078, 0x00000000); \
+  LCD_SegmentSetHigh(2, 0x00000078, 0x00000000); \
+  LCD_SegmentSetHigh(3, 0x00000078, 0x00000000); \
+  LCD_SegmentSetHigh(4, 0x00000078, 0x00000000); \
+  LCD_SegmentSetHigh(5, 0x00000078, 0x00000000); \
+  LCD_SegmentSetHigh(6, 0x00000078, 0x00000000); \
+  LCD_SegmentSetHigh(7, 0x00000078, 0x00000000); \
+} while (0)
+
+#define LCD_ALPHA_NUMBER_OFF() \
+do { \
+  LCD_SegmentSetLow(7, 0x500FE000, 0x00000000);\
+  LCD_SegmentSetLow(6, 0xF00FE000, 0x00000000);\
+  LCD_SegmentSetLow(5, 0xF00FE000, 0x00000000);\
+  LCD_SegmentSetLow(4, 0xF00FE000, 0x00000000);\
+  LCD_SegmentSetLow(3, 0xF00FE000, 0x00000000);\
+  LCD_SegmentSetLow(2, 0xF00FE000, 0x00000000);\
+  LCD_SegmentSetLow(1, 0xF00FE000, 0x00000000);\
+  LCD_SegmentSetLow(0, 0xA0000000, 0x00000000);\
+  LCD_SegmentSetHigh(7, 0x00000007, 0x00000000);\
+  LCD_SegmentSetHigh(6, 0x00000007, 0x00000000);\
+  LCD_SegmentSetHigh(5, 0x00000007, 0x00000000);\
+  LCD_SegmentSetHigh(4, 0x00000007, 0x00000000);\
+  LCD_SegmentSetHigh(3, 0x00000007, 0x00000000);\
+  LCD_SegmentSetHigh(2, 0x00000007, 0x00000000);\
+  LCD_SegmentSetHigh(1, 0x00000007, 0x00000000);\
+} while(0)
+
+#define LCD_ALL_SEGMENTS_OFF() \
+do { \
+  LCD_SegmentSetLow(0, 0xF00FF000, 0x00000000);\
+  LCD_SegmentSetLow(1, 0xF00FF000, 0x00000000);\
+  LCD_SegmentSetLow(2, 0xF00FF000, 0x00000000);\
+  LCD_SegmentSetLow(3, 0xF00FF000, 0x00000000);\
+  LCD_SegmentSetLow(4, 0xF00FF000, 0x00000000);\
+  LCD_SegmentSetLow(5, 0xF00FF000, 0x00000000);\
+  LCD_SegmentSetLow(6, 0xF00FF000, 0x00000000);\
+  LCD_SegmentSetLow(7, 0xF00FF000, 0x00000000);\
+  LCD_SegmentSetHigh(0, 0x000000FF, 0x00000000);\
+  LCD_SegmentSetHigh(1, 0x000000FF, 0x00000000);\
+  LCD_SegmentSetHigh(2, 0x000000FF, 0x00000000);\
+  LCD_SegmentSetHigh(3, 0x000000FF, 0x00000000);\
+  LCD_SegmentSetHigh(4, 0x000000FF, 0x00000000);\
+  LCD_SegmentSetHigh(5, 0x000000FF, 0x00000000);\
+  LCD_SegmentSetHigh(6, 0x000000FF, 0x00000000);\
+  LCD_SegmentSetHigh(7, 0x000000FF, 0x00000000);\
+} while(0)
+
+#define LCD_ALL_SEGMENTS_ON() \
+do { \
+  LCD_SegmentSetLow(0, 0xF00FF000, 0xFFFFFFFF);\
+  LCD_SegmentSetLow(1, 0xF00FF000, 0xFFFFFFFF);\
+  LCD_SegmentSetLow(2, 0xF00FF000, 0xFFFFFFFF);\
+  LCD_SegmentSetLow(3, 0xF00FF000, 0xFFFFFFFF);\
+  LCD_SegmentSetLow(4, 0xF00FF000, 0xFFFFFFFF);\
+  LCD_SegmentSetLow(5, 0xF00FF000, 0xFFFFFFFF);\
+  LCD_SegmentSetLow(6, 0xF00FF000, 0xFFFFFFFF);\
+  LCD_SegmentSetLow(7, 0xF00FF000, 0xFFFFFFFF);\
+  LCD_SegmentSetHigh(0, 0x000000FF, 0xFFFFFFFF);\
+  LCD_SegmentSetHigh(1, 0x000000FF, 0xFFFFFFFF);\
+  LCD_SegmentSetHigh(2, 0x000000FF, 0xFFFFFFFF);\
+  LCD_SegmentSetHigh(3, 0x000000FF, 0xFFFFFFFF);\
+  LCD_SegmentSetHigh(4, 0x000000FF, 0xFFFFFFFF);\
+  LCD_SegmentSetHigh(5, 0x000000FF, 0xFFFFFFFF);\
+  LCD_SegmentSetHigh(6, 0x000000FF, 0xFFFFFFFF);\
+  LCD_SegmentSetHigh(7, 0x000000FF, 0xFFFFFFFF);\
+} while(0)
+
+#define LCD_SEGMENTS_ENABLE() \
+do { \
+LCD_SegmentRangeEnable(lcdSegment12_15, true);\
+LCD_SegmentRangeEnable(lcdSegment16_19, true);\
+LCD_SegmentRangeEnable(lcdSegment28_31, true);\
+LCD_SegmentRangeEnable(lcdSegment32_35, true);\
+LCD_SegmentRangeEnable(lcdSegment36_39, true);\
+} while(0)
+
+#define LCD_DISPLAY_ENABLE() \
+do { \
+  ;\
+} while(0)
+
+#define EFM_DISPLAY_DEF {\
+  .Text        = {\
+    { /* 1 */\
+      .com[0] = 1, .com[1] = 1, .com[2] = 5, .com[3] = 7,\
+      .bit[0] = 13, .bit[1] = 14, .bit[2] = 14, .bit[3] = 14,\
+      .com[4] = 7, .com[5] = 3, .com[6] = 4, .com[7] = 2,\
+      .bit[4] = 13, .bit[5] = 13, .bit[6] = 13, .bit[7] = 13,\
+      .com[8] = 3, .com[9] = 2, .com[10] = 4, .com[11] = 6,\
+      .bit[8] = 14, .bit[9] = 14, .bit[10] = 14, .bit[11] = 14,\
+      .com[12] = 5, .com[13] = 6,\
+      .bit[12] = 13, .bit[13] = 13\
+    },\
+    { /* 2 */\
+      .com[0] = 1, .com[1] = 1, .com[2] = 5, .com[3] = 7,\
+      .bit[0] = 15, .bit[1] = 16, .bit[2] = 16, .bit[3] = 16,\
+      .com[4] = 7, .com[5] = 3, .com[6] = 4, .com[7] = 2,\
+      .bit[4] = 15, .bit[5] = 15, .bit[6] = 15, .bit[7] = 15,\
+      .com[8] = 3, .com[9] = 2, .com[10] = 4, .com[11] = 6,\
+      .bit[8] = 16, .bit[9] = 16, .bit[10] = 16, .bit[11] = 16,\
+      .com[12] = 5, .com[13] = 6,\
+      .bit[12] = 15, .bit[13] = 15\
+    },\
+    { /* 3 */\
+      .com[0] = 1, .com[1] = 1, .com[2] = 5, .com[3] = 7,\
+      .bit[0] = 17, .bit[1] = 18, .bit[2] = 18, .bit[3] = 18,\
+      .com[4] = 7, .com[5] = 3, .com[6] = 4, .com[7] = 2,\
+      .bit[4] = 17, .bit[5] = 17, .bit[6] = 17, .bit[7] = 17,\
+      .com[8] = 3, .com[9] = 2, .com[10] = 4, .com[11] = 6,\
+      .bit[8] = 18, .bit[9] = 18, .bit[10] = 18, .bit[11] = 18,\
+      .com[12] = 5, .com[13] = 6,\
+      .bit[12] = 17, .bit[13] = 17\
+    },\
+    { /* 4 */\
+      .com[0] = 1, .com[1] = 1, .com[2] = 5, .com[3] = 7,\
+      .bit[0] = 19, .bit[1] = 28, .bit[2] = 28, .bit[3] = 28,\
+      .com[4] = 7, .com[5] = 3, .com[6] = 4, .com[7] = 2,\
+      .bit[4] = 19, .bit[5] = 19, .bit[6] = 19, .bit[7] = 19,\
+      .com[8] = 3, .com[9] = 2, .com[10] = 4, .com[11] = 6,\
+      .bit[8] = 28, .bit[9] = 28, .bit[10] = 28, .bit[11] = 28,\
+      .com[12] = 5, .com[13] = 6,\
+      .bit[12] = 19, .bit[13] = 19\
+    },\
+    { /* 5 */\
+      .com[0] = 0, .com[1] = 1, .com[2] = 5, .com[3] = 7,\
+      .bit[0] = 29, .bit[1] = 30, .bit[2] = 30, .bit[3] = 30,\
+      .com[4] = 6, .com[5] = 2, .com[6] = 3, .com[7] = 1,\
+      .bit[4] = 29, .bit[5] = 29, .bit[6] = 29, .bit[7] = 29,\
+      .com[8] = 3, .com[9] = 2, .com[10] = 4, .com[11] = 6,\
+      .bit[8] = 30, .bit[9] = 30, .bit[10] = 30, .bit[11] = 30,\
+      .com[12] = 4, .com[13] = 5,\
+      .bit[12] = 29, .bit[13] = 29\
+    },\
+    { /* 6 */\
+      .com[0] = 0, .com[1] = 1, .com[2] = 5, .com[3] = 7,\
+      .bit[0] = 31, .bit[1] = 32, .bit[2] = 32, .bit[3] = 32,\
+      .com[4] = 6, .com[5] = 2, .com[6] = 3, .com[7] = 1,\
+      .bit[4] = 31, .bit[5] = 31, .bit[6] = 31, .bit[7] = 31,\
+      .com[8] = 3, .com[9] = 2, .com[10] = 4, .com[11] = 6,\
+      .bit[8] = 32, .bit[9] = 32, .bit[10] = 32, .bit[11] = 32,\
+      .com[12] = 4, .com[13] = 5,\
+      .bit[12] = 31, .bit[13] = 31\
+    },\
+    { /* 7 */\
+      .com[0] = 1, .com[1] = 1, .com[2] = 5, .com[3] = 7,\
+      .bit[0] = 33, .bit[1] = 34, .bit[2] = 34, .bit[3] = 34,\
+      .com[4] = 7, .com[5] = 3, .com[6] = 4, .com[7] = 2,\
+      .bit[4] = 33, .bit[5] = 33, .bit[6] = 33, .bit[7] = 33,\
+      .com[8] = 3, .com[9] = 2, .com[10] = 4, .com[11] = 6,\
+      .bit[8] = 34, .bit[9] = 34, .bit[10] = 34, .bit[11] = 34,\
+      .com[12] = 5, .com[13] = 6,\
+      .bit[12] = 33, .bit[13] = 33\
+    },\
+  },\
+  .Number      = {\
+    {\
+      .com[0] = 7, .com[1] = 5, .com[2] = 2, .com[3] = 1,\
+      .bit[0] = 35, .bit[1] = 35, .bit[2] = 35, .bit[3] = 35,\
+      .com[4] = 3, .com[5] = 6, .com[6] = 4,\
+      .bit[4] = 35, .bit[5] = 35, .bit[6] = 35,\
+    },\
+    {\
+      .com[0] = 7, .com[1] = 5, .com[2] = 2, .com[3] = 1,\
+      .bit[0] = 36, .bit[1] = 36, .bit[2] = 36, .bit[3] = 36,\
+      .com[4] = 3, .com[5] = 6, .com[6] = 4,\
+      .bit[4] = 36, .bit[5] = 36, .bit[6] = 36,\
+    },\
+    {\
+      .com[0] = 7, .com[1] = 5, .com[2] = 2, .com[3] = 1,\
+      .bit[0] = 37, .bit[1] = 37, .bit[2] = 37, .bit[3] = 37,\
+      .com[4] = 3, .com[5] = 6, .com[6] = 4,\
+      .bit[4] = 37, .bit[5] = 37, .bit[6] = 37,\
+    },\
+    {\
+      .com[0] = 7, .com[1] = 5, .com[2] = 2, .com[3] = 1,\
+      .bit[0] = 38, .bit[1] = 38, .bit[2] = 38, .bit[3] = 38,\
+      .com[4] = 3, .com[5] = 6, .com[6] = 4,\
+      .bit[4] = 38, .bit[5] = 38, .bit[6] = 38,\
+    },\
+  },\
+  .EMode       = {\
+    .com[0] = 0, .bit[0] = 39,\
+    .com[1] = 1, .bit[1] = 39,\
+    .com[2] = 7, .bit[2] = 39,\
+    .com[3] = 2, .bit[3] = 39,\
+    .com[4] = 6, .bit[4] = 39,\
+  },\
+  .ARing       = {\
+    .com[0] = 0, .bit[0] = 19,\
+    .com[1] = 0, .bit[1] = 18,\
+    .com[2] = 0, .bit[2] = 17,\
+    .com[3] = 0, .bit[3] = 16,\
+    .com[4] = 0, .bit[4] = 15,\
+    .com[5] = 0, .bit[5] = 14,\
+    .com[6] = 0, .bit[6] = 13,\
+    .com[7] = 0, .bit[7] = 12,\
+  },\
+  .Battery     = {\
+    .com[0] = 0, .bit[0] = 33,\
+    .com[1] = 0, .bit[1] = 37,\
+    .com[2] = 0, .bit[2] = 36,\
+    .com[3] = 0, .bit[3] = 38,\
+  }\
+}
+
+static const PinName outPins[] = {
+        /* SEG28..39 */
+		PA7,	//LCD_SEG35
+		PA8,	//LCD_SEG36
+		PA9,	//LCD_SEG37
+		PA10,	//LCD_SEG38
+		PA11,	//LCD_SEG39
+		PB0,	//LCD_SEG32
+		PB1,	//LCD_SEG33
+		PB2,	//LCD_SEG34
+		PD9,	//LCD_SEG28
+		PD10,	//LCD_SEG29
+		PD11,	//LCD_SEG30
+		PD12,	//LCD_SEG31
+        /* SEG12..19 */
+		PA0,	//LCD_SEG13
+		PA1,	//LCD_SEG14
+		PA2,	//LCD_SEG15
+		PA3,	//LCD_SEG16
+		PA4,	//LCD_SEG17
+		PA5,	//LCD_SEG18
+		PA6,	//LCD_SEG19
+		PA15,	//LCD_SEG12
+        /* COM4..7 */
+		PB3,	//LCD_COM4
+		PB4,	//LCD_COM5
+		PB5,	//LCD_COM6
+		PB6,	//LCD_COM7
+        /* COM0..3 */
+		PE4,	//LCD_COM0
+		PE5,	//LCD_COM1
+		PE6,	//LCD_COM2
+		PE7		//LCD_COM3
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/segmentlcdconfig_stk_tg.h	Tue Mar 17 11:45:46 2015 -0500
@@ -0,0 +1,321 @@
+/**************************************************************************//**
+ * @file
+ * @brief Segment LCD Config for the EFM32TG_STK3300 starter kit
+ * @version 3.20.5
+ ******************************************************************************
+ * @section License
+ * <b>(C) Copyright 2014 Silicon Labs, http://www.silabs.com</b>
+ *******************************************************************************
+ *
+ * This file is licensensed under the Silabs License Agreement. See the file
+ * "Silabs_License_Agreement.txt" for details. Before using this software for
+ * any purpose, you must agree to the terms of that agreement.
+ *
+ ******************************************************************************/
+
+#ifndef __SEGMENTLCDCONFIG_H
+#define __SEGMENTLCDCONFIG_H
+
+#include "em_lcd.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** Range of symbols available on display */
+typedef enum {
+    LCD_SYMBOL_GECKO,
+    LCD_SYMBOL_ANT,
+    LCD_SYMBOL_PAD0,
+    LCD_SYMBOL_PAD1,
+    LCD_SYMBOL_EFM32,
+    LCD_SYMBOL_MINUS,
+    LCD_SYMBOL_COL3,
+    LCD_SYMBOL_COL5,
+    LCD_SYMBOL_COL10,
+    LCD_SYMBOL_DEGC,
+    LCD_SYMBOL_DEGF,
+    LCD_SYMBOL_DP2,
+    LCD_SYMBOL_DP3,
+    LCD_SYMBOL_DP4,
+    LCD_SYMBOL_DP5,
+    LCD_SYMBOL_DP6,
+    LCD_SYMBOL_DP10,
+} lcdSymbol;
+
+#define LCD_SYMBOL_GECKO_COM  1
+#define LCD_SYMBOL_GECKO_SEG  0
+#define LCD_SYMBOL_ANT_COM  0
+#define LCD_SYMBOL_ANT_SEG  12
+#define LCD_SYMBOL_PAD0_COM  3
+#define LCD_SYMBOL_PAD0_SEG  19
+#define LCD_SYMBOL_PAD1_COM  2
+#define LCD_SYMBOL_PAD1_SEG  0
+#define LCD_SYMBOL_EFM32_COM  0
+#define LCD_SYMBOL_EFM32_SEG  8
+#define LCD_SYMBOL_MINUS_COM  3
+#define LCD_SYMBOL_MINUS_SEG  0
+#define LCD_SYMBOL_COL3_COM  4
+#define LCD_SYMBOL_COL3_SEG  0
+#define LCD_SYMBOL_COL5_COM  0
+#define LCD_SYMBOL_COL5_SEG  10
+#define LCD_SYMBOL_COL10_COM  5
+#define LCD_SYMBOL_COL10_SEG  19
+#define LCD_SYMBOL_DEGC_COM  0
+#define LCD_SYMBOL_DEGC_SEG  14
+#define LCD_SYMBOL_DEGF_COM  0
+#define LCD_SYMBOL_DEGF_SEG  15
+#define LCD_SYMBOL_DP2_COM  7
+#define LCD_SYMBOL_DP2_SEG  0
+#define LCD_SYMBOL_DP3_COM  5
+#define LCD_SYMBOL_DP3_SEG  0
+#define LCD_SYMBOL_DP4_COM  6
+#define LCD_SYMBOL_DP4_SEG  0
+#define LCD_SYMBOL_DP5_COM  7
+#define LCD_SYMBOL_DP5_SEG  9
+#define LCD_SYMBOL_DP6_COM  7
+#define LCD_SYMBOL_DP6_SEG  11
+#define LCD_SYMBOL_DP10_COM  4
+#define LCD_SYMBOL_DP10_SEG  19
+
+#define LCD_STK3300             TRUE
+#define LCD_DISPLAY_TYPE        8x20
+#define LCD_BOOST_LEVEL         lcdVBoostLevel3
+
+  /* LCD Controller Prescaler (divide LFACLK / 64) */
+  /* LFACLK_LCDpre = 512 Hz */
+  /* Set FDIV=0, means 512/1 = 512 Hz */
+  /* With octaplex mode, 512/16 => 32 Hz Frame Rate */
+#define LCD_CMU_CLK_PRE         cmuClkDiv_64
+#define LCD_CMU_CLK_DIV         cmuClkDiv_1
+
+#define LCD_INIT_DEF \
+{ true,\
+  lcdMuxOctaplex,\
+  lcdBiasOneFourth,\
+  lcdWaveLowPower,\
+  lcdVLCDSelVDD,\
+  lcdConConfVLCD }
+
+#define LCD_NUMBER_OFF() \
+do { \
+  LCD_SegmentSetLow(0, 0x00078000, 0x00000000);\
+  LCD_SegmentSetLow(1, 0x00078000, 0x00000000);\
+  LCD_SegmentSetLow(2, 0x00078000, 0x00000000);\
+  LCD_SegmentSetLow(3, 0x00078000, 0x00000000);\
+  LCD_SegmentSetLow(4, 0x00078000, 0x00000000);\
+  LCD_SegmentSetLow(5, 0x00078000, 0x00000000);\
+  LCD_SegmentSetLow(6, 0x00078000, 0x00000000);\
+  LCD_SegmentSetLow(7, 0x00078000, 0x00000000);\
+} while (0)
+
+#define LCD_ALPHA_NUMBER_OFF() \
+do { \
+  LCD_SegmentSetLow(7, 0x000075FE, 0x00000000);\
+  LCD_SegmentSetLow(6, 0x00007FFE, 0x00000000);\
+  LCD_SegmentSetLow(5, 0x00007FFE, 0x00000000);\
+  LCD_SegmentSetLow(4, 0x00007FFE, 0x00000000);\
+  LCD_SegmentSetLow(3, 0x00007FFE, 0x00000000);\
+  LCD_SegmentSetLow(2, 0x00007FFE, 0x00000000);\
+  LCD_SegmentSetLow(1, 0x00007FFE, 0x00000000);\
+  LCD_SegmentSetLow(0, 0x00000A00, 0x00000000);\
+} while(0)
+
+#define LCD_ALL_SEGMENTS_OFF() \
+do { \
+  LCD_SegmentSetLow(0, 0xFFFFFFFF, 0x00000000);\
+  LCD_SegmentSetLow(1, 0xFFFFFFFF, 0x00000000);\
+  LCD_SegmentSetLow(2, 0xFFFFFFFF, 0x00000000);\
+  LCD_SegmentSetLow(3, 0xFFFFFFFF, 0x00000000);\
+  LCD_SegmentSetLow(4, 0xFFFFFFFF, 0x00000000);\
+  LCD_SegmentSetLow(5, 0xFFFFFFFF, 0x00000000);\
+  LCD_SegmentSetLow(6, 0xFFFFFFFF, 0x00000000);\
+  LCD_SegmentSetLow(7, 0xFFFFFFFF, 0x00000000);\
+} while(0)
+
+#define LCD_ALL_SEGMENTS_ON() \
+do { \
+  LCD_SegmentSetLow(0, 0xFFFFFFFF, 0xFFFFFFFF);\
+  LCD_SegmentSetLow(1, 0xFFFFFFFF, 0xFFFFFFFF);\
+  LCD_SegmentSetLow(2, 0xFFFFFFFF, 0xFFFFFFFF);\
+  LCD_SegmentSetLow(3, 0xFFFFFFFF, 0xFFFFFFFF);\
+  LCD_SegmentSetLow(4, 0xFFFFFFFF, 0xFFFFFFFF);\
+  LCD_SegmentSetLow(5, 0xFFFFFFFF, 0xFFFFFFFF);\
+  LCD_SegmentSetLow(6, 0xFFFFFFFF, 0xFFFFFFFF);\
+  LCD_SegmentSetLow(7, 0xFFFFFFFF, 0xFFFFFFFF);\
+} while(0)
+
+#define LCD_SEGMENTS_ENABLE() \
+do { \
+  LCD_SegmentRangeEnable(lcdSegmentAll, true);\
+} while(0)
+
+#define LCD_DISPLAY_ENABLE() \
+do { \
+  ;\
+} while(0)
+
+#define EFM_DISPLAY_DEF {\
+  .Text        = {\
+    { /* 1 */\
+      .com[0] = 1, .com[1] = 1, .com[2] = 5, .com[3] = 7,\
+      .bit[0] = 1, .bit[1] = 2, .bit[2] = 2, .bit[3] = 2,\
+      .com[4] = 7, .com[5] = 3, .com[6] = 4, .com[7] = 2,\
+      .bit[4] = 1, .bit[5] = 1, .bit[6] = 1, .bit[7] = 1,\
+      .com[8] = 3, .com[9] = 2, .com[10] = 4, .com[11] = 6,\
+      .bit[8] = 2, .bit[9] = 2, .bit[10] = 2, .bit[11] = 2,\
+      .com[12] = 5, .com[13] = 6,\
+      .bit[12] = 1, .bit[13] = 1\
+    },\
+    { /* 2 */\
+      .com[0] = 1, .com[1] = 1, .com[2] = 5, .com[3] = 7,\
+      .bit[0] = 3, .bit[1] = 4, .bit[2] = 4, .bit[3] = 4,\
+      .com[4] = 7, .com[5] = 3, .com[6] = 4, .com[7] = 2,\
+      .bit[4] = 3, .bit[5] = 3, .bit[6] = 3, .bit[7] = 3,\
+      .com[8] = 3, .com[9] = 2, .com[10] = 4, .com[11] = 6,\
+      .bit[8] = 4, .bit[9] = 4, .bit[10] = 4, .bit[11] = 4,\
+      .com[12] = 5, .com[13] = 6,\
+      .bit[12] = 3, .bit[13] = 3\
+    },\
+    { /* 3 */\
+      .com[0] = 1, .com[1] = 1, .com[2] = 5, .com[3] = 7,\
+      .bit[0] = 5, .bit[1] = 6, .bit[2] = 6, .bit[3] = 6,\
+      .com[4] = 7, .com[5] = 3, .com[6] = 4, .com[7] = 2,\
+      .bit[4] = 5, .bit[5] = 5, .bit[6] = 5, .bit[7] = 5,\
+      .com[8] = 3, .com[9] = 2, .com[10] = 4, .com[11] = 6,\
+      .bit[8] = 6, .bit[9] = 6, .bit[10] = 6, .bit[11] = 6,\
+      .com[12] = 5, .com[13] = 6,\
+      .bit[12] = 5, .bit[13] = 5\
+    },\
+    { /* 4 */\
+      .com[0] = 1, .com[1] = 1, .com[2] = 5, .com[3] = 7,\
+      .bit[0] = 7, .bit[1] = 8, .bit[2] = 8, .bit[3] = 8,\
+      .com[4] = 7, .com[5] = 3, .com[6] = 4, .com[7] = 2,\
+      .bit[4] = 7, .bit[5] = 7, .bit[6] = 7, .bit[7] = 7,\
+      .com[8] = 3, .com[9] = 2, .com[10] = 4, .com[11] = 6,\
+      .bit[8] = 8, .bit[9] = 8, .bit[10] = 8, .bit[11] = 8,\
+      .com[12] = 5, .com[13] = 6,\
+      .bit[12] = 7, .bit[13] = 7\
+    },\
+    { /* 5 */\
+      .com[0] = 0, .com[1] = 1, .com[2] = 5, .com[3] = 7,\
+      .bit[0] = 9, .bit[1] = 10, .bit[2] = 10, .bit[3] = 10,\
+      .com[4] = 6, .com[5] = 2, .com[6] = 3, .com[7] = 1,\
+      .bit[4] = 9, .bit[5] = 9, .bit[6] = 9, .bit[7] = 9,\
+      .com[8] = 3, .com[9] = 2, .com[10] = 4, .com[11] = 6,\
+      .bit[8] = 10, .bit[9] = 10, .bit[10] = 10, .bit[11] = 10,\
+      .com[12] = 4, .com[13] = 5,\
+      .bit[12] = 9, .bit[13] = 9\
+    },\
+    { /* 6 */\
+      .com[0] = 0, .com[1] = 1, .com[2] = 5, .com[3] = 7,\
+      .bit[0] = 11, .bit[1] = 12, .bit[2] = 12, .bit[3] = 12,\
+      .com[4] = 6, .com[5] = 2, .com[6] = 3, .com[7] = 1,\
+      .bit[4] = 11, .bit[5] = 11, .bit[6] = 11, .bit[7] = 11,\
+      .com[8] = 3, .com[9] = 2, .com[10] = 4, .com[11] = 6,\
+      .bit[8] = 12, .bit[9] = 12, .bit[10] = 12, .bit[11] = 12,\
+      .com[12] = 4, .com[13] = 5,\
+      .bit[12] = 11, .bit[13] = 11\
+    },\
+    { /* 7 */\
+      .com[0] = 1, .com[1] = 1, .com[2] = 5, .com[3] = 7,\
+      .bit[0] = 13, .bit[1] = 14, .bit[2] = 14, .bit[3] = 14,\
+      .com[4] = 7, .com[5] = 3, .com[6] = 4, .com[7] = 2,\
+      .bit[4] = 13, .bit[5] = 13, .bit[6] = 13, .bit[7] = 13,\
+      .com[8] = 3, .com[9] = 2, .com[10] = 4, .com[11] = 6,\
+      .bit[8] = 14, .bit[9] = 14, .bit[10] = 14, .bit[11] = 14,\
+      .com[12] = 5, .com[13] = 6,\
+      .bit[12] = 13, .bit[13] = 13\
+    },\
+  },\
+  .Number      = {\
+    {\
+      .com[0] = 7, .com[1] = 5, .com[2] = 2, .com[3] = 1,\
+      .bit[0] = 15, .bit[1] = 15, .bit[2] = 15, .bit[3] = 15,\
+      .com[4] = 3, .com[5] = 6, .com[6] = 4,\
+      .bit[4] = 15, .bit[5] = 15, .bit[6] = 15,\
+    },\
+    {\
+      .com[0] = 7, .com[1] = 5, .com[2] = 2, .com[3] = 1,\
+      .bit[0] = 16, .bit[1] = 16, .bit[2] = 16, .bit[3] = 16,\
+      .com[4] = 3, .com[5] = 6, .com[6] = 4,\
+      .bit[4] = 16, .bit[5] = 16, .bit[6] = 16,\
+    },\
+    {\
+      .com[0] = 7, .com[1] = 5, .com[2] = 2, .com[3] = 1,\
+      .bit[0] = 17, .bit[1] = 17, .bit[2] = 17, .bit[3] = 17,\
+      .com[4] = 3, .com[5] = 6, .com[6] = 4,\
+      .bit[4] = 17, .bit[5] = 17, .bit[6] = 17,\
+    },\
+    {\
+      .com[0] = 7, .com[1] = 5, .com[2] = 2, .com[3] = 1,\
+      .bit[0] = 18, .bit[1] = 18, .bit[2] = 18, .bit[3] = 18,\
+      .com[4] = 3, .com[5] = 6, .com[6] = 4,\
+      .bit[4] = 18, .bit[5] = 18, .bit[6] = 18,\
+    },\
+  },\
+  .EMode       = {\
+    .com[0] = 0, .bit[0] = 19,\
+    .com[1] = 1, .bit[1] = 19,\
+    .com[2] = 7, .bit[2] = 19,\
+    .com[3] = 2, .bit[3] = 19,\
+    .com[4] = 6, .bit[4] = 19,\
+  },\
+  .ARing       = {\
+    .com[0] = 0, .bit[0] = 7,\
+    .com[1] = 0, .bit[1] = 6,\
+    .com[2] = 0, .bit[2] = 5,\
+    .com[3] = 0, .bit[3] = 4,\
+    .com[4] = 0, .bit[4] = 3,\
+    .com[5] = 0, .bit[5] = 2,\
+    .com[6] = 0, .bit[6] = 1,\
+    .com[7] = 0, .bit[7] = 0,\
+  },\
+  .Battery     = {\
+    .com[0] = 0, .bit[0] = 13,\
+    .com[1] = 0, .bit[1] = 17,\
+    .com[2] = 0, .bit[2] = 16,\
+    .com[3] = 0, .bit[3] = 18,\
+  }\
+}
+
+static const PinName outPins[] = {
+        /* SEG28..39 */
+		PA7,	//LCD_SEG35
+		PA8,	//LCD_SEG36
+		PA9,	//LCD_SEG37
+		PA10,	//LCD_SEG38
+		PA11,	//LCD_SEG39
+		PB0,	//LCD_SEG32
+		PB1,	//LCD_SEG33
+		PB2,	//LCD_SEG34
+		PD9,	//LCD_SEG28
+		PD10,	//LCD_SEG29
+		PD11,	//LCD_SEG30
+		PD12,	//LCD_SEG31
+        /* SEG12..19 */
+		PA0,	//LCD_SEG13
+		PA1,	//LCD_SEG14
+		PA2,	//LCD_SEG15
+		PA3,	//LCD_SEG16
+		PA4,	//LCD_SEG17
+		PA5,	//LCD_SEG18
+		PA6,	//LCD_SEG19
+		PA15,	//LCD_SEG12
+        /* COM4..7 */
+		PB3,	//LCD_COM4
+		PB4,	//LCD_COM5
+		PB5,	//LCD_COM6
+		PB6,	//LCD_COM7
+        /* COM0..3 */
+		PE4,	//LCD_COM0
+		PE5,	//LCD_COM1
+		PE6,	//LCD_COM2
+		PE7		//LCD_COM3
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/segmentlcdconfig_stk_wg.h	Tue Mar 17 11:45:46 2015 -0500
@@ -0,0 +1,346 @@
+/**************************************************************************//**
+ * @file
+ * @brief Segment LCD Config
+ * @version 3.20.5
+ ******************************************************************************
+ * @section License
+ * <b>(C) Copyright 2014 Silicon Labs, http://www.silabs.com</b>
+ *******************************************************************************
+ *
+ * This file is licensensed under the Silabs License Agreement. See the file
+ * "Silabs_License_Agreement.txt" for details. Before using this software for
+ * any purpose, you must agree to the terms of that agreement.
+ *
+ ******************************************************************************/
+
+#ifndef __SEGMENTLCDCONFIG_H
+#define __SEGMENTLCDCONFIG_H
+
+#include "em_lcd.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** Range of symbols available on display */
+typedef enum {
+    LCD_SYMBOL_GECKO,
+    LCD_SYMBOL_ANT,
+    LCD_SYMBOL_PAD0,
+    LCD_SYMBOL_PAD1,
+    LCD_SYMBOL_EFM32,
+    LCD_SYMBOL_MINUS,
+    LCD_SYMBOL_COL3,
+    LCD_SYMBOL_COL5,
+    LCD_SYMBOL_COL10,
+    LCD_SYMBOL_DEGC,
+    LCD_SYMBOL_DEGF,
+    LCD_SYMBOL_DP2,
+    LCD_SYMBOL_DP3,
+    LCD_SYMBOL_DP4,
+    LCD_SYMBOL_DP5,
+    LCD_SYMBOL_DP6,
+    LCD_SYMBOL_DP10,
+} lcdSymbol;
+
+#define LCD_SYMBOL_GECKO_COM  1
+#define LCD_SYMBOL_GECKO_SEG  12
+#define LCD_SYMBOL_ANT_COM  0
+#define LCD_SYMBOL_ANT_SEG  32
+#define LCD_SYMBOL_PAD0_COM  3
+#define LCD_SYMBOL_PAD0_SEG  39
+#define LCD_SYMBOL_PAD1_COM  2
+#define LCD_SYMBOL_PAD1_SEG  12
+#define LCD_SYMBOL_EFM32_COM  0
+#define LCD_SYMBOL_EFM32_SEG  28
+#define LCD_SYMBOL_MINUS_COM  3
+#define LCD_SYMBOL_MINUS_SEG  12
+#define LCD_SYMBOL_COL3_COM  4
+#define LCD_SYMBOL_COL3_SEG  12
+#define LCD_SYMBOL_COL5_COM  0
+#define LCD_SYMBOL_COL5_SEG  30
+#define LCD_SYMBOL_COL10_COM  5
+#define LCD_SYMBOL_COL10_SEG  39
+#define LCD_SYMBOL_DEGC_COM  0
+#define LCD_SYMBOL_DEGC_SEG  34
+#define LCD_SYMBOL_DEGF_COM  0
+#define LCD_SYMBOL_DEGF_SEG  35
+#define LCD_SYMBOL_DP2_COM  7
+#define LCD_SYMBOL_DP2_SEG  12
+#define LCD_SYMBOL_DP3_COM  5
+#define LCD_SYMBOL_DP3_SEG  12
+#define LCD_SYMBOL_DP4_COM  6
+#define LCD_SYMBOL_DP4_SEG  12
+#define LCD_SYMBOL_DP5_COM  7
+#define LCD_SYMBOL_DP5_SEG  29
+#define LCD_SYMBOL_DP6_COM  7
+#define LCD_SYMBOL_DP6_SEG  31
+#define LCD_SYMBOL_DP10_COM  4
+#define LCD_SYMBOL_DP10_SEG  39
+
+/* LCD Controller Prescaler (divide LFACLK / 64) */
+/* LFACLK_LCDpre = 512 Hz */
+/* Set FDIV=0, means 512/1 = 512 Hz */
+/* With octaplex mode, 512/16 => 32 Hz Frame Rate */
+#define LCD_CMU_CLK_PRE         cmuClkDiv_64
+#define LCD_CMU_CLK_DIV         cmuClkDiv_1
+
+#define LCD_BOOST_LEVEL         lcdVBoostLevel3
+
+
+#define LCD_INIT_DEF \
+{ true,\
+  lcdMuxOctaplex,\
+  lcdBiasOneFourth,\
+  lcdWaveLowPower,\
+  lcdVLCDSelVDD, \
+  lcdConConfVLCD }
+
+#define LCD_NUMBER_OFF() \
+do { \
+  LCD_SegmentSetHigh(1, 0x00000078, 0x00000000); \
+  LCD_SegmentSetHigh(2, 0x00000078, 0x00000000); \
+  LCD_SegmentSetHigh(3, 0x00000078, 0x00000000); \
+  LCD_SegmentSetHigh(4, 0x00000078, 0x00000000); \
+  LCD_SegmentSetHigh(5, 0x00000078, 0x00000000); \
+  LCD_SegmentSetHigh(6, 0x00000078, 0x00000000); \
+  LCD_SegmentSetHigh(7, 0x00000078, 0x00000000); \
+} while (0)
+
+#define LCD_ALPHA_NUMBER_OFF() \
+do { \
+  LCD_SegmentSetLow(7, 0x500FE000, 0x00000000);\
+  LCD_SegmentSetLow(6, 0xF00FE000, 0x00000000);\
+  LCD_SegmentSetLow(5, 0xF00FE000, 0x00000000);\
+  LCD_SegmentSetLow(4, 0xF00FE000, 0x00000000);\
+  LCD_SegmentSetLow(3, 0xF00FE000, 0x00000000);\
+  LCD_SegmentSetLow(2, 0xF00FE000, 0x00000000);\
+  LCD_SegmentSetLow(1, 0xF00FE000, 0x00000000);\
+  LCD_SegmentSetLow(0, 0xA0000000, 0x00000000);\
+  LCD_SegmentSetHigh(7, 0x00000007, 0x00000000);\
+  LCD_SegmentSetHigh(6, 0x00000007, 0x00000000);\
+  LCD_SegmentSetHigh(5, 0x00000007, 0x00000000);\
+  LCD_SegmentSetHigh(4, 0x00000007, 0x00000000);\
+  LCD_SegmentSetHigh(3, 0x00000007, 0x00000000);\
+  LCD_SegmentSetHigh(2, 0x00000007, 0x00000000);\
+  LCD_SegmentSetHigh(1, 0x00000007, 0x00000000);\
+} while(0)
+
+#define LCD_ALL_SEGMENTS_OFF() \
+do { \
+  LCD_SegmentSetLow(0, 0xF00FF000, 0x00000000);\
+  LCD_SegmentSetLow(1, 0xF00FF000, 0x00000000);\
+  LCD_SegmentSetLow(2, 0xF00FF000, 0x00000000);\
+  LCD_SegmentSetLow(3, 0xF00FF000, 0x00000000);\
+  LCD_SegmentSetLow(4, 0xF00FF000, 0x00000000);\
+  LCD_SegmentSetLow(5, 0xF00FF000, 0x00000000);\
+  LCD_SegmentSetLow(6, 0xF00FF000, 0x00000000);\
+  LCD_SegmentSetLow(7, 0xF00FF000, 0x00000000);\
+  LCD_SegmentSetHigh(0, 0x000000FF, 0x00000000);\
+  LCD_SegmentSetHigh(1, 0x000000FF, 0x00000000);\
+  LCD_SegmentSetHigh(2, 0x000000FF, 0x00000000);\
+  LCD_SegmentSetHigh(3, 0x000000FF, 0x00000000);\
+  LCD_SegmentSetHigh(4, 0x000000FF, 0x00000000);\
+  LCD_SegmentSetHigh(5, 0x000000FF, 0x00000000);\
+  LCD_SegmentSetHigh(6, 0x000000FF, 0x00000000);\
+  LCD_SegmentSetHigh(7, 0x000000FF, 0x00000000);\
+} while(0)
+
+#define LCD_ALL_SEGMENTS_ON() \
+do { \
+  LCD_SegmentSetLow(0, 0xF00FF000, 0xFFFFFFFF);\
+  LCD_SegmentSetLow(1, 0xF00FF000, 0xFFFFFFFF);\
+  LCD_SegmentSetLow(2, 0xF00FF000, 0xFFFFFFFF);\
+  LCD_SegmentSetLow(3, 0xF00FF000, 0xFFFFFFFF);\
+  LCD_SegmentSetLow(4, 0xF00FF000, 0xFFFFFFFF);\
+  LCD_SegmentSetLow(5, 0xF00FF000, 0xFFFFFFFF);\
+  LCD_SegmentSetLow(6, 0xF00FF000, 0xFFFFFFFF);\
+  LCD_SegmentSetLow(7, 0xF00FF000, 0xFFFFFFFF);\
+  LCD_SegmentSetHigh(0, 0x000000FF, 0xFFFFFFFF);\
+  LCD_SegmentSetHigh(1, 0x000000FF, 0xFFFFFFFF);\
+  LCD_SegmentSetHigh(2, 0x000000FF, 0xFFFFFFFF);\
+  LCD_SegmentSetHigh(3, 0x000000FF, 0xFFFFFFFF);\
+  LCD_SegmentSetHigh(4, 0x000000FF, 0xFFFFFFFF);\
+  LCD_SegmentSetHigh(5, 0x000000FF, 0xFFFFFFFF);\
+  LCD_SegmentSetHigh(6, 0x000000FF, 0xFFFFFFFF);\
+  LCD_SegmentSetHigh(7, 0x000000FF, 0xFFFFFFFF);\
+} while(0)
+
+#define LCD_SEGMENTS_ENABLE() \
+do { \
+LCD_SegmentRangeEnable(lcdSegment12_15, true);\
+LCD_SegmentRangeEnable(lcdSegment16_19, true);\
+LCD_SegmentRangeEnable(lcdSegment28_31, true);\
+LCD_SegmentRangeEnable(lcdSegment32_35, true);\
+LCD_SegmentRangeEnable(lcdSegment36_39, true);\
+} while(0)
+
+#define LCD_DISPLAY_ENABLE() \
+do { \
+  ;\
+} while(0)
+
+#define EFM_DISPLAY_DEF {\
+  .Text        = {\
+    { /* 1 */\
+      .com[0] = 1, .com[1] = 1, .com[2] = 5, .com[3] = 7,\
+      .bit[0] = 13, .bit[1] = 14, .bit[2] = 14, .bit[3] = 14,\
+      .com[4] = 7, .com[5] = 3, .com[6] = 4, .com[7] = 2,\
+      .bit[4] = 13, .bit[5] = 13, .bit[6] = 13, .bit[7] = 13,\
+      .com[8] = 3, .com[9] = 2, .com[10] = 4, .com[11] = 6,\
+      .bit[8] = 14, .bit[9] = 14, .bit[10] = 14, .bit[11] = 14,\
+      .com[12] = 5, .com[13] = 6,\
+      .bit[12] = 13, .bit[13] = 13\
+    },\
+    { /* 2 */\
+      .com[0] = 1, .com[1] = 1, .com[2] = 5, .com[3] = 7,\
+      .bit[0] = 15, .bit[1] = 16, .bit[2] = 16, .bit[3] = 16,\
+      .com[4] = 7, .com[5] = 3, .com[6] = 4, .com[7] = 2,\
+      .bit[4] = 15, .bit[5] = 15, .bit[6] = 15, .bit[7] = 15,\
+      .com[8] = 3, .com[9] = 2, .com[10] = 4, .com[11] = 6,\
+      .bit[8] = 16, .bit[9] = 16, .bit[10] = 16, .bit[11] = 16,\
+      .com[12] = 5, .com[13] = 6,\
+      .bit[12] = 15, .bit[13] = 15\
+    },\
+    { /* 3 */\
+      .com[0] = 1, .com[1] = 1, .com[2] = 5, .com[3] = 7,\
+      .bit[0] = 17, .bit[1] = 18, .bit[2] = 18, .bit[3] = 18,\
+      .com[4] = 7, .com[5] = 3, .com[6] = 4, .com[7] = 2,\
+      .bit[4] = 17, .bit[5] = 17, .bit[6] = 17, .bit[7] = 17,\
+      .com[8] = 3, .com[9] = 2, .com[10] = 4, .com[11] = 6,\
+      .bit[8] = 18, .bit[9] = 18, .bit[10] = 18, .bit[11] = 18,\
+      .com[12] = 5, .com[13] = 6,\
+      .bit[12] = 17, .bit[13] = 17\
+    },\
+    { /* 4 */\
+      .com[0] = 1, .com[1] = 1, .com[2] = 5, .com[3] = 7,\
+      .bit[0] = 19, .bit[1] = 28, .bit[2] = 28, .bit[3] = 28,\
+      .com[4] = 7, .com[5] = 3, .com[6] = 4, .com[7] = 2,\
+      .bit[4] = 19, .bit[5] = 19, .bit[6] = 19, .bit[7] = 19,\
+      .com[8] = 3, .com[9] = 2, .com[10] = 4, .com[11] = 6,\
+      .bit[8] = 28, .bit[9] = 28, .bit[10] = 28, .bit[11] = 28,\
+      .com[12] = 5, .com[13] = 6,\
+      .bit[12] = 19, .bit[13] = 19\
+    },\
+    { /* 5 */\
+      .com[0] = 0, .com[1] = 1, .com[2] = 5, .com[3] = 7,\
+      .bit[0] = 29, .bit[1] = 30, .bit[2] = 30, .bit[3] = 30,\
+      .com[4] = 6, .com[5] = 2, .com[6] = 3, .com[7] = 1,\
+      .bit[4] = 29, .bit[5] = 29, .bit[6] = 29, .bit[7] = 29,\
+      .com[8] = 3, .com[9] = 2, .com[10] = 4, .com[11] = 6,\
+      .bit[8] = 30, .bit[9] = 30, .bit[10] = 30, .bit[11] = 30,\
+      .com[12] = 4, .com[13] = 5,\
+      .bit[12] = 29, .bit[13] = 29\
+    },\
+    { /* 6 */\
+      .com[0] = 0, .com[1] = 1, .com[2] = 5, .com[3] = 7,\
+      .bit[0] = 31, .bit[1] = 32, .bit[2] = 32, .bit[3] = 32,\
+      .com[4] = 6, .com[5] = 2, .com[6] = 3, .com[7] = 1,\
+      .bit[4] = 31, .bit[5] = 31, .bit[6] = 31, .bit[7] = 31,\
+      .com[8] = 3, .com[9] = 2, .com[10] = 4, .com[11] = 6,\
+      .bit[8] = 32, .bit[9] = 32, .bit[10] = 32, .bit[11] = 32,\
+      .com[12] = 4, .com[13] = 5,\
+      .bit[12] = 31, .bit[13] = 31\
+    },\
+    { /* 7 */\
+      .com[0] = 1, .com[1] = 1, .com[2] = 5, .com[3] = 7,\
+      .bit[0] = 33, .bit[1] = 34, .bit[2] = 34, .bit[3] = 34,\
+      .com[4] = 7, .com[5] = 3, .com[6] = 4, .com[7] = 2,\
+      .bit[4] = 33, .bit[5] = 33, .bit[6] = 33, .bit[7] = 33,\
+      .com[8] = 3, .com[9] = 2, .com[10] = 4, .com[11] = 6,\
+      .bit[8] = 34, .bit[9] = 34, .bit[10] = 34, .bit[11] = 34,\
+      .com[12] = 5, .com[13] = 6,\
+      .bit[12] = 33, .bit[13] = 33\
+    },\
+  },\
+  .Number      = {\
+    {\
+      .com[0] = 7, .com[1] = 5, .com[2] = 2, .com[3] = 1,\
+      .bit[0] = 35, .bit[1] = 35, .bit[2] = 35, .bit[3] = 35,\
+      .com[4] = 3, .com[5] = 6, .com[6] = 4,\
+      .bit[4] = 35, .bit[5] = 35, .bit[6] = 35,\
+    },\
+    {\
+      .com[0] = 7, .com[1] = 5, .com[2] = 2, .com[3] = 1,\
+      .bit[0] = 36, .bit[1] = 36, .bit[2] = 36, .bit[3] = 36,\
+      .com[4] = 3, .com[5] = 6, .com[6] = 4,\
+      .bit[4] = 36, .bit[5] = 36, .bit[6] = 36,\
+    },\
+    {\
+      .com[0] = 7, .com[1] = 5, .com[2] = 2, .com[3] = 1,\
+      .bit[0] = 37, .bit[1] = 37, .bit[2] = 37, .bit[3] = 37,\
+      .com[4] = 3, .com[5] = 6, .com[6] = 4,\
+      .bit[4] = 37, .bit[5] = 37, .bit[6] = 37,\
+    },\
+    {\
+      .com[0] = 7, .com[1] = 5, .com[2] = 2, .com[3] = 1,\
+      .bit[0] = 38, .bit[1] = 38, .bit[2] = 38, .bit[3] = 38,\
+      .com[4] = 3, .com[5] = 6, .com[6] = 4,\
+      .bit[4] = 38, .bit[5] = 38, .bit[6] = 38,\
+    },\
+  },\
+  .EMode       = {\
+    .com[0] = 0, .bit[0] = 39,\
+    .com[1] = 1, .bit[1] = 39,\
+    .com[2] = 7, .bit[2] = 39,\
+    .com[3] = 2, .bit[3] = 39,\
+    .com[4] = 6, .bit[4] = 39,\
+  },\
+  .ARing       = {\
+    .com[0] = 0, .bit[0] = 19,\
+    .com[1] = 0, .bit[1] = 18,\
+    .com[2] = 0, .bit[2] = 17,\
+    .com[3] = 0, .bit[3] = 16,\
+    .com[4] = 0, .bit[4] = 15,\
+    .com[5] = 0, .bit[5] = 14,\
+    .com[6] = 0, .bit[6] = 13,\
+    .com[7] = 0, .bit[7] = 12,\
+  },\
+  .Battery     = {\
+    .com[0] = 0, .bit[0] = 33,\
+    .com[1] = 0, .bit[1] = 37,\
+    .com[2] = 0, .bit[2] = 36,\
+    .com[3] = 0, .bit[3] = 38,\
+  }\
+}
+
+static const PinName outPins[] = {
+        /* SEG28..39 */
+		PA7,	//LCD_SEG35
+		PA8,	//LCD_SEG36
+		PA9,	//LCD_SEG37
+		PA10,	//LCD_SEG38
+		PA11,	//LCD_SEG39
+		PB0,	//LCD_SEG32
+		PB1,	//LCD_SEG33
+		PB2,	//LCD_SEG34
+		PD9,	//LCD_SEG28
+		PD10,	//LCD_SEG29
+		PD11,	//LCD_SEG30
+		PD12,	//LCD_SEG31
+        /* SEG12..19 */
+		PA0,	//LCD_SEG13
+		PA1,	//LCD_SEG14
+		PA2,	//LCD_SEG15
+		PA3,	//LCD_SEG16
+		PA4,	//LCD_SEG17
+		PA5,	//LCD_SEG18
+		PA6,	//LCD_SEG19
+		PA15,	//LCD_SEG12
+        /* COM4..7 */
+		PB3,	//LCD_COM4
+		PB4,	//LCD_COM5
+		PB5,	//LCD_COM6
+		PB6,	//LCD_COM7
+        /* COM0..3 */
+		PE4,	//LCD_COM0
+		PE5,	//LCD_COM1
+		PE6,	//LCD_COM2
+		PE7		//LCD_COM3
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif