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.
segmentlcd.c@6:114aa75da77b, 2015-05-04 (annotated)
- 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?
User | Revision | Line number | New 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 | } |