This is a driver for the segment LCD found on the Silicon Labs EF32 Giant, Leopard and Wonder Gecko platforms. NOTE: This driver will not work with other platforms, because it contains EFM32-specific code.

Dependents:   EFM32 RDA5807M RDS Radio EMF32-Segment-Touch-Demo EMF32_ShowKey blinky_EFM32_Giant ... more

Information

All examples in this repo are considered EXPERIMENTAL QUALITY, meaning this code has been created as one-off proof-of-concept and is suitable as a demonstration for experimental purposes only. This code will not be regularly maintained by Silicon Labs and there is no guarantee that these projects will work across all environments, SDK versions and hardware.

/media/uploads/stevew817/screenshot_2015-03-17_11.17.52.png

Committer:
stevew817
Date:
Mon May 04 20:40:26 2015 +0000
Revision:
6:114aa75da77b
Parent:
4:b00dd7d93faf
Add pin defines for WG and LG

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Steven Cooreman 0:559902e88130 1 /***************************************************************************//**
Steven Cooreman 0:559902e88130 2 * @file EFM32_SegmentLCD.cpp
Steven Cooreman 0:559902e88130 3 * @brief Driver class for the segment LCD's on some of the EFM32 kits.
Steven Cooreman 0:559902e88130 4 *******************************************************************************
Steven Cooreman 0:559902e88130 5 * @section License
Steven Cooreman 0:559902e88130 6 * <b>(C) Copyright 2015 Silicon Labs, http://www.silabs.com</b>
Steven Cooreman 0:559902e88130 7 *******************************************************************************
Steven Cooreman 0:559902e88130 8 *
Steven Cooreman 0:559902e88130 9 * Permission is granted to anyone to use this software for any purpose,
Steven Cooreman 0:559902e88130 10 * including commercial applications, and to alter it and redistribute it
Steven Cooreman 0:559902e88130 11 * freely, subject to the following restrictions:
Steven Cooreman 0:559902e88130 12 *
Steven Cooreman 0:559902e88130 13 * 1. The origin of this software must not be misrepresented; you must not
Steven Cooreman 0:559902e88130 14 * claim that you wrote the original software.
Steven Cooreman 0:559902e88130 15 * 2. Altered source versions must be plainly marked as such, and must not be
Steven Cooreman 0:559902e88130 16 * misrepresented as being the original software.
Steven Cooreman 0:559902e88130 17 * 3. This notice may not be removed or altered from any source distribution.
Steven Cooreman 0:559902e88130 18 *
Steven Cooreman 0:559902e88130 19 * DISCLAIMER OF WARRANTY/LIMITATION OF REMEDIES: Silicon Labs has no
Steven Cooreman 0:559902e88130 20 * obligation to support this Software. Silicon Labs is providing the
Steven Cooreman 0:559902e88130 21 * Software "AS IS", with no express or implied warranties of any kind,
Steven Cooreman 0:559902e88130 22 * including, but not limited to, any implied warranties of merchantability
Steven Cooreman 0:559902e88130 23 * or fitness for any particular purpose or warranties against infringement
Steven Cooreman 0:559902e88130 24 * of any proprietary rights of a third party.
Steven Cooreman 0:559902e88130 25 *
Steven Cooreman 0:559902e88130 26 * Silicon Labs will not be liable for any consequential, incidental, or
Steven Cooreman 0:559902e88130 27 * special damages, or any other relief, or for any claim by any third party,
Steven Cooreman 0:559902e88130 28 * arising from your use of this Software.
Steven Cooreman 0:559902e88130 29 *
Steven Cooreman 0:559902e88130 30 ******************************************************************************/
Steven Cooreman 0:559902e88130 31
Steven Cooreman 0:559902e88130 32 #include <mbed.h>
Steven Cooreman 0:559902e88130 33 #include "pinmap.h"
Steven Cooreman 0:559902e88130 34 #include "EFM32_SegmentLCD.h"
Steven Cooreman 0:559902e88130 35 #include "segmentlcd.h"
Steven Cooreman 3:4e4f16874281 36 #include "sleep_api.h"
Steven Cooreman 0:559902e88130 37
Steven Cooreman 0:559902e88130 38 namespace silabs {
Steven Cooreman 0:559902e88130 39 /*
Steven Cooreman 0:559902e88130 40 * Constructor.
Steven Cooreman 0:559902e88130 41 */
Steven Cooreman 0:559902e88130 42 EFM32_SegmentLCD::EFM32_SegmentLCD() {
Steven Cooreman 0:559902e88130 43 /* Set all pins used for the LCD to disabled. */
Steven Cooreman 0:559902e88130 44 uint32_t num_pins = sizeof(outPins) / sizeof(outPins[0]);
Steven Cooreman 0:559902e88130 45 for(uint8_t i = 0; i < num_pins; i++) {
Steven Cooreman 0:559902e88130 46 pin_mode(outPins[i], Disabled);
Steven Cooreman 0:559902e88130 47 }
Steven Cooreman 0:559902e88130 48
Steven Cooreman 0:559902e88130 49 /* Initialize the LCD without voltage booster */
Steven Cooreman 0:559902e88130 50 SegmentLCD_Init(false);
Steven Cooreman 3:4e4f16874281 51
Steven Cooreman 3:4e4f16874281 52 /* Block sleep mode */
Steven Cooreman 3:4e4f16874281 53 blockSleepMode(EM2);
Steven Cooreman 3:4e4f16874281 54 }
Steven Cooreman 3:4e4f16874281 55
Steven Cooreman 4:b00dd7d93faf 56 EFM32_SegmentLCD::~EFM32_SegmentLCD() {
Steven Cooreman 3:4e4f16874281 57 /* Shut off LCD peripheral */
Steven Cooreman 3:4e4f16874281 58 SegmentLCD_Disable();
Steven Cooreman 3:4e4f16874281 59
Steven Cooreman 3:4e4f16874281 60 /* Unblock sleep mode */
Steven Cooreman 3:4e4f16874281 61 unblockSleepMode(EM2);
Steven Cooreman 0:559902e88130 62 }
Steven Cooreman 0:559902e88130 63
Steven Cooreman 0:559902e88130 64 void EFM32_SegmentLCD::AllOff( void ) {
Steven Cooreman 0:559902e88130 65 SegmentLCD_AllOff();
Steven Cooreman 0:559902e88130 66 }
Steven Cooreman 0:559902e88130 67
Steven Cooreman 0:559902e88130 68 void EFM32_SegmentLCD::AllOn( void ) {
Steven Cooreman 0:559902e88130 69 SegmentLCD_AllOn();
Steven Cooreman 0:559902e88130 70 }
Steven Cooreman 0:559902e88130 71
Steven Cooreman 0:559902e88130 72 /*
Steven Cooreman 0:559902e88130 73 * Switch off (clear) the alphanumeric portion of the display
Steven Cooreman 0:559902e88130 74 */
Steven Cooreman 0:559902e88130 75 void EFM32_SegmentLCD::AlphaNumberOff(void) {
Steven Cooreman 0:559902e88130 76 SegmentLCD_AlphaNumberOff();
Steven Cooreman 0:559902e88130 77 }
Steven Cooreman 0:559902e88130 78
Steven Cooreman 0:559902e88130 79 /*
Steven Cooreman 0:559902e88130 80 * Switch specified segment on the ring on/off
Steven Cooreman 0:559902e88130 81 * anum: ring segment index
Steven Cooreman 0:559902e88130 82 * on: true to turn on, false to turn off
Steven Cooreman 0:559902e88130 83 */
Steven Cooreman 0:559902e88130 84 void EFM32_SegmentLCD::ARing(int anum, bool on) {
Steven Cooreman 0:559902e88130 85 SegmentLCD_ARing(anum, (on ? 1 : 0));
Steven Cooreman 0:559902e88130 86 }
Steven Cooreman 0:559902e88130 87
Steven Cooreman 0:559902e88130 88 /*
Steven Cooreman 0:559902e88130 89 * Display a battery level on the LCD.
Steven Cooreman 0:559902e88130 90 * 0 = off
Steven Cooreman 0:559902e88130 91 * 1 = lowest block
Steven Cooreman 0:559902e88130 92 * 2 = lowest + second-to-lowest
Steven Cooreman 0:559902e88130 93 * ...
Steven Cooreman 0:559902e88130 94 */
Steven Cooreman 0:559902e88130 95 void EFM32_SegmentLCD::Battery(int batteryLevel) {
Steven Cooreman 0:559902e88130 96 SegmentLCD_Battery(batteryLevel);
Steven Cooreman 0:559902e88130 97 }
Steven Cooreman 0:559902e88130 98
Steven Cooreman 0:559902e88130 99 /*
Steven Cooreman 0:559902e88130 100 * Display an energy mode ring on the LCD.
Steven Cooreman 0:559902e88130 101 * em = energy mode number to display
Steven Cooreman 0:559902e88130 102 * on = true to turn on, false to turn off.
Steven Cooreman 0:559902e88130 103 */
Steven Cooreman 0:559902e88130 104 void EFM32_SegmentLCD::EnergyMode(int em, bool on) {
Steven Cooreman 0:559902e88130 105 SegmentLCD_EnergyMode(em, (on ? 1 : 0));
Steven Cooreman 0:559902e88130 106 }
Steven Cooreman 0:559902e88130 107
Steven Cooreman 0:559902e88130 108 /*
Steven Cooreman 0:559902e88130 109 * Display an unsigned integer on the alphanumeric
Steven Cooreman 0:559902e88130 110 * portion of the display as a hex value.
Steven Cooreman 0:559902e88130 111 *
Steven Cooreman 0:559902e88130 112 * num = number to display
Steven Cooreman 0:559902e88130 113 */
Steven Cooreman 0:559902e88130 114 void EFM32_SegmentLCD::LowerHex( uint32_t num ) {
Steven Cooreman 0:559902e88130 115 SegmentLCD_LowerHex(num);
Steven Cooreman 0:559902e88130 116 }
Steven Cooreman 0:559902e88130 117
Steven Cooreman 0:559902e88130 118 /*
Steven Cooreman 0:559902e88130 119 * Display a signed integer as decimal number on
Steven Cooreman 0:559902e88130 120 * the alphanumeric part of the display.
Steven Cooreman 0:559902e88130 121 */
Steven Cooreman 0:559902e88130 122 void EFM32_SegmentLCD::LowerNumber( int num ) {
Steven Cooreman 0:559902e88130 123 SegmentLCD_LowerNumber(num);
Steven Cooreman 0:559902e88130 124 }
Steven Cooreman 0:559902e88130 125
Steven Cooreman 0:559902e88130 126 /*
Steven Cooreman 0:559902e88130 127 * Display a signed integer on the numeric part
Steven Cooreman 0:559902e88130 128 * of the display (clock area).
Steven Cooreman 0:559902e88130 129 * max = 9999, min = -9999
Steven Cooreman 0:559902e88130 130 */
Steven Cooreman 0:559902e88130 131 void EFM32_SegmentLCD::Number(int value) {
Steven Cooreman 0:559902e88130 132 SegmentLCD_Number(value);
Steven Cooreman 0:559902e88130 133 }
Steven Cooreman 0:559902e88130 134
Steven Cooreman 0:559902e88130 135 /*
Steven Cooreman 0:559902e88130 136 * Clear the numeric part of the display.
Steven Cooreman 0:559902e88130 137 */
Steven Cooreman 0:559902e88130 138 void EFM32_SegmentLCD::NumberOff(void) {
Steven Cooreman 0:559902e88130 139 SegmentLCD_NumberOff();
Steven Cooreman 0:559902e88130 140 }
Steven Cooreman 0:559902e88130 141
Steven Cooreman 0:559902e88130 142 /*
Steven Cooreman 0:559902e88130 143 * Turn a predefined symbol on or off.
Steven Cooreman 0:559902e88130 144 * lcdSymbol = predefined symbol in segmentlcdconfig_*.h
Steven Cooreman 0:559902e88130 145 * on = true to turn on, false to turn off.
Steven Cooreman 0:559902e88130 146 */
Steven Cooreman 0:559902e88130 147 void EFM32_SegmentLCD::Symbol(lcdSymbol s, bool on) {
Steven Cooreman 0:559902e88130 148 SegmentLCD_Symbol(s, (on ? 1 : 0));
Steven Cooreman 0:559902e88130 149 }
Steven Cooreman 0:559902e88130 150
Steven Cooreman 0:559902e88130 151 /*
Steven Cooreman 0:559902e88130 152 * Display an unsigned short integer as a hex value
Steven Cooreman 0:559902e88130 153 * on the numeric part of the display.
Steven Cooreman 0:559902e88130 154 * max = FFFF, min = 0
Steven Cooreman 0:559902e88130 155 */
Steven Cooreman 0:559902e88130 156 void EFM32_SegmentLCD::UnsignedHex(uint16_t value) {
Steven Cooreman 0:559902e88130 157 SegmentLCD_UnsignedHex(value);
Steven Cooreman 0:559902e88130 158 }
Steven Cooreman 0:559902e88130 159
Steven Cooreman 0:559902e88130 160 /*
Steven Cooreman 0:559902e88130 161 * Display a 7-character string on the alphanumeric
Steven Cooreman 0:559902e88130 162 * portion of the display.
Steven Cooreman 0:559902e88130 163 */
Steven Cooreman 0:559902e88130 164 void EFM32_SegmentLCD::Write(char *string) {
Steven Cooreman 0:559902e88130 165 SegmentLCD_Write(string);
Steven Cooreman 0:559902e88130 166 }
Steven Cooreman 0:559902e88130 167
Steven Cooreman 0:559902e88130 168
Steven Cooreman 0:559902e88130 169 }