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:
0:559902e88130
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
Steven Cooreman 0:559902e88130 3 * @brief EFM32 Segment LCD Display driver
Steven Cooreman 0:559902e88130 4 * @version 3.20.9
Steven Cooreman 0:559902e88130 5 ******************************************************************************
Steven Cooreman 0:559902e88130 6 * @section License
Steven Cooreman 0:559902e88130 7 * <b>(C) Copyright 2014 Silicon Labs, http://www.silabs.com</b>
Steven Cooreman 0:559902e88130 8 *******************************************************************************
Steven Cooreman 0:559902e88130 9 *
Steven Cooreman 0:559902e88130 10 * This file is licensensed under the Silabs License Agreement. See the file
Steven Cooreman 0:559902e88130 11 * "Silabs_License_Agreement.txt" for details. Before using this software for
Steven Cooreman 0:559902e88130 12 * any purpose, you must agree to the terms of that agreement.
Steven Cooreman 0:559902e88130 13 *
Steven Cooreman 0:559902e88130 14 ******************************************************************************/
Steven Cooreman 0:559902e88130 15
Steven Cooreman 0:559902e88130 16 #include <stdio.h>
Steven Cooreman 0:559902e88130 17 #include <string.h>
Steven Cooreman 0:559902e88130 18 #include <stdlib.h>
Steven Cooreman 0:559902e88130 19 #include <stdbool.h>
Steven Cooreman 0:559902e88130 20 #include "em_device.h"
Steven Cooreman 0:559902e88130 21 #include "em_cmu.h"
Steven Cooreman 0:559902e88130 22 #include "em_gpio.h"
Steven Cooreman 0:559902e88130 23
Steven Cooreman 0:559902e88130 24 #include "device_peripherals.h"
Steven Cooreman 0:559902e88130 25
Steven Cooreman 0:559902e88130 26 #include "segmentlcd.h"
Steven Cooreman 0:559902e88130 27
Steven Cooreman 0:559902e88130 28 /**************************************************************************//**
Steven Cooreman 0:559902e88130 29 * @brief
Steven Cooreman 0:559902e88130 30 * Defines each text symbol's segment in terms of COM and BIT numbers,
Steven Cooreman 0:559902e88130 31 * in a way that we can enumerate each bit for each text segment in the
Steven Cooreman 0:559902e88130 32 * following bit pattern:
Steven Cooreman 0:559902e88130 33 * @verbatim
Steven Cooreman 0:559902e88130 34 * -------0------
Steven Cooreman 0:559902e88130 35 *
Steven Cooreman 0:559902e88130 36 * | \7 |8 /9 |
Steven Cooreman 0:559902e88130 37 * |5 \ | / |1
Steven Cooreman 0:559902e88130 38 *
Steven Cooreman 0:559902e88130 39 * --6--- ---10--
Steven Cooreman 0:559902e88130 40 *
Steven Cooreman 0:559902e88130 41 * | / | \11 |
Steven Cooreman 0:559902e88130 42 * |4 /13 |12 \ |2
Steven Cooreman 0:559902e88130 43 *
Steven Cooreman 0:559902e88130 44 * -------3------
Steven Cooreman 0:559902e88130 45 * @endverbatim
Steven Cooreman 0:559902e88130 46 * E.g.: First text character bit pattern #3 (above) is
Steven Cooreman 0:559902e88130 47 * Segment 1D for Display
Steven Cooreman 0:559902e88130 48 * Location COM 3, BIT 0
Steven Cooreman 0:559902e88130 49 *****************************************************************************/
Steven Cooreman 0:559902e88130 50 typedef struct
Steven Cooreman 0:559902e88130 51 {
Steven Cooreman 0:559902e88130 52 uint8_t com[14]; /**< LCD COM line (for multiplexing) */
Steven Cooreman 0:559902e88130 53 uint8_t bit[14]; /**< LCD bit number */
Steven Cooreman 0:559902e88130 54 } CHAR_TypeDef;
Steven Cooreman 0:559902e88130 55
Steven Cooreman 0:559902e88130 56
Steven Cooreman 0:559902e88130 57 /**************************************************************************//**
Steven Cooreman 0:559902e88130 58 * @brief Defines segment COM and BIT fields numeric display
Steven Cooreman 0:559902e88130 59 *****************************************************************************/
Steven Cooreman 0:559902e88130 60 typedef struct
Steven Cooreman 0:559902e88130 61 {
Steven Cooreman 0:559902e88130 62 uint8_t com[7]; /**< LCD COM line (for multiplexing) */
Steven Cooreman 0:559902e88130 63 uint8_t bit[7]; /**< LCD bit number */
Steven Cooreman 0:559902e88130 64 } NUMBER_TypeDef;
Steven Cooreman 0:559902e88130 65
Steven Cooreman 0:559902e88130 66 /**************************************************************************//**
Steven Cooreman 0:559902e88130 67 * @brief Defines segment COM and BIT fields for Energy Modes on display
Steven Cooreman 0:559902e88130 68 *****************************************************************************/
Steven Cooreman 0:559902e88130 69 typedef struct
Steven Cooreman 0:559902e88130 70 {
Steven Cooreman 0:559902e88130 71 uint8_t com[5]; /**< LCD COM line (for multiplexing) */
Steven Cooreman 0:559902e88130 72 uint8_t bit[5]; /**< LCD bit number */
Steven Cooreman 0:559902e88130 73 } EM_TypeDef;
Steven Cooreman 0:559902e88130 74
Steven Cooreman 0:559902e88130 75 /**************************************************************************//**
Steven Cooreman 0:559902e88130 76 * @brief Defines segment COM and BIT fields for A-wheel (suited for Anim)
Steven Cooreman 0:559902e88130 77 *****************************************************************************/
Steven Cooreman 0:559902e88130 78 typedef struct
Steven Cooreman 0:559902e88130 79 {
Steven Cooreman 0:559902e88130 80 uint8_t com[8]; /**< LCD COM line (for multiplexing) */
Steven Cooreman 0:559902e88130 81 uint8_t bit[8]; /**< LCD bit number */
Steven Cooreman 0:559902e88130 82 } ARING_TypeDef;
Steven Cooreman 0:559902e88130 83
Steven Cooreman 0:559902e88130 84 /**************************************************************************//**
Steven Cooreman 0:559902e88130 85 * @brief Defines segment COM and BIT fields for A-wheel (suited for Anim)
Steven Cooreman 0:559902e88130 86 *****************************************************************************/
Steven Cooreman 0:559902e88130 87 typedef struct
Steven Cooreman 0:559902e88130 88 {
Steven Cooreman 0:559902e88130 89 uint8_t com[4]; /**< LCD COM line (for multiplexing) */
Steven Cooreman 0:559902e88130 90 uint8_t bit[4]; /**< LCD bit number */
Steven Cooreman 0:559902e88130 91 } BATTERY_TypeDef;
Steven Cooreman 0:559902e88130 92
Steven Cooreman 0:559902e88130 93 /**************************************************************************//**
Steven Cooreman 0:559902e88130 94 * @brief Defines prototype for all segments in display
Steven Cooreman 0:559902e88130 95 *****************************************************************************/
Steven Cooreman 0:559902e88130 96 typedef struct
Steven Cooreman 0:559902e88130 97 {
Steven Cooreman 0:559902e88130 98 CHAR_TypeDef Text[7]; /**< Text on display */
Steven Cooreman 0:559902e88130 99 NUMBER_TypeDef Number[4]; /**< Numbers on display */
Steven Cooreman 0:559902e88130 100 EM_TypeDef EMode; /**< Display energy mode */
Steven Cooreman 0:559902e88130 101 ARING_TypeDef ARing; /**< Display ring */
Steven Cooreman 0:559902e88130 102 BATTERY_TypeDef Battery; /**< Display battery */
Steven Cooreman 0:559902e88130 103 } MCU_DISPLAY;
Steven Cooreman 0:559902e88130 104
Steven Cooreman 0:559902e88130 105 /**************************************************************************//**
Steven Cooreman 0:559902e88130 106 * @brief Working instance of LCD display
Steven Cooreman 0:559902e88130 107 *****************************************************************************/
Steven Cooreman 0:559902e88130 108 static const MCU_DISPLAY EFM_Display = EFM_DISPLAY_DEF;
Steven Cooreman 0:559902e88130 109
Steven Cooreman 0:559902e88130 110
Steven Cooreman 0:559902e88130 111 /**************************************************************************//**
Steven Cooreman 0:559902e88130 112 * @brief
Steven Cooreman 0:559902e88130 113 * Defines higlighted segments for the alphabet, starting from "blank" (SPACE)
Steven Cooreman 0:559902e88130 114 * Uses bit pattern as defined for text segments above.
Steven Cooreman 0:559902e88130 115 * E.g. a capital O, would have bits 0 1 2 3 4 5 => 0x003f defined
Steven Cooreman 0:559902e88130 116 *****************************************************************************/
Steven Cooreman 0:559902e88130 117 static const uint16_t EFM_Alphabet[] = {
Steven Cooreman 0:559902e88130 118 0x0000, /* space */
Steven Cooreman 0:559902e88130 119 0x1100, /* ! */
Steven Cooreman 0:559902e88130 120 0x0280, /* " */
Steven Cooreman 0:559902e88130 121 0x0000, /* # */
Steven Cooreman 0:559902e88130 122 0x0000, /* $ */
Steven Cooreman 0:559902e88130 123 0x0602, /* % */
Steven Cooreman 0:559902e88130 124 0x0000, /* & */
Steven Cooreman 0:559902e88130 125 0x0020, /* ' */
Steven Cooreman 0:559902e88130 126 0x0039, /* ( */
Steven Cooreman 0:559902e88130 127 0x000f, /* ) */
Steven Cooreman 0:559902e88130 128 0x0000, /* * */
Steven Cooreman 0:559902e88130 129 0x1540, /* + */
Steven Cooreman 0:559902e88130 130 0x2000, /* , */
Steven Cooreman 0:559902e88130 131 0x0440, /* - */
Steven Cooreman 0:559902e88130 132 0x1000, /* . */
Steven Cooreman 0:559902e88130 133 0x2200, /* / */
Steven Cooreman 0:559902e88130 134
Steven Cooreman 0:559902e88130 135 0x003f, /* 0 */
Steven Cooreman 0:559902e88130 136 0x0006, /* 1 */
Steven Cooreman 0:559902e88130 137 0x045b, /* 2 */
Steven Cooreman 0:559902e88130 138 0x044f, /* 3 */
Steven Cooreman 0:559902e88130 139 0x0466, /* 4 */
Steven Cooreman 0:559902e88130 140 0x046d, /* 5 */
Steven Cooreman 0:559902e88130 141 0x047d, /* 6 */
Steven Cooreman 0:559902e88130 142 0x0007, /* 7 */
Steven Cooreman 0:559902e88130 143 0x047f, /* 8 */
Steven Cooreman 0:559902e88130 144 0x046f, /* 9 */
Steven Cooreman 0:559902e88130 145
Steven Cooreman 0:559902e88130 146 0x0000, /* : */
Steven Cooreman 0:559902e88130 147 0x0000, /* ; */
Steven Cooreman 0:559902e88130 148 0x0a00, /* < */
Steven Cooreman 0:559902e88130 149 0x0000, /* = */
Steven Cooreman 0:559902e88130 150 0x2080, /* > */
Steven Cooreman 0:559902e88130 151 0x0000, /* ? */
Steven Cooreman 0:559902e88130 152 0xffff, /* @ */
Steven Cooreman 0:559902e88130 153
Steven Cooreman 0:559902e88130 154 0x0477, /* A */
Steven Cooreman 0:559902e88130 155 0x0a79, /* B */
Steven Cooreman 0:559902e88130 156 0x0039, /* C */
Steven Cooreman 0:559902e88130 157 0x20b0, /* D */
Steven Cooreman 0:559902e88130 158 0x0079, /* E */
Steven Cooreman 0:559902e88130 159 0x0071, /* F */
Steven Cooreman 0:559902e88130 160 0x047d, /* G */
Steven Cooreman 0:559902e88130 161 0x0476, /* H */
Steven Cooreman 0:559902e88130 162 0x0006, /* I */
Steven Cooreman 0:559902e88130 163 0x000e, /* J */
Steven Cooreman 0:559902e88130 164 0x0a70, /* K */
Steven Cooreman 0:559902e88130 165 0x0038, /* L */
Steven Cooreman 0:559902e88130 166 0x02b6, /* M */
Steven Cooreman 0:559902e88130 167 0x08b6, /* N */
Steven Cooreman 0:559902e88130 168 0x003f, /* O */
Steven Cooreman 0:559902e88130 169 0x0473, /* P */
Steven Cooreman 0:559902e88130 170 0x083f, /* Q */
Steven Cooreman 0:559902e88130 171 0x0c73, /* R */
Steven Cooreman 0:559902e88130 172 0x046d, /* S */
Steven Cooreman 0:559902e88130 173 0x1101, /* T */
Steven Cooreman 0:559902e88130 174 0x003e, /* U */
Steven Cooreman 0:559902e88130 175 0x2230, /* V */
Steven Cooreman 0:559902e88130 176 0x2836, /* W */
Steven Cooreman 0:559902e88130 177 0x2a80, /* X */
Steven Cooreman 0:559902e88130 178 0x046e, /* Y */
Steven Cooreman 0:559902e88130 179 0x2209, /* Z */
Steven Cooreman 0:559902e88130 180
Steven Cooreman 0:559902e88130 181 0x0039, /* [ */
Steven Cooreman 0:559902e88130 182 0x0880, /* backslash */
Steven Cooreman 0:559902e88130 183 0x000f, /* ] */
Steven Cooreman 0:559902e88130 184 0x0001, /* ^ */
Steven Cooreman 0:559902e88130 185 0x0008, /* _ */
Steven Cooreman 0:559902e88130 186 0x0100, /* ` */
Steven Cooreman 0:559902e88130 187
Steven Cooreman 0:559902e88130 188 0x1058, /* a */
Steven Cooreman 0:559902e88130 189 0x047c, /* b */
Steven Cooreman 0:559902e88130 190 0x0058, /* c */
Steven Cooreman 0:559902e88130 191 0x045e, /* d */
Steven Cooreman 0:559902e88130 192 0x2058, /* e */
Steven Cooreman 0:559902e88130 193 0x0471, /* f */
Steven Cooreman 0:559902e88130 194 0x0c0c, /* g */
Steven Cooreman 0:559902e88130 195 0x0474, /* h */
Steven Cooreman 0:559902e88130 196 0x0004, /* i */
Steven Cooreman 0:559902e88130 197 0x000e, /* j */
Steven Cooreman 0:559902e88130 198 0x0c70, /* k */
Steven Cooreman 0:559902e88130 199 0x0038, /* l */
Steven Cooreman 0:559902e88130 200 0x1454, /* m */
Steven Cooreman 0:559902e88130 201 0x0454, /* n */
Steven Cooreman 0:559902e88130 202 0x045c, /* o */
Steven Cooreman 0:559902e88130 203 0x0473, /* p */
Steven Cooreman 0:559902e88130 204 0x0467, /* q */
Steven Cooreman 0:559902e88130 205 0x0450, /* r */
Steven Cooreman 0:559902e88130 206 0x0c08, /* s */
Steven Cooreman 0:559902e88130 207 0x0078, /* t */
Steven Cooreman 0:559902e88130 208 0x001c, /* u */
Steven Cooreman 0:559902e88130 209 0x2010, /* v */
Steven Cooreman 0:559902e88130 210 0x2814, /* w */
Steven Cooreman 0:559902e88130 211 0x2a80, /* x */
Steven Cooreman 0:559902e88130 212 0x080c, /* y */
Steven Cooreman 0:559902e88130 213 0x2048, /* z */
Steven Cooreman 0:559902e88130 214
Steven Cooreman 0:559902e88130 215 0x0000,
Steven Cooreman 0:559902e88130 216 };
Steven Cooreman 0:559902e88130 217
Steven Cooreman 0:559902e88130 218 /**************************************************************************//**
Steven Cooreman 0:559902e88130 219 * @brief
Steven Cooreman 0:559902e88130 220 * Defines higlighted segments for the numeric display
Steven Cooreman 0:559902e88130 221 *****************************************************************************/
Steven Cooreman 0:559902e88130 222
Steven Cooreman 0:559902e88130 223 static const uint16_t EFM_Numbers[] = {
Steven Cooreman 0:559902e88130 224 0x003f, /* 0 */
Steven Cooreman 0:559902e88130 225 0x0006, /* 1 */
Steven Cooreman 0:559902e88130 226 0x005b, /* 2 */
Steven Cooreman 0:559902e88130 227 0x004f, /* 3 */
Steven Cooreman 0:559902e88130 228 0x0066, /* 4 */
Steven Cooreman 0:559902e88130 229 0x006d, /* 5 */
Steven Cooreman 0:559902e88130 230 0x007d, /* 6 */
Steven Cooreman 0:559902e88130 231 0x0007, /* 7 */
Steven Cooreman 0:559902e88130 232 0x007f, /* 8 */
Steven Cooreman 0:559902e88130 233 0x006f, /* 9 */
Steven Cooreman 0:559902e88130 234 0x0077, /* A */
Steven Cooreman 0:559902e88130 235 0x007c, /* b */
Steven Cooreman 0:559902e88130 236 0x0039, /* C */
Steven Cooreman 0:559902e88130 237 0x005e, /* d */
Steven Cooreman 0:559902e88130 238 0x0079, /* E */
Steven Cooreman 0:559902e88130 239 0x0071, /* F */
Steven Cooreman 0:559902e88130 240 0x0040 /* - */
Steven Cooreman 0:559902e88130 241 };
Steven Cooreman 0:559902e88130 242
Steven Cooreman 0:559902e88130 243 /** @cond DO_NOT_INCLUDE_WITH_DOXYGEN */
Steven Cooreman 0:559902e88130 244 /* sign is last element of the table */
Steven Cooreman 0:559902e88130 245 static const uint16_t signIndex = sizeof(EFM_Numbers)/sizeof(uint16_t) - 1 ;
Steven Cooreman 0:559902e88130 246
Steven Cooreman 0:559902e88130 247 static const LCD_Init_TypeDef lcdInit = LCD_INIT_DEF;
Steven Cooreman 0:559902e88130 248 /** @endcond */
Steven Cooreman 0:559902e88130 249
Steven Cooreman 0:559902e88130 250
Steven Cooreman 0:559902e88130 251 /**************************************************************************//**
Steven Cooreman 0:559902e88130 252 * @brief Disable all segments
Steven Cooreman 0:559902e88130 253 *****************************************************************************/
Steven Cooreman 0:559902e88130 254 void SegmentLCD_AllOff(void)
Steven Cooreman 0:559902e88130 255 {
Steven Cooreman 0:559902e88130 256 /* Turn on low segments */
Steven Cooreman 0:559902e88130 257 LCD_ALL_SEGMENTS_OFF();
Steven Cooreman 0:559902e88130 258 }
Steven Cooreman 0:559902e88130 259
Steven Cooreman 0:559902e88130 260
Steven Cooreman 0:559902e88130 261 /**************************************************************************//**
Steven Cooreman 0:559902e88130 262 * @brief Enable all segments
Steven Cooreman 0:559902e88130 263 *****************************************************************************/
Steven Cooreman 0:559902e88130 264 void SegmentLCD_AllOn(void)
Steven Cooreman 0:559902e88130 265 {
Steven Cooreman 0:559902e88130 266 LCD_ALL_SEGMENTS_ON();
Steven Cooreman 0:559902e88130 267 }
Steven Cooreman 0:559902e88130 268
Steven Cooreman 0:559902e88130 269
Steven Cooreman 0:559902e88130 270 /**************************************************************************//**
Steven Cooreman 0:559902e88130 271 * @brief Turn all segments on alpha characters in display off
Steven Cooreman 0:559902e88130 272 *****************************************************************************/
Steven Cooreman 0:559902e88130 273 void SegmentLCD_AlphaNumberOff(void)
Steven Cooreman 0:559902e88130 274 {
Steven Cooreman 0:559902e88130 275 LCD_ALPHA_NUMBER_OFF();
Steven Cooreman 0:559902e88130 276 return;
Steven Cooreman 0:559902e88130 277 }
Steven Cooreman 0:559902e88130 278
Steven Cooreman 0:559902e88130 279
Steven Cooreman 0:559902e88130 280 /**************************************************************************//**
Steven Cooreman 0:559902e88130 281 * @brief Light up or shut off Ring of Indicators
Steven Cooreman 0:559902e88130 282 * @param anum "Segment number" on "Ring", range 0 - 7
Steven Cooreman 0:559902e88130 283 * @param on Zero is off, non-zero is on
Steven Cooreman 0:559902e88130 284 *****************************************************************************/
Steven Cooreman 0:559902e88130 285 void SegmentLCD_ARing(int anum, int on)
Steven Cooreman 0:559902e88130 286 {
Steven Cooreman 0:559902e88130 287 uint32_t com, bit;
Steven Cooreman 0:559902e88130 288
Steven Cooreman 0:559902e88130 289 com = EFM_Display.ARing.com[anum];
Steven Cooreman 0:559902e88130 290 bit = EFM_Display.ARing.bit[anum];
Steven Cooreman 0:559902e88130 291
Steven Cooreman 0:559902e88130 292 if (on)
Steven Cooreman 0:559902e88130 293 {
Steven Cooreman 0:559902e88130 294 LCD_SegmentSet(com, bit, true);
Steven Cooreman 0:559902e88130 295 }
Steven Cooreman 0:559902e88130 296 else
Steven Cooreman 0:559902e88130 297 {
Steven Cooreman 0:559902e88130 298 LCD_SegmentSet(com, bit, false);
Steven Cooreman 0:559902e88130 299 }
Steven Cooreman 0:559902e88130 300 }
Steven Cooreman 0:559902e88130 301
Steven Cooreman 0:559902e88130 302
Steven Cooreman 0:559902e88130 303 /**************************************************************************//**
Steven Cooreman 0:559902e88130 304 * @brief Light up or shut off Battery Indicator
Steven Cooreman 0:559902e88130 305 * @param batteryLevel Battery Level, 0 to 4 (0 turns all off)
Steven Cooreman 0:559902e88130 306 *****************************************************************************/
Steven Cooreman 0:559902e88130 307 void SegmentLCD_Battery(int batteryLevel)
Steven Cooreman 0:559902e88130 308 {
Steven Cooreman 0:559902e88130 309 uint32_t com, bit;
Steven Cooreman 0:559902e88130 310 int i, on;
Steven Cooreman 0:559902e88130 311
Steven Cooreman 0:559902e88130 312 for (i = 0; i < 4; i++)
Steven Cooreman 0:559902e88130 313 {
Steven Cooreman 0:559902e88130 314 if (i < batteryLevel)
Steven Cooreman 0:559902e88130 315 {
Steven Cooreman 0:559902e88130 316 on = 1;
Steven Cooreman 0:559902e88130 317 }
Steven Cooreman 0:559902e88130 318 else
Steven Cooreman 0:559902e88130 319 {
Steven Cooreman 0:559902e88130 320 on = 0;
Steven Cooreman 0:559902e88130 321 }
Steven Cooreman 0:559902e88130 322 com = EFM_Display.Battery.com[i];
Steven Cooreman 0:559902e88130 323 bit = EFM_Display.Battery.bit[i];
Steven Cooreman 0:559902e88130 324
Steven Cooreman 0:559902e88130 325 if (on)
Steven Cooreman 0:559902e88130 326 {
Steven Cooreman 0:559902e88130 327 LCD_SegmentSet(com, bit, true);
Steven Cooreman 0:559902e88130 328 }
Steven Cooreman 0:559902e88130 329 else
Steven Cooreman 0:559902e88130 330 {
Steven Cooreman 0:559902e88130 331 LCD_SegmentSet(com, bit, false);
Steven Cooreman 0:559902e88130 332 }
Steven Cooreman 0:559902e88130 333 }
Steven Cooreman 0:559902e88130 334 }
Steven Cooreman 0:559902e88130 335
Steven Cooreman 0:559902e88130 336
Steven Cooreman 0:559902e88130 337 /**************************************************************************//**
Steven Cooreman 0:559902e88130 338 * @brief Disables LCD controller
Steven Cooreman 0:559902e88130 339 *****************************************************************************/
Steven Cooreman 0:559902e88130 340 void SegmentLCD_Disable(void)
Steven Cooreman 0:559902e88130 341 {
Steven Cooreman 0:559902e88130 342 /* Disable LCD */
Steven Cooreman 0:559902e88130 343 LCD_Enable(false);
Steven Cooreman 0:559902e88130 344
Steven Cooreman 0:559902e88130 345 /* Make sure CTRL register has been updated */
Steven Cooreman 0:559902e88130 346 LCD_SyncBusyDelay(LCD_SYNCBUSY_CTRL);
Steven Cooreman 0:559902e88130 347
Steven Cooreman 0:559902e88130 348 /* Turn off LCD clock */
Steven Cooreman 0:559902e88130 349 CMU_ClockEnable(cmuClock_LCD, false);
Steven Cooreman 0:559902e88130 350
Steven Cooreman 0:559902e88130 351 /* Turn off voltage boost if enabled */
Steven Cooreman 0:559902e88130 352 CMU->LCDCTRL = 0;
Steven Cooreman 0:559902e88130 353 }
Steven Cooreman 0:559902e88130 354
Steven Cooreman 0:559902e88130 355
Steven Cooreman 0:559902e88130 356 /**************************************************************************//**
Steven Cooreman 0:559902e88130 357 * @brief Light up or shut off Energy Mode indicator
Steven Cooreman 0:559902e88130 358 * @param em Energy Mode numer 0 to 4
Steven Cooreman 0:559902e88130 359 * @param on Zero is off, non-zero is on
Steven Cooreman 0:559902e88130 360 *****************************************************************************/
Steven Cooreman 0:559902e88130 361 void SegmentLCD_EnergyMode(int em, int on)
Steven Cooreman 0:559902e88130 362 {
Steven Cooreman 0:559902e88130 363 uint32_t com, bit;
Steven Cooreman 0:559902e88130 364
Steven Cooreman 0:559902e88130 365 com = EFM_Display.EMode.com[em];
Steven Cooreman 0:559902e88130 366 bit = EFM_Display.EMode.bit[em];
Steven Cooreman 0:559902e88130 367
Steven Cooreman 0:559902e88130 368 if (on)
Steven Cooreman 0:559902e88130 369 {
Steven Cooreman 0:559902e88130 370 LCD_SegmentSet(com, bit, true);
Steven Cooreman 0:559902e88130 371 }
Steven Cooreman 0:559902e88130 372 else
Steven Cooreman 0:559902e88130 373 {
Steven Cooreman 0:559902e88130 374 LCD_SegmentSet(com, bit, false);
Steven Cooreman 0:559902e88130 375 }
Steven Cooreman 0:559902e88130 376 }
Steven Cooreman 0:559902e88130 377
Steven Cooreman 0:559902e88130 378 /**************************************************************************//**
Steven Cooreman 0:559902e88130 379 * @brief Get frame rate division value corresponding to mux selection
Steven Cooreman 0:559902e88130 380 * @param mux enum
Steven Cooreman 0:559902e88130 381 *****************************************************************************/
Steven Cooreman 0:559902e88130 382 uint8_t SegmentLCD_GetFrameRateDiv(LCD_Mux_TypeDef muxSetting) {
Steven Cooreman 0:559902e88130 383 switch(muxSetting) {
Steven Cooreman 0:559902e88130 384 /** Static (segments can be multiplexed with LCD_COM[0]) */
Steven Cooreman 0:559902e88130 385 case lcdMuxStatic: return 2;
Steven Cooreman 0:559902e88130 386 /** Duplex / 1/2 Duty cycle (segments can be multiplexed with LCD_COM[0:1]) */
Steven Cooreman 0:559902e88130 387 case lcdMuxDuplex: return 4;
Steven Cooreman 0:559902e88130 388 /** Triplex / 1/3 Duty cycle (segments can be multiplexed with LCD_COM[0:2]) */
Steven Cooreman 0:559902e88130 389 case lcdMuxTriplex: return 6;
Steven Cooreman 0:559902e88130 390 /** Quadruplex / 1/4 Duty cycle (segments can be multiplexed with LCD_COM[0:3]) */
Steven Cooreman 0:559902e88130 391 case lcdMuxQuadruplex: return 8;
Steven Cooreman 0:559902e88130 392 #if defined(_EFM32_TINY_FAMILY) || defined(_EFM32_GIANT_FAMILY) || defined(_EFM32_WONDER_FAMILY)
Steven Cooreman 0:559902e88130 393 /** Sextaplex / 1/6 Duty cycle (segments can be multiplexed with LCD_COM[0:5]) */
Steven Cooreman 0:559902e88130 394 case lcdMuxSextaplex: return 12;
Steven Cooreman 0:559902e88130 395 /** Octaplex / 1/6 Duty cycle (segments can be multiplexed with LCD_COM[0:5]) */
Steven Cooreman 0:559902e88130 396 case lcdMuxOctaplex: return 16;
Steven Cooreman 0:559902e88130 397 #endif
Steven Cooreman 0:559902e88130 398 default: return 1;
Steven Cooreman 0:559902e88130 399 }
Steven Cooreman 0:559902e88130 400 }
Steven Cooreman 0:559902e88130 401
Steven Cooreman 0:559902e88130 402 /**************************************************************************//**
Steven Cooreman 0:559902e88130 403 * @brief Segment LCD Initialization routine for EFM32 STK display
Steven Cooreman 0:559902e88130 404 * @param useBoost Set to use voltage boost
Steven Cooreman 0:559902e88130 405 *****************************************************************************/
Steven Cooreman 0:559902e88130 406 void SegmentLCD_Init(bool useBoost)
Steven Cooreman 0:559902e88130 407 {
Steven Cooreman 0:559902e88130 408
Steven Cooreman 0:559902e88130 409 /* Ensure LE modules are accessible */
Steven Cooreman 0:559902e88130 410 CMU_ClockEnable(cmuClock_CORELE, true);
Steven Cooreman 0:559902e88130 411
Steven Cooreman 0:559902e88130 412 /* Enable LFRCO as LFACLK in CMU (will also enable oscillator if not enabled) */
Steven Cooreman 0:559902e88130 413 CMU_ClockSelectSet(cmuClock_LFA, cmuSelect_LFRCO);
Steven Cooreman 0:559902e88130 414
Steven Cooreman 0:559902e88130 415 /* LCD Controller Prescaler */
Steven Cooreman 0:559902e88130 416
Steven Cooreman 0:559902e88130 417 /* Calculate value. Approach 50Hz for framerate. */
Steven Cooreman 0:559902e88130 418 uint32_t prescaler = (LOW_ENERGY_CLOCK_FREQUENCY / 32) / SegmentLCD_GetFrameRateDiv(lcdInit.mux);
Steven Cooreman 0:559902e88130 419
Steven Cooreman 0:559902e88130 420 CMU_ClockDivSet(cmuClock_LCDpre, prescaler);
Steven Cooreman 0:559902e88130 421
Steven Cooreman 0:559902e88130 422 /* Frame Rate */
Steven Cooreman 0:559902e88130 423 CMU_LCDClkFDIVSet(0);
Steven Cooreman 0:559902e88130 424
Steven Cooreman 0:559902e88130 425 /* Enable clock to LCD module */
Steven Cooreman 0:559902e88130 426 CMU_ClockEnable(cmuClock_LCD, true);
Steven Cooreman 0:559902e88130 427
Steven Cooreman 0:559902e88130 428 LCD_DISPLAY_ENABLE();
Steven Cooreman 0:559902e88130 429
Steven Cooreman 0:559902e88130 430 /* Disable interrupts */
Steven Cooreman 0:559902e88130 431 LCD_IntDisable(0xFFFFFFFF);
Steven Cooreman 0:559902e88130 432
Steven Cooreman 0:559902e88130 433 /* Initialize and enable LCD controller */
Steven Cooreman 0:559902e88130 434 LCD_Init(&lcdInit);
Steven Cooreman 0:559902e88130 435
Steven Cooreman 0:559902e88130 436 /* Enable all display segments */
Steven Cooreman 0:559902e88130 437 LCD_SEGMENTS_ENABLE();
Steven Cooreman 0:559902e88130 438
Steven Cooreman 0:559902e88130 439 /* Enable boost if necessary */
Steven Cooreman 0:559902e88130 440 if (useBoost)
Steven Cooreman 0:559902e88130 441 {
Steven Cooreman 0:559902e88130 442 LCD_VBoostSet(LCD_BOOST_LEVEL);
Steven Cooreman 0:559902e88130 443 LCD_VLCDSelect(lcdVLCDSelVExtBoost);
Steven Cooreman 0:559902e88130 444 CMU->LCDCTRL |= CMU_LCDCTRL_VBOOSTEN;
Steven Cooreman 0:559902e88130 445 }
Steven Cooreman 0:559902e88130 446
Steven Cooreman 0:559902e88130 447 /* Turn all segments off */
Steven Cooreman 0:559902e88130 448 SegmentLCD_AllOff();
Steven Cooreman 0:559902e88130 449
Steven Cooreman 0:559902e88130 450 LCD_SyncBusyDelay(0xFFFFFFFF);
Steven Cooreman 0:559902e88130 451 }
Steven Cooreman 0:559902e88130 452
Steven Cooreman 0:559902e88130 453
Steven Cooreman 0:559902e88130 454 /**************************************************************************//**
Steven Cooreman 0:559902e88130 455 * @brief Write a hexadecimal number on lower alphanumeric part of
Steven Cooreman 0:559902e88130 456 * Segment LCD display
Steven Cooreman 0:559902e88130 457 * @param num Hexadecimal number value to put on display, in range 0
Steven Cooreman 0:559902e88130 458 * to 0x0FFFFFFF
Steven Cooreman 0:559902e88130 459 *****************************************************************************/
Steven Cooreman 0:559902e88130 460 void SegmentLCD_LowerHex( uint32_t num )
Steven Cooreman 0:559902e88130 461 {
Steven Cooreman 0:559902e88130 462 int i;
Steven Cooreman 0:559902e88130 463 char str[7];
Steven Cooreman 0:559902e88130 464 uint32_t nibble;
Steven Cooreman 0:559902e88130 465
Steven Cooreman 0:559902e88130 466 SegmentLCD_Symbol(LCD_SYMBOL_MINUS, 0);
Steven Cooreman 0:559902e88130 467
Steven Cooreman 0:559902e88130 468 for ( i=6; i>=0; i-- )
Steven Cooreman 0:559902e88130 469 {
Steven Cooreman 0:559902e88130 470 nibble = num & 0xF;
Steven Cooreman 0:559902e88130 471
Steven Cooreman 0:559902e88130 472 if ( nibble < 10 )
Steven Cooreman 0:559902e88130 473 str[i] = nibble + '0';
Steven Cooreman 0:559902e88130 474 else if ( nibble == 11 )
Steven Cooreman 0:559902e88130 475 str[i] = 'b';
Steven Cooreman 0:559902e88130 476 else if ( nibble == 13 )
Steven Cooreman 0:559902e88130 477 str[i] = 'd';
Steven Cooreman 0:559902e88130 478 else
Steven Cooreman 0:559902e88130 479 str[i] = (nibble - 10) + 'A';
Steven Cooreman 0:559902e88130 480
Steven Cooreman 0:559902e88130 481 num >>= 4;
Steven Cooreman 0:559902e88130 482 }
Steven Cooreman 0:559902e88130 483
Steven Cooreman 0:559902e88130 484 SegmentLCD_Write(str);
Steven Cooreman 0:559902e88130 485 }
Steven Cooreman 0:559902e88130 486
Steven Cooreman 0:559902e88130 487 /**************************************************************************//**
Steven Cooreman 0:559902e88130 488 * @brief Write number on lower alphanumeric part of Segment LCD display
Steven Cooreman 0:559902e88130 489 * @param num Numeric value to put on display, in range -9999999 to +9999999
Steven Cooreman 0:559902e88130 490 *****************************************************************************/
Steven Cooreman 0:559902e88130 491 void SegmentLCD_LowerNumber( int num )
Steven Cooreman 0:559902e88130 492 {
Steven Cooreman 0:559902e88130 493 int i;
Steven Cooreman 0:559902e88130 494 char str[7];
Steven Cooreman 0:559902e88130 495
Steven Cooreman 0:559902e88130 496 SegmentLCD_Symbol(LCD_SYMBOL_MINUS, 0);
Steven Cooreman 0:559902e88130 497
Steven Cooreman 0:559902e88130 498 if ( ( num > 9999999 ) || ( num < -9999999 ) )
Steven Cooreman 0:559902e88130 499 {
Steven Cooreman 0:559902e88130 500 SegmentLCD_Write("Ovrflow");
Steven Cooreman 0:559902e88130 501 return;
Steven Cooreman 0:559902e88130 502 }
Steven Cooreman 0:559902e88130 503
Steven Cooreman 0:559902e88130 504 if ( num < 0 )
Steven Cooreman 0:559902e88130 505 {
Steven Cooreman 0:559902e88130 506 SegmentLCD_Symbol(LCD_SYMBOL_MINUS, 1);
Steven Cooreman 0:559902e88130 507 num = -num;
Steven Cooreman 0:559902e88130 508 }
Steven Cooreman 0:559902e88130 509
Steven Cooreman 0:559902e88130 510 for ( i=6; i>=0; i-- )
Steven Cooreman 0:559902e88130 511 {
Steven Cooreman 0:559902e88130 512 if ( ( i < 6 ) && ( num == 0 ) )
Steven Cooreman 0:559902e88130 513 {
Steven Cooreman 0:559902e88130 514 str[i] = ' ';
Steven Cooreman 0:559902e88130 515 }
Steven Cooreman 0:559902e88130 516 else
Steven Cooreman 0:559902e88130 517 {
Steven Cooreman 0:559902e88130 518 str[i] = (num % 10) + '0';
Steven Cooreman 0:559902e88130 519 num /= 10;
Steven Cooreman 0:559902e88130 520 }
Steven Cooreman 0:559902e88130 521 }
Steven Cooreman 0:559902e88130 522
Steven Cooreman 0:559902e88130 523 SegmentLCD_Write(str);
Steven Cooreman 0:559902e88130 524 }
Steven Cooreman 0:559902e88130 525
Steven Cooreman 0:559902e88130 526
Steven Cooreman 0:559902e88130 527 /**************************************************************************//**
Steven Cooreman 0:559902e88130 528 * @brief Write number on numeric part on Segment LCD display
Steven Cooreman 0:559902e88130 529 * @param value Numeric value to put on display, in range -999 to +9999
Steven Cooreman 0:559902e88130 530 *****************************************************************************/
Steven Cooreman 0:559902e88130 531 void SegmentLCD_Number(int value)
Steven Cooreman 0:559902e88130 532 {
Steven Cooreman 0:559902e88130 533 int i, com, bit, digit, div, neg;
Steven Cooreman 0:559902e88130 534 uint16_t bitpattern;
Steven Cooreman 0:559902e88130 535 uint16_t num;
Steven Cooreman 0:559902e88130 536
Steven Cooreman 0:559902e88130 537 /* Parameter consistancy check */
Steven Cooreman 0:559902e88130 538 if (value >= 9999)
Steven Cooreman 0:559902e88130 539 {
Steven Cooreman 0:559902e88130 540 value = 9999;
Steven Cooreman 0:559902e88130 541 }
Steven Cooreman 0:559902e88130 542 if (value <= -1000)
Steven Cooreman 0:559902e88130 543 {
Steven Cooreman 0:559902e88130 544 value = -999;
Steven Cooreman 0:559902e88130 545 }
Steven Cooreman 0:559902e88130 546 if (value < 0)
Steven Cooreman 0:559902e88130 547 {
Steven Cooreman 0:559902e88130 548 value = abs(value);
Steven Cooreman 0:559902e88130 549 neg = 1;
Steven Cooreman 0:559902e88130 550 }
Steven Cooreman 0:559902e88130 551 else
Steven Cooreman 0:559902e88130 552 {
Steven Cooreman 0:559902e88130 553 neg = 0;
Steven Cooreman 0:559902e88130 554 }
Steven Cooreman 0:559902e88130 555
Steven Cooreman 0:559902e88130 556 /* If an update is in progress we must block, or there might be tearing */
Steven Cooreman 0:559902e88130 557 LCD_SyncBusyDelay(0xFFFFFFFF);
Steven Cooreman 0:559902e88130 558
Steven Cooreman 0:559902e88130 559 /* Freeze updates to avoid partial refresh of display */
Steven Cooreman 0:559902e88130 560 LCD_FreezeEnable(true);
Steven Cooreman 0:559902e88130 561
Steven Cooreman 0:559902e88130 562 /* Turn off all number LCD segments */
Steven Cooreman 0:559902e88130 563 SegmentLCD_NumberOff();
Steven Cooreman 0:559902e88130 564
Steven Cooreman 0:559902e88130 565 /* Extract useful digits */
Steven Cooreman 0:559902e88130 566 div = 1;
Steven Cooreman 0:559902e88130 567 for (digit = 0; digit < 4; digit++)
Steven Cooreman 0:559902e88130 568 {
Steven Cooreman 0:559902e88130 569 num = (value / div) % 10;
Steven Cooreman 0:559902e88130 570 if ((neg == 1) && (digit == 3)) num = signIndex;
Steven Cooreman 0:559902e88130 571 /* Get number layout of display */
Steven Cooreman 0:559902e88130 572 bitpattern = EFM_Numbers[num];
Steven Cooreman 0:559902e88130 573 for (i = 0; i < 7; i++)
Steven Cooreman 0:559902e88130 574 {
Steven Cooreman 0:559902e88130 575 bit = EFM_Display.Number[digit].bit[i];
Steven Cooreman 0:559902e88130 576 com = EFM_Display.Number[digit].com[i];
Steven Cooreman 0:559902e88130 577 if (bitpattern & (1 << i))
Steven Cooreman 0:559902e88130 578 {
Steven Cooreman 0:559902e88130 579 LCD_SegmentSet(com, bit, true);
Steven Cooreman 0:559902e88130 580 }
Steven Cooreman 0:559902e88130 581 }
Steven Cooreman 0:559902e88130 582 div = div * 10;
Steven Cooreman 0:559902e88130 583 }
Steven Cooreman 0:559902e88130 584 /* Sync LCD registers to LE domain */
Steven Cooreman 0:559902e88130 585 LCD_FreezeEnable(false);
Steven Cooreman 0:559902e88130 586 }
Steven Cooreman 0:559902e88130 587
Steven Cooreman 0:559902e88130 588
Steven Cooreman 0:559902e88130 589 /**************************************************************************//**
Steven Cooreman 0:559902e88130 590 * @brief Turn all segments on numeric digits in display off
Steven Cooreman 0:559902e88130 591 *****************************************************************************/
Steven Cooreman 0:559902e88130 592 void SegmentLCD_NumberOff(void)
Steven Cooreman 0:559902e88130 593 {
Steven Cooreman 0:559902e88130 594 /* Turn off all number segments */
Steven Cooreman 0:559902e88130 595 LCD_NUMBER_OFF();
Steven Cooreman 0:559902e88130 596 return;
Steven Cooreman 0:559902e88130 597 }
Steven Cooreman 0:559902e88130 598
Steven Cooreman 0:559902e88130 599
Steven Cooreman 0:559902e88130 600 /**************************************************************************//**
Steven Cooreman 0:559902e88130 601 * @brief Light up or shut off various symbols on Segment LCD
Steven Cooreman 0:559902e88130 602 * @param s Which symbol to turn on or off
Steven Cooreman 0:559902e88130 603 * @param on Zero is off, non-zero is on
Steven Cooreman 0:559902e88130 604 *****************************************************************************/
Steven Cooreman 0:559902e88130 605 void SegmentLCD_Symbol(lcdSymbol s, int on)
Steven Cooreman 0:559902e88130 606 {
Steven Cooreman 0:559902e88130 607 int com = 0;
Steven Cooreman 0:559902e88130 608 int bit = 0;
Steven Cooreman 0:559902e88130 609
Steven Cooreman 0:559902e88130 610 switch (s)
Steven Cooreman 0:559902e88130 611 {
Steven Cooreman 0:559902e88130 612 case LCD_SYMBOL_GECKO:
Steven Cooreman 0:559902e88130 613 com = LCD_SYMBOL_GECKO_COM;
Steven Cooreman 0:559902e88130 614 bit = LCD_SYMBOL_GECKO_SEG;
Steven Cooreman 0:559902e88130 615 break;
Steven Cooreman 0:559902e88130 616 case LCD_SYMBOL_ANT:
Steven Cooreman 0:559902e88130 617 com = LCD_SYMBOL_ANT_COM;
Steven Cooreman 0:559902e88130 618 bit = LCD_SYMBOL_ANT_SEG;
Steven Cooreman 0:559902e88130 619 break;
Steven Cooreman 0:559902e88130 620 case LCD_SYMBOL_PAD0:
Steven Cooreman 0:559902e88130 621 com = LCD_SYMBOL_PAD0_COM;
Steven Cooreman 0:559902e88130 622 bit = LCD_SYMBOL_PAD0_SEG;
Steven Cooreman 0:559902e88130 623 break;
Steven Cooreman 0:559902e88130 624 case LCD_SYMBOL_PAD1:
Steven Cooreman 0:559902e88130 625 com = LCD_SYMBOL_PAD1_COM;
Steven Cooreman 0:559902e88130 626 bit = LCD_SYMBOL_PAD1_SEG;
Steven Cooreman 0:559902e88130 627 break;
Steven Cooreman 0:559902e88130 628 case LCD_SYMBOL_EFM32:
Steven Cooreman 0:559902e88130 629 com = LCD_SYMBOL_EFM32_COM;
Steven Cooreman 0:559902e88130 630 bit = LCD_SYMBOL_EFM32_SEG;
Steven Cooreman 0:559902e88130 631 break;
Steven Cooreman 0:559902e88130 632 case LCD_SYMBOL_MINUS:
Steven Cooreman 0:559902e88130 633 com = LCD_SYMBOL_MINUS_COM;
Steven Cooreman 0:559902e88130 634 bit = LCD_SYMBOL_MINUS_SEG;
Steven Cooreman 0:559902e88130 635 break;
Steven Cooreman 0:559902e88130 636 case LCD_SYMBOL_COL3:
Steven Cooreman 0:559902e88130 637 com = LCD_SYMBOL_COL3_COM;
Steven Cooreman 0:559902e88130 638 bit = LCD_SYMBOL_COL3_SEG;
Steven Cooreman 0:559902e88130 639 break;
Steven Cooreman 0:559902e88130 640 case LCD_SYMBOL_COL5:
Steven Cooreman 0:559902e88130 641 com = LCD_SYMBOL_COL5_COM;
Steven Cooreman 0:559902e88130 642 bit = LCD_SYMBOL_COL5_SEG;
Steven Cooreman 0:559902e88130 643 break;
Steven Cooreman 0:559902e88130 644 case LCD_SYMBOL_COL10:
Steven Cooreman 0:559902e88130 645 com = LCD_SYMBOL_COL10_COM;
Steven Cooreman 0:559902e88130 646 bit = LCD_SYMBOL_COL10_SEG;
Steven Cooreman 0:559902e88130 647 break;
Steven Cooreman 0:559902e88130 648 #ifdef LCD_SYMBOL_DEGC_SEG
Steven Cooreman 0:559902e88130 649 case LCD_SYMBOL_DEGC:
Steven Cooreman 0:559902e88130 650 com = LCD_SYMBOL_DEGC_COM;
Steven Cooreman 0:559902e88130 651 bit = LCD_SYMBOL_DEGC_SEG;
Steven Cooreman 0:559902e88130 652 break;
Steven Cooreman 0:559902e88130 653 #endif
Steven Cooreman 0:559902e88130 654 #ifdef LCD_SYMBOL_DEGF_SEG
Steven Cooreman 0:559902e88130 655 case LCD_SYMBOL_DEGF:
Steven Cooreman 0:559902e88130 656 com = LCD_SYMBOL_DEGF_COM;
Steven Cooreman 0:559902e88130 657 bit = LCD_SYMBOL_DEGF_SEG;
Steven Cooreman 0:559902e88130 658 break;
Steven Cooreman 0:559902e88130 659 #endif
Steven Cooreman 0:559902e88130 660 #ifdef LCD_SYMBOL_DP2_SEG
Steven Cooreman 0:559902e88130 661 case LCD_SYMBOL_DP2:
Steven Cooreman 0:559902e88130 662 com = LCD_SYMBOL_DP2_COM;
Steven Cooreman 0:559902e88130 663 bit = LCD_SYMBOL_DP2_SEG;
Steven Cooreman 0:559902e88130 664 break;
Steven Cooreman 0:559902e88130 665 #endif
Steven Cooreman 0:559902e88130 666 #ifdef LCD_SYMBOL_DP3_SEG
Steven Cooreman 0:559902e88130 667 case LCD_SYMBOL_DP3:
Steven Cooreman 0:559902e88130 668 com = LCD_SYMBOL_DP3_COM;
Steven Cooreman 0:559902e88130 669 bit = LCD_SYMBOL_DP3_SEG;
Steven Cooreman 0:559902e88130 670 break;
Steven Cooreman 0:559902e88130 671 #endif
Steven Cooreman 0:559902e88130 672 #ifdef LCD_SYMBOL_DP4_SEG
Steven Cooreman 0:559902e88130 673 case LCD_SYMBOL_DP4:
Steven Cooreman 0:559902e88130 674 com = LCD_SYMBOL_DP4_COM;
Steven Cooreman 0:559902e88130 675 bit = LCD_SYMBOL_DP4_SEG;
Steven Cooreman 0:559902e88130 676 break;
Steven Cooreman 0:559902e88130 677 #endif
Steven Cooreman 0:559902e88130 678 #ifdef LCD_SYMBOL_DP5_SEG
Steven Cooreman 0:559902e88130 679 case LCD_SYMBOL_DP5:
Steven Cooreman 0:559902e88130 680 com = LCD_SYMBOL_DP5_COM;
Steven Cooreman 0:559902e88130 681 bit = LCD_SYMBOL_DP5_SEG;
Steven Cooreman 0:559902e88130 682 break;
Steven Cooreman 0:559902e88130 683 #endif
Steven Cooreman 0:559902e88130 684 case LCD_SYMBOL_DP6:
Steven Cooreman 0:559902e88130 685 com = LCD_SYMBOL_DP6_COM;
Steven Cooreman 0:559902e88130 686 bit = LCD_SYMBOL_DP6_SEG;
Steven Cooreman 0:559902e88130 687 break;
Steven Cooreman 0:559902e88130 688 case LCD_SYMBOL_DP10:
Steven Cooreman 0:559902e88130 689 com = LCD_SYMBOL_DP10_COM;
Steven Cooreman 0:559902e88130 690 bit = LCD_SYMBOL_DP10_SEG;
Steven Cooreman 0:559902e88130 691 break;
Steven Cooreman 0:559902e88130 692 #ifdef LCD_SYMBOL_AM_SEG
Steven Cooreman 0:559902e88130 693 case LCD_SYMBOL_AM:
Steven Cooreman 0:559902e88130 694 com = LCD_SYMBOL_AM_COM;
Steven Cooreman 0:559902e88130 695 bit = LCD_SYMBOL_AM_SEG;
Steven Cooreman 0:559902e88130 696 break;
Steven Cooreman 0:559902e88130 697 #endif
Steven Cooreman 0:559902e88130 698 #ifdef LCD_SYMBOL_PM_SEG
Steven Cooreman 0:559902e88130 699 case LCD_SYMBOL_PM:
Steven Cooreman 0:559902e88130 700 com = LCD_SYMBOL_PM_COM;
Steven Cooreman 0:559902e88130 701 bit = LCD_SYMBOL_PM_SEG;
Steven Cooreman 0:559902e88130 702 break;
Steven Cooreman 0:559902e88130 703 #endif
Steven Cooreman 0:559902e88130 704 #ifdef LCD_SYMBOL_MICROAMP_SEG
Steven Cooreman 0:559902e88130 705 case LCD_SYMBOL_MICROAMP:
Steven Cooreman 0:559902e88130 706 com = LCD_SYMBOL_MICROAMP_COM;
Steven Cooreman 0:559902e88130 707 bit = LCD_SYMBOL_MICROAMP_SEG;
Steven Cooreman 0:559902e88130 708 break;
Steven Cooreman 0:559902e88130 709 #endif
Steven Cooreman 0:559902e88130 710 #ifdef LCD_SYMBOL_MILLIAMP_SEG
Steven Cooreman 0:559902e88130 711 case LCD_SYMBOL_MILLIAMP:
Steven Cooreman 0:559902e88130 712 com = LCD_SYMBOL_MILLIAMP_COM;
Steven Cooreman 0:559902e88130 713 bit = LCD_SYMBOL_MILLIAMP_SEG;
Steven Cooreman 0:559902e88130 714 break;
Steven Cooreman 0:559902e88130 715 #endif
Steven Cooreman 0:559902e88130 716
Steven Cooreman 0:559902e88130 717 }
Steven Cooreman 0:559902e88130 718 if (on)
Steven Cooreman 0:559902e88130 719 {
Steven Cooreman 0:559902e88130 720 LCD_SegmentSet(com, bit, true);
Steven Cooreman 0:559902e88130 721 }
Steven Cooreman 0:559902e88130 722 else
Steven Cooreman 0:559902e88130 723 {
Steven Cooreman 0:559902e88130 724 LCD_SegmentSet(com, bit, false);
Steven Cooreman 0:559902e88130 725 }
Steven Cooreman 0:559902e88130 726 }
Steven Cooreman 0:559902e88130 727
Steven Cooreman 0:559902e88130 728
Steven Cooreman 0:559902e88130 729 /**************************************************************************//**
Steven Cooreman 0:559902e88130 730 * @brief Write hexadecimal number on numeric part on Segment LCD display
Steven Cooreman 0:559902e88130 731 * @param value Numeric value to put on display, in range 0x0000-0xFFFF
Steven Cooreman 0:559902e88130 732 *****************************************************************************/
Steven Cooreman 0:559902e88130 733 void SegmentLCD_UnsignedHex(uint16_t value)
Steven Cooreman 0:559902e88130 734 {
Steven Cooreman 0:559902e88130 735 int num, i, com, bit, digit;
Steven Cooreman 0:559902e88130 736 uint16_t bitpattern;
Steven Cooreman 0:559902e88130 737
Steven Cooreman 0:559902e88130 738 /* Parameter consistancy check */
Steven Cooreman 0:559902e88130 739 if (value >= 0xffff)
Steven Cooreman 0:559902e88130 740 {
Steven Cooreman 0:559902e88130 741 value = 0xffff;
Steven Cooreman 0:559902e88130 742 }
Steven Cooreman 0:559902e88130 743
Steven Cooreman 0:559902e88130 744 /* If an update is in progress we must block, or there might be tearing */
Steven Cooreman 0:559902e88130 745 LCD_SyncBusyDelay(0xFFFFFFFF);
Steven Cooreman 0:559902e88130 746
Steven Cooreman 0:559902e88130 747 /* Freeze updates to avoid partial refresh of display */
Steven Cooreman 0:559902e88130 748 LCD_FreezeEnable(true);
Steven Cooreman 0:559902e88130 749
Steven Cooreman 0:559902e88130 750 /* Turn off all number LCD segments */
Steven Cooreman 0:559902e88130 751 SegmentLCD_NumberOff();
Steven Cooreman 0:559902e88130 752
Steven Cooreman 0:559902e88130 753 for (digit = 0; digit < 4; digit++)
Steven Cooreman 0:559902e88130 754 {
Steven Cooreman 0:559902e88130 755 num = (value >> (4 * digit)) & 0x0f;
Steven Cooreman 0:559902e88130 756 bitpattern = EFM_Numbers[num];
Steven Cooreman 0:559902e88130 757 for (i = 0; i < 7; i++)
Steven Cooreman 0:559902e88130 758 {
Steven Cooreman 0:559902e88130 759 bit = EFM_Display.Number[digit].bit[i];
Steven Cooreman 0:559902e88130 760 com = EFM_Display.Number[digit].com[i];
Steven Cooreman 0:559902e88130 761 if (bitpattern & (1 << i))
Steven Cooreman 0:559902e88130 762 {
Steven Cooreman 0:559902e88130 763 LCD_SegmentSet(com, bit, true);
Steven Cooreman 0:559902e88130 764 }
Steven Cooreman 0:559902e88130 765 }
Steven Cooreman 0:559902e88130 766 }
Steven Cooreman 0:559902e88130 767
Steven Cooreman 0:559902e88130 768 /* Sync LCD registers to LE domain */
Steven Cooreman 0:559902e88130 769 LCD_FreezeEnable(false);
Steven Cooreman 0:559902e88130 770 }
Steven Cooreman 0:559902e88130 771
Steven Cooreman 0:559902e88130 772
Steven Cooreman 0:559902e88130 773 /**************************************************************************//**
Steven Cooreman 0:559902e88130 774 * @brief Write text on LCD display
Steven Cooreman 0:559902e88130 775 * @param string Text string to show on display
Steven Cooreman 0:559902e88130 776 *****************************************************************************/
Steven Cooreman 0:559902e88130 777 void SegmentLCD_Write(char *string)
Steven Cooreman 0:559902e88130 778 {
Steven Cooreman 0:559902e88130 779 int data, length, index;
Steven Cooreman 0:559902e88130 780 uint16_t bitfield;
Steven Cooreman 0:559902e88130 781 uint32_t com, bit;
Steven Cooreman 0:559902e88130 782 int i;
Steven Cooreman 0:559902e88130 783
Steven Cooreman 0:559902e88130 784 length = strlen(string);
Steven Cooreman 0:559902e88130 785 index = 0;
Steven Cooreman 0:559902e88130 786
Steven Cooreman 0:559902e88130 787 /* If an update is in progress we must block, or there might be tearing */
Steven Cooreman 0:559902e88130 788 LCD_SyncBusyDelay(0xFFFFFFFF);
Steven Cooreman 0:559902e88130 789
Steven Cooreman 0:559902e88130 790 /* Freeze LCD to avoid partial updates */
Steven Cooreman 0:559902e88130 791 LCD_FreezeEnable(true);
Steven Cooreman 0:559902e88130 792
Steven Cooreman 0:559902e88130 793 /* Turn all segments off */
Steven Cooreman 0:559902e88130 794 SegmentLCD_AlphaNumberOff();
Steven Cooreman 0:559902e88130 795
Steven Cooreman 0:559902e88130 796 /* Fill out all characters on display */
Steven Cooreman 0:559902e88130 797 for (index = 0; index < 7; index++)
Steven Cooreman 0:559902e88130 798 {
Steven Cooreman 0:559902e88130 799 if (index < length)
Steven Cooreman 0:559902e88130 800 {
Steven Cooreman 0:559902e88130 801 data = (int) *string;
Steven Cooreman 0:559902e88130 802 }
Steven Cooreman 0:559902e88130 803 else /* Padding with space */
Steven Cooreman 0:559902e88130 804 {
Steven Cooreman 0:559902e88130 805 data = 0x20; /* SPACE */
Steven Cooreman 0:559902e88130 806 }
Steven Cooreman 0:559902e88130 807 /* Defined letters currently starts at "SPACE" - ASCII 0x20; */
Steven Cooreman 0:559902e88130 808 data = data - 0x20;
Steven Cooreman 0:559902e88130 809 /* Get font for this letter */
Steven Cooreman 0:559902e88130 810 bitfield = EFM_Alphabet[data];
Steven Cooreman 0:559902e88130 811
Steven Cooreman 0:559902e88130 812 for (i = 0; i < 14; i++)
Steven Cooreman 0:559902e88130 813 {
Steven Cooreman 0:559902e88130 814 bit = EFM_Display.Text[index].bit[i];
Steven Cooreman 0:559902e88130 815 com = EFM_Display.Text[index].com[i];
Steven Cooreman 0:559902e88130 816
Steven Cooreman 0:559902e88130 817 if (bitfield & (1 << i))
Steven Cooreman 0:559902e88130 818 {
Steven Cooreman 0:559902e88130 819 /* Turn on segment */
Steven Cooreman 0:559902e88130 820 LCD_SegmentSet(com, bit, true);
Steven Cooreman 0:559902e88130 821 }
Steven Cooreman 0:559902e88130 822 }
Steven Cooreman 0:559902e88130 823 string++;
Steven Cooreman 0:559902e88130 824 }
Steven Cooreman 0:559902e88130 825 /* Enable update */
Steven Cooreman 0:559902e88130 826 LCD_FreezeEnable(false);
Steven Cooreman 0:559902e88130 827 }