To avoid the LOW_FREQUENCY_VALUE issue. Change the 32768 direct value as for it.
Fork of EFM32_SegmentLCD by
segmentlcd.c@0:559902e88130, 2015-03-17 (annotated)
- Committer:
- Steven Cooreman
- Date:
- Tue Mar 17 11:45:46 2015 -0500
- Revision:
- 0:559902e88130
- Child:
- 7:10a37bbb0698
Initial commit
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 | } |