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