To avoid the LOW_FREQUENCY_VALUE issue. Change the 32768 direct value as for it.

Fork of EFM32_SegmentLCD by Silicon Labs

Committer:
ura_pooh
Date:
Wed Dec 14 10:28:25 2016 +0000
Revision:
7:10a37bbb0698
Parent:
0:559902e88130
LOW FREQUENCY VALUE was not founded. So I changed to modify 32768  as the value.

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. */
ura_pooh 7:10a37bbb0698 418 uint32_t prescaler = (32768 / 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 }