Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of mbed-dev by
targets/TARGET_Silicon_Labs/TARGET_EFM32/emlib/src/em_lcd.c@162:16168a1438f3, 2017-04-08 (annotated)
- Committer:
- funshine
- Date:
- Sat Apr 08 17:03:55 2017 +0000
- Revision:
- 162:16168a1438f3
- Parent:
- 161:2cc1468da177
add code to handle serial port rx error in uart_irq()
Who changed what in which revision?
| User | Revision | Line number | New contents of line | 
|---|---|---|---|
| <> | 144:ef7eb2e8f9f7 | 1 | /***************************************************************************//** | 
| <> | 144:ef7eb2e8f9f7 | 2 | * @file em_lcd.c | 
| <> | 144:ef7eb2e8f9f7 | 3 | * @brief Liquid Crystal Display (LCD) Peripheral API | 
| <> | 161:2cc1468da177 | 4 | * @version 5.1.2 | 
| <> | 144:ef7eb2e8f9f7 | 5 | ******************************************************************************* | 
| <> | 144:ef7eb2e8f9f7 | 6 | * @section License | 
| <> | 150:02e0a0aed4ec | 7 | * <b>Copyright 2016 Silicon Laboratories, Inc. http://www.silabs.com</b> | 
| <> | 144:ef7eb2e8f9f7 | 8 | ******************************************************************************* | 
| <> | 144:ef7eb2e8f9f7 | 9 | * | 
| <> | 144:ef7eb2e8f9f7 | 10 | * Permission is granted to anyone to use this software for any purpose, | 
| <> | 144:ef7eb2e8f9f7 | 11 | * including commercial applications, and to alter it and redistribute it | 
| <> | 144:ef7eb2e8f9f7 | 12 | * freely, subject to the following restrictions: | 
| <> | 144:ef7eb2e8f9f7 | 13 | * | 
| <> | 144:ef7eb2e8f9f7 | 14 | * 1. The origin of this software must not be misrepresented; you must not | 
| <> | 144:ef7eb2e8f9f7 | 15 | * claim that you wrote the original software. | 
| <> | 144:ef7eb2e8f9f7 | 16 | * 2. Altered source versions must be plainly marked as such, and must not be | 
| <> | 144:ef7eb2e8f9f7 | 17 | * misrepresented as being the original software. | 
| <> | 144:ef7eb2e8f9f7 | 18 | * 3. This notice may not be removed or altered from any source distribution. | 
| <> | 144:ef7eb2e8f9f7 | 19 | * | 
| <> | 144:ef7eb2e8f9f7 | 20 | * DISCLAIMER OF WARRANTY/LIMITATION OF REMEDIES: Silicon Labs has no | 
| <> | 144:ef7eb2e8f9f7 | 21 | * obligation to support this Software. Silicon Labs is providing the | 
| <> | 144:ef7eb2e8f9f7 | 22 | * Software "AS IS", with no express or implied warranties of any kind, | 
| <> | 144:ef7eb2e8f9f7 | 23 | * including, but not limited to, any implied warranties of merchantability | 
| <> | 144:ef7eb2e8f9f7 | 24 | * or fitness for any particular purpose or warranties against infringement | 
| <> | 144:ef7eb2e8f9f7 | 25 | * of any proprietary rights of a third party. | 
| <> | 144:ef7eb2e8f9f7 | 26 | * | 
| <> | 144:ef7eb2e8f9f7 | 27 | * Silicon Labs will not be liable for any consequential, incidental, or | 
| <> | 144:ef7eb2e8f9f7 | 28 | * special damages, or any other relief, or for any claim by any third party, | 
| <> | 144:ef7eb2e8f9f7 | 29 | * arising from your use of this Software. | 
| <> | 144:ef7eb2e8f9f7 | 30 | * | 
| <> | 144:ef7eb2e8f9f7 | 31 | ******************************************************************************/ | 
| <> | 144:ef7eb2e8f9f7 | 32 | |
| <> | 144:ef7eb2e8f9f7 | 33 | #include "em_lcd.h" | 
| <> | 144:ef7eb2e8f9f7 | 34 | #if defined(LCD_COUNT) && (LCD_COUNT > 0) | 
| <> | 144:ef7eb2e8f9f7 | 35 | #include "em_assert.h" | 
| <> | 144:ef7eb2e8f9f7 | 36 | #include "em_bus.h" | 
| <> | 144:ef7eb2e8f9f7 | 37 | |
| <> | 144:ef7eb2e8f9f7 | 38 | /***************************************************************************//** | 
| <> | 150:02e0a0aed4ec | 39 | * @addtogroup emlib | 
| <> | 144:ef7eb2e8f9f7 | 40 | * @{ | 
| <> | 144:ef7eb2e8f9f7 | 41 | ******************************************************************************/ | 
| <> | 144:ef7eb2e8f9f7 | 42 | |
| <> | 144:ef7eb2e8f9f7 | 43 | /***************************************************************************//** | 
| <> | 144:ef7eb2e8f9f7 | 44 | * @addtogroup LCD | 
| <> | 144:ef7eb2e8f9f7 | 45 | * @brief Liquid Crystal Display (LCD) Peripheral API | 
| <> | 150:02e0a0aed4ec | 46 | * @details | 
| <> | 150:02e0a0aed4ec | 47 | * This module contains functions to control the LDC peripheral of Silicon | 
| <> | 150:02e0a0aed4ec | 48 | * Labs 32-bit MCUs and SoCs. The LCD driver can drive up to 8x36 segmented | 
| <> | 150:02e0a0aed4ec | 49 | * LCD directly. The animation feature makes it possible to have active | 
| <> | 150:02e0a0aed4ec | 50 | * animations without CPU intervention. | 
| <> | 144:ef7eb2e8f9f7 | 51 | * @{ | 
| <> | 144:ef7eb2e8f9f7 | 52 | ******************************************************************************/ | 
| <> | 144:ef7eb2e8f9f7 | 53 | |
| <> | 144:ef7eb2e8f9f7 | 54 | /***************************************************************************//** | 
| <> | 144:ef7eb2e8f9f7 | 55 | * @brief | 
| <> | 144:ef7eb2e8f9f7 | 56 | * Initalize Liquid Crystal Display (LCD) controller | 
| <> | 144:ef7eb2e8f9f7 | 57 | * | 
| <> | 144:ef7eb2e8f9f7 | 58 | * @details | 
| <> | 144:ef7eb2e8f9f7 | 59 | * This function call will only configure the LCD controller. You must enable | 
| <> | 144:ef7eb2e8f9f7 | 60 | * it afterwards, potentially configuring Frame Control and interrupts first | 
| <> | 144:ef7eb2e8f9f7 | 61 | * according to requirements. | 
| <> | 144:ef7eb2e8f9f7 | 62 | * | 
| <> | 144:ef7eb2e8f9f7 | 63 | * @param[in] lcdInit | 
| <> | 144:ef7eb2e8f9f7 | 64 | * Pointer to initialization structure which configures LCD controller. | 
| <> | 144:ef7eb2e8f9f7 | 65 | * | 
| <> | 144:ef7eb2e8f9f7 | 66 | ******************************************************************************/ | 
| <> | 144:ef7eb2e8f9f7 | 67 | void LCD_Init(const LCD_Init_TypeDef *lcdInit) | 
| <> | 144:ef7eb2e8f9f7 | 68 | { | 
| <> | 144:ef7eb2e8f9f7 | 69 | uint32_t dispCtrl = LCD->DISPCTRL; | 
| <> | 144:ef7eb2e8f9f7 | 70 | |
| <> | 144:ef7eb2e8f9f7 | 71 | EFM_ASSERT(lcdInit != (void *) 0); | 
| <> | 144:ef7eb2e8f9f7 | 72 | |
| <> | 144:ef7eb2e8f9f7 | 73 | /* Disable controller before reconfiguration */ | 
| <> | 144:ef7eb2e8f9f7 | 74 | LCD_Enable(false); | 
| <> | 144:ef7eb2e8f9f7 | 75 | |
| <> | 144:ef7eb2e8f9f7 | 76 | /* Make sure we don't touch other bit fields (i.e. voltage boost) */ | 
| <> | 144:ef7eb2e8f9f7 | 77 | dispCtrl &= ~(0 | 
| <> | 144:ef7eb2e8f9f7 | 78 | #if defined(LCD_DISPCTRL_MUXE) | 
| <> | 144:ef7eb2e8f9f7 | 79 | | _LCD_DISPCTRL_MUXE_MASK | 
| <> | 144:ef7eb2e8f9f7 | 80 | #endif | 
| <> | 144:ef7eb2e8f9f7 | 81 | | _LCD_DISPCTRL_MUX_MASK | 
| <> | 144:ef7eb2e8f9f7 | 82 | | _LCD_DISPCTRL_BIAS_MASK | 
| <> | 144:ef7eb2e8f9f7 | 83 | | _LCD_DISPCTRL_WAVE_MASK | 
| <> | 144:ef7eb2e8f9f7 | 84 | | _LCD_DISPCTRL_VLCDSEL_MASK | 
| <> | 144:ef7eb2e8f9f7 | 85 | | _LCD_DISPCTRL_CONCONF_MASK); | 
| <> | 144:ef7eb2e8f9f7 | 86 | |
| <> | 144:ef7eb2e8f9f7 | 87 | /* Configure controller according to initialization structure */ | 
| <> | 144:ef7eb2e8f9f7 | 88 | dispCtrl |= lcdInit->mux; /* also configures MUXE */ | 
| <> | 144:ef7eb2e8f9f7 | 89 | dispCtrl |= lcdInit->bias; | 
| <> | 144:ef7eb2e8f9f7 | 90 | dispCtrl |= lcdInit->wave; | 
| <> | 144:ef7eb2e8f9f7 | 91 | dispCtrl |= lcdInit->vlcd; | 
| <> | 144:ef7eb2e8f9f7 | 92 | dispCtrl |= lcdInit->contrast; | 
| <> | 144:ef7eb2e8f9f7 | 93 | |
| <> | 144:ef7eb2e8f9f7 | 94 | /* Update display controller */ | 
| <> | 144:ef7eb2e8f9f7 | 95 | LCD->DISPCTRL = dispCtrl; | 
| <> | 144:ef7eb2e8f9f7 | 96 | |
| <> | 144:ef7eb2e8f9f7 | 97 | /* Enable controller if wanted */ | 
| <> | 144:ef7eb2e8f9f7 | 98 | if (lcdInit->enable) | 
| <> | 144:ef7eb2e8f9f7 | 99 | { | 
| <> | 144:ef7eb2e8f9f7 | 100 | LCD_Enable(true); | 
| <> | 144:ef7eb2e8f9f7 | 101 | } | 
| <> | 144:ef7eb2e8f9f7 | 102 | } | 
| <> | 144:ef7eb2e8f9f7 | 103 | |
| <> | 144:ef7eb2e8f9f7 | 104 | |
| <> | 144:ef7eb2e8f9f7 | 105 | /***************************************************************************//** | 
| <> | 144:ef7eb2e8f9f7 | 106 | * @brief | 
| <> | 144:ef7eb2e8f9f7 | 107 | * Select source for VLCD | 
| <> | 144:ef7eb2e8f9f7 | 108 | * | 
| <> | 144:ef7eb2e8f9f7 | 109 | * @param[in] vlcd | 
| <> | 144:ef7eb2e8f9f7 | 110 | * Select source for VLD voltage | 
| <> | 144:ef7eb2e8f9f7 | 111 | ******************************************************************************/ | 
| <> | 144:ef7eb2e8f9f7 | 112 | void LCD_VLCDSelect(LCD_VLCDSel_TypeDef vlcd) | 
| <> | 144:ef7eb2e8f9f7 | 113 | { | 
| <> | 144:ef7eb2e8f9f7 | 114 | uint32_t dispctrl = LCD->DISPCTRL; | 
| <> | 144:ef7eb2e8f9f7 | 115 | |
| <> | 144:ef7eb2e8f9f7 | 116 | /* Select VEXT or VDD */ | 
| <> | 144:ef7eb2e8f9f7 | 117 | dispctrl &= ~_LCD_DISPCTRL_VLCDSEL_MASK; | 
| <> | 144:ef7eb2e8f9f7 | 118 | switch (vlcd) | 
| <> | 144:ef7eb2e8f9f7 | 119 | { | 
| <> | 144:ef7eb2e8f9f7 | 120 | case lcdVLCDSelVExtBoost: | 
| <> | 144:ef7eb2e8f9f7 | 121 | dispctrl |= LCD_DISPCTRL_VLCDSEL_VEXTBOOST; | 
| <> | 144:ef7eb2e8f9f7 | 122 | break; | 
| <> | 144:ef7eb2e8f9f7 | 123 | case lcdVLCDSelVDD: | 
| <> | 144:ef7eb2e8f9f7 | 124 | dispctrl |= LCD_DISPCTRL_VLCDSEL_VDD; | 
| <> | 144:ef7eb2e8f9f7 | 125 | break; | 
| <> | 144:ef7eb2e8f9f7 | 126 | default: | 
| <> | 144:ef7eb2e8f9f7 | 127 | break; | 
| <> | 144:ef7eb2e8f9f7 | 128 | } | 
| <> | 144:ef7eb2e8f9f7 | 129 | |
| <> | 144:ef7eb2e8f9f7 | 130 | LCD->DISPCTRL = dispctrl; | 
| <> | 144:ef7eb2e8f9f7 | 131 | } | 
| <> | 144:ef7eb2e8f9f7 | 132 | |
| <> | 144:ef7eb2e8f9f7 | 133 | |
| <> | 144:ef7eb2e8f9f7 | 134 | /***************************************************************************//** | 
| <> | 144:ef7eb2e8f9f7 | 135 | * @brief | 
| <> | 144:ef7eb2e8f9f7 | 136 | * Configure Update Control | 
| <> | 144:ef7eb2e8f9f7 | 137 | * | 
| <> | 144:ef7eb2e8f9f7 | 138 | * @param[in] ud | 
| <> | 144:ef7eb2e8f9f7 | 139 | * Configures LCD update method | 
| <> | 144:ef7eb2e8f9f7 | 140 | ******************************************************************************/ | 
| <> | 144:ef7eb2e8f9f7 | 141 | void LCD_UpdateCtrl(LCD_UpdateCtrl_TypeDef ud) | 
| <> | 144:ef7eb2e8f9f7 | 142 | { | 
| <> | 144:ef7eb2e8f9f7 | 143 | LCD->CTRL = (LCD->CTRL & ~_LCD_CTRL_UDCTRL_MASK) | ud; | 
| <> | 144:ef7eb2e8f9f7 | 144 | } | 
| <> | 144:ef7eb2e8f9f7 | 145 | |
| <> | 144:ef7eb2e8f9f7 | 146 | |
| <> | 144:ef7eb2e8f9f7 | 147 | /***************************************************************************//** | 
| <> | 144:ef7eb2e8f9f7 | 148 | * @brief | 
| <> | 144:ef7eb2e8f9f7 | 149 | * Initialize LCD Frame Counter | 
| <> | 144:ef7eb2e8f9f7 | 150 | * | 
| <> | 144:ef7eb2e8f9f7 | 151 | * @param[in] fcInit | 
| <> | 144:ef7eb2e8f9f7 | 152 | * Pointer to Frame Counter initialization structure | 
| <> | 144:ef7eb2e8f9f7 | 153 | ******************************************************************************/ | 
| <> | 144:ef7eb2e8f9f7 | 154 | void LCD_FrameCountInit(const LCD_FrameCountInit_TypeDef *fcInit) | 
| <> | 144:ef7eb2e8f9f7 | 155 | { | 
| <> | 144:ef7eb2e8f9f7 | 156 | uint32_t bactrl = LCD->BACTRL; | 
| <> | 144:ef7eb2e8f9f7 | 157 | |
| <> | 144:ef7eb2e8f9f7 | 158 | EFM_ASSERT(fcInit != (void *) 0); | 
| <> | 144:ef7eb2e8f9f7 | 159 | |
| <> | 144:ef7eb2e8f9f7 | 160 | /* Verify FC Top Counter to be within limits */ | 
| <> | 144:ef7eb2e8f9f7 | 161 | EFM_ASSERT(fcInit->top < 64); | 
| <> | 144:ef7eb2e8f9f7 | 162 | |
| <> | 144:ef7eb2e8f9f7 | 163 | /* Reconfigure frame count configuration */ | 
| <> | 144:ef7eb2e8f9f7 | 164 | bactrl &= ~(_LCD_BACTRL_FCTOP_MASK | 
| <> | 144:ef7eb2e8f9f7 | 165 | | _LCD_BACTRL_FCPRESC_MASK); | 
| <> | 144:ef7eb2e8f9f7 | 166 | bactrl |= (fcInit->top << _LCD_BACTRL_FCTOP_SHIFT); | 
| <> | 144:ef7eb2e8f9f7 | 167 | bactrl |= fcInit->prescale; | 
| <> | 144:ef7eb2e8f9f7 | 168 | |
| <> | 144:ef7eb2e8f9f7 | 169 | /* Set Blink and Animation Control Register */ | 
| <> | 144:ef7eb2e8f9f7 | 170 | LCD->BACTRL = bactrl; | 
| <> | 144:ef7eb2e8f9f7 | 171 | |
| <> | 144:ef7eb2e8f9f7 | 172 | LCD_FrameCountEnable(fcInit->enable); | 
| <> | 144:ef7eb2e8f9f7 | 173 | } | 
| <> | 144:ef7eb2e8f9f7 | 174 | |
| <> | 144:ef7eb2e8f9f7 | 175 | |
| <> | 144:ef7eb2e8f9f7 | 176 | /***************************************************************************//** | 
| <> | 144:ef7eb2e8f9f7 | 177 | * @brief | 
| <> | 144:ef7eb2e8f9f7 | 178 | * Configures LCD controller Animation feature | 
| <> | 144:ef7eb2e8f9f7 | 179 | * | 
| <> | 144:ef7eb2e8f9f7 | 180 | * @param[in] animInit | 
| <> | 144:ef7eb2e8f9f7 | 181 | * Pointer to LCD Animation initialization structure | 
| <> | 144:ef7eb2e8f9f7 | 182 | ******************************************************************************/ | 
| <> | 144:ef7eb2e8f9f7 | 183 | void LCD_AnimInit(const LCD_AnimInit_TypeDef *animInit) | 
| <> | 144:ef7eb2e8f9f7 | 184 | { | 
| <> | 144:ef7eb2e8f9f7 | 185 | uint32_t bactrl = LCD->BACTRL; | 
| <> | 144:ef7eb2e8f9f7 | 186 | |
| <> | 144:ef7eb2e8f9f7 | 187 | EFM_ASSERT(animInit != (void *) 0); | 
| <> | 144:ef7eb2e8f9f7 | 188 | |
| <> | 144:ef7eb2e8f9f7 | 189 | /* Set Animation Register Values */ | 
| <> | 144:ef7eb2e8f9f7 | 190 | LCD->AREGA = animInit->AReg; | 
| <> | 144:ef7eb2e8f9f7 | 191 | LCD->AREGB = animInit->BReg; | 
| <> | 144:ef7eb2e8f9f7 | 192 | |
| <> | 144:ef7eb2e8f9f7 | 193 | /* Configure Animation Shift and Logic */ | 
| <> | 144:ef7eb2e8f9f7 | 194 | bactrl &= ~(_LCD_BACTRL_AREGASC_MASK | 
| <> | 144:ef7eb2e8f9f7 | 195 | | _LCD_BACTRL_AREGBSC_MASK | 
| <> | 144:ef7eb2e8f9f7 | 196 | | _LCD_BACTRL_ALOGSEL_MASK); | 
| <> | 144:ef7eb2e8f9f7 | 197 | |
| <> | 144:ef7eb2e8f9f7 | 198 | bactrl |= (animInit->AShift << _LCD_BACTRL_AREGASC_SHIFT); | 
| <> | 144:ef7eb2e8f9f7 | 199 | bactrl |= (animInit->BShift << _LCD_BACTRL_AREGBSC_SHIFT); | 
| <> | 144:ef7eb2e8f9f7 | 200 | bactrl |= animInit->animLogic; | 
| <> | 144:ef7eb2e8f9f7 | 201 | |
| <> | 144:ef7eb2e8f9f7 | 202 | #if defined(LCD_BACTRL_ALOC) | 
| <> | 144:ef7eb2e8f9f7 | 203 | bactrl &= ~(_LCD_BACTRL_ALOC_MASK); | 
| <> | 144:ef7eb2e8f9f7 | 204 | |
| <> | 144:ef7eb2e8f9f7 | 205 | if(animInit->startSeg == 0) | 
| <> | 144:ef7eb2e8f9f7 | 206 | { | 
| <> | 144:ef7eb2e8f9f7 | 207 | bactrl |= LCD_BACTRL_ALOC_SEG0TO7; | 
| <> | 144:ef7eb2e8f9f7 | 208 | } | 
| <> | 144:ef7eb2e8f9f7 | 209 | else if(animInit->startSeg == 8) | 
| <> | 144:ef7eb2e8f9f7 | 210 | { | 
| <> | 144:ef7eb2e8f9f7 | 211 | bactrl |= LCD_BACTRL_ALOC_SEG8TO15; | 
| <> | 144:ef7eb2e8f9f7 | 212 | } | 
| <> | 144:ef7eb2e8f9f7 | 213 | #endif | 
| <> | 144:ef7eb2e8f9f7 | 214 | |
| <> | 144:ef7eb2e8f9f7 | 215 | /* Reconfigure */ | 
| <> | 144:ef7eb2e8f9f7 | 216 | LCD->BACTRL = bactrl; | 
| <> | 144:ef7eb2e8f9f7 | 217 | |
| <> | 144:ef7eb2e8f9f7 | 218 | /* Enable */ | 
| <> | 144:ef7eb2e8f9f7 | 219 | LCD_AnimEnable(animInit->enable); | 
| <> | 144:ef7eb2e8f9f7 | 220 | } | 
| <> | 144:ef7eb2e8f9f7 | 221 | |
| <> | 144:ef7eb2e8f9f7 | 222 | |
| <> | 144:ef7eb2e8f9f7 | 223 | /***************************************************************************//** | 
| <> | 144:ef7eb2e8f9f7 | 224 | * @brief | 
| <> | 144:ef7eb2e8f9f7 | 225 | * Enables update of this range of LCD segment lines | 
| <> | 144:ef7eb2e8f9f7 | 226 | * | 
| <> | 144:ef7eb2e8f9f7 | 227 | * @param[in] segmentRange | 
| <> | 144:ef7eb2e8f9f7 | 228 | * Range of 4 LCD segments lines to enable or disable, for all enabled COM | 
| <> | 144:ef7eb2e8f9f7 | 229 | * lines | 
| <> | 144:ef7eb2e8f9f7 | 230 | * | 
| <> | 144:ef7eb2e8f9f7 | 231 | * @param[in] enable | 
| <> | 144:ef7eb2e8f9f7 | 232 | * Bool true to enable segment updates, false to disable updates | 
| <> | 144:ef7eb2e8f9f7 | 233 | ******************************************************************************/ | 
| <> | 144:ef7eb2e8f9f7 | 234 | void LCD_SegmentRangeEnable(LCD_SegmentRange_TypeDef segmentRange, bool enable) | 
| <> | 144:ef7eb2e8f9f7 | 235 | { | 
| <> | 144:ef7eb2e8f9f7 | 236 | if (enable) | 
| <> | 144:ef7eb2e8f9f7 | 237 | { | 
| <> | 144:ef7eb2e8f9f7 | 238 | LCD->SEGEN |= segmentRange; | 
| <> | 144:ef7eb2e8f9f7 | 239 | } | 
| <> | 144:ef7eb2e8f9f7 | 240 | else | 
| <> | 144:ef7eb2e8f9f7 | 241 | { | 
| <> | 144:ef7eb2e8f9f7 | 242 | LCD->SEGEN &= ~((uint32_t)segmentRange); | 
| <> | 144:ef7eb2e8f9f7 | 243 | } | 
| <> | 144:ef7eb2e8f9f7 | 244 | } | 
| <> | 144:ef7eb2e8f9f7 | 245 | |
| <> | 144:ef7eb2e8f9f7 | 246 | |
| <> | 144:ef7eb2e8f9f7 | 247 | /***************************************************************************//** | 
| <> | 144:ef7eb2e8f9f7 | 248 | * @brief | 
| <> | 144:ef7eb2e8f9f7 | 249 | * Turn on or clear a segment | 
| <> | 144:ef7eb2e8f9f7 | 250 | * | 
| <> | 144:ef7eb2e8f9f7 | 251 | * @note | 
| <> | 144:ef7eb2e8f9f7 | 252 | * On Gecko Family, max configuration is (COM-lines x Segment-Lines) 4x40 | 
| <> | 144:ef7eb2e8f9f7 | 253 | * On Tiny Family, max configuration is 8x20 or 4x24 | 
| <> | 144:ef7eb2e8f9f7 | 254 | * On Giant Family, max configuration is 8x36 or 4x40 | 
| <> | 144:ef7eb2e8f9f7 | 255 | * | 
| <> | 144:ef7eb2e8f9f7 | 256 | * @param[in] com | 
| <> | 144:ef7eb2e8f9f7 | 257 | * COM line to change | 
| <> | 144:ef7eb2e8f9f7 | 258 | * | 
| <> | 144:ef7eb2e8f9f7 | 259 | * @param[in] bit | 
| <> | 144:ef7eb2e8f9f7 | 260 | * Bit index of which field to change | 
| <> | 144:ef7eb2e8f9f7 | 261 | * | 
| <> | 144:ef7eb2e8f9f7 | 262 | * @param[in] enable | 
| <> | 144:ef7eb2e8f9f7 | 263 | * When true will set segment, when false will clear segment | 
| <> | 144:ef7eb2e8f9f7 | 264 | ******************************************************************************/ | 
| <> | 144:ef7eb2e8f9f7 | 265 | void LCD_SegmentSet(int com, int bit, bool enable) | 
| <> | 144:ef7eb2e8f9f7 | 266 | { | 
| <> | 144:ef7eb2e8f9f7 | 267 | #if defined(_LCD_SEGD7L_MASK) | 
| <> | 144:ef7eb2e8f9f7 | 268 | /* Tiny and Giant Family supports up to 8 COM lines */ | 
| <> | 144:ef7eb2e8f9f7 | 269 | EFM_ASSERT(com < 8); | 
| <> | 144:ef7eb2e8f9f7 | 270 | #else | 
| <> | 144:ef7eb2e8f9f7 | 271 | /* Gecko Family supports up to 4 COM lines */ | 
| <> | 144:ef7eb2e8f9f7 | 272 | EFM_ASSERT(com < 4); | 
| <> | 144:ef7eb2e8f9f7 | 273 | #endif | 
| <> | 144:ef7eb2e8f9f7 | 274 | |
| <> | 144:ef7eb2e8f9f7 | 275 | #if defined(_LCD_SEGD0H_MASK) | 
| <> | 144:ef7eb2e8f9f7 | 276 | EFM_ASSERT(bit < 40); | 
| <> | 144:ef7eb2e8f9f7 | 277 | #else | 
| <> | 144:ef7eb2e8f9f7 | 278 | /* Tiny Gecko Family supports only "low" segment registers */ | 
| <> | 144:ef7eb2e8f9f7 | 279 | EFM_ASSERT(bit < 32); | 
| <> | 144:ef7eb2e8f9f7 | 280 | #endif | 
| <> | 144:ef7eb2e8f9f7 | 281 | |
| <> | 144:ef7eb2e8f9f7 | 282 | /* Use bitband access for atomic bit set/clear of segment */ | 
| <> | 144:ef7eb2e8f9f7 | 283 | switch (com) | 
| <> | 144:ef7eb2e8f9f7 | 284 | { | 
| <> | 144:ef7eb2e8f9f7 | 285 | case 0: | 
| <> | 144:ef7eb2e8f9f7 | 286 | if (bit < 32) | 
| <> | 144:ef7eb2e8f9f7 | 287 | { | 
| <> | 144:ef7eb2e8f9f7 | 288 | BUS_RegBitWrite(&(LCD->SEGD0L), bit, enable); | 
| <> | 144:ef7eb2e8f9f7 | 289 | } | 
| <> | 144:ef7eb2e8f9f7 | 290 | #if defined(_LCD_SEGD0H_MASK) | 
| <> | 144:ef7eb2e8f9f7 | 291 | else | 
| <> | 144:ef7eb2e8f9f7 | 292 | { | 
| <> | 144:ef7eb2e8f9f7 | 293 | bit -= 32; | 
| <> | 144:ef7eb2e8f9f7 | 294 | BUS_RegBitWrite(&(LCD->SEGD0H), bit, enable); | 
| <> | 144:ef7eb2e8f9f7 | 295 | } | 
| <> | 144:ef7eb2e8f9f7 | 296 | #endif | 
| <> | 144:ef7eb2e8f9f7 | 297 | break; | 
| <> | 144:ef7eb2e8f9f7 | 298 | case 1: | 
| <> | 144:ef7eb2e8f9f7 | 299 | if (bit < 32) | 
| <> | 144:ef7eb2e8f9f7 | 300 | { | 
| <> | 144:ef7eb2e8f9f7 | 301 | BUS_RegBitWrite(&(LCD->SEGD1L), bit, enable); | 
| <> | 144:ef7eb2e8f9f7 | 302 | } | 
| <> | 144:ef7eb2e8f9f7 | 303 | #if defined(_LCD_SEGD1H_MASK) | 
| <> | 144:ef7eb2e8f9f7 | 304 | else | 
| <> | 144:ef7eb2e8f9f7 | 305 | { | 
| <> | 144:ef7eb2e8f9f7 | 306 | bit -= 32; | 
| <> | 144:ef7eb2e8f9f7 | 307 | BUS_RegBitWrite(&(LCD->SEGD1H), bit, enable); | 
| <> | 144:ef7eb2e8f9f7 | 308 | } | 
| <> | 144:ef7eb2e8f9f7 | 309 | #endif | 
| <> | 144:ef7eb2e8f9f7 | 310 | break; | 
| <> | 144:ef7eb2e8f9f7 | 311 | case 2: | 
| <> | 144:ef7eb2e8f9f7 | 312 | if (bit < 32) | 
| <> | 144:ef7eb2e8f9f7 | 313 | { | 
| <> | 144:ef7eb2e8f9f7 | 314 | BUS_RegBitWrite(&(LCD->SEGD2L), bit, enable); | 
| <> | 144:ef7eb2e8f9f7 | 315 | } | 
| <> | 144:ef7eb2e8f9f7 | 316 | #if defined(_LCD_SEGD2H_MASK) | 
| <> | 144:ef7eb2e8f9f7 | 317 | else | 
| <> | 144:ef7eb2e8f9f7 | 318 | { | 
| <> | 144:ef7eb2e8f9f7 | 319 | bit -= 32; | 
| <> | 144:ef7eb2e8f9f7 | 320 | BUS_RegBitWrite(&(LCD->SEGD2H), bit, enable); | 
| <> | 144:ef7eb2e8f9f7 | 321 | } | 
| <> | 144:ef7eb2e8f9f7 | 322 | #endif | 
| <> | 144:ef7eb2e8f9f7 | 323 | break; | 
| <> | 144:ef7eb2e8f9f7 | 324 | case 3: | 
| <> | 144:ef7eb2e8f9f7 | 325 | if (bit < 32) | 
| <> | 144:ef7eb2e8f9f7 | 326 | { | 
| <> | 144:ef7eb2e8f9f7 | 327 | BUS_RegBitWrite(&(LCD->SEGD3L), bit, enable); | 
| <> | 144:ef7eb2e8f9f7 | 328 | } | 
| <> | 144:ef7eb2e8f9f7 | 329 | #if defined(_LCD_SEGD3H_MASK) | 
| <> | 144:ef7eb2e8f9f7 | 330 | else | 
| <> | 144:ef7eb2e8f9f7 | 331 | { | 
| <> | 144:ef7eb2e8f9f7 | 332 | bit -= 32; | 
| <> | 144:ef7eb2e8f9f7 | 333 | BUS_RegBitWrite(&(LCD->SEGD3H), bit, enable); | 
| <> | 144:ef7eb2e8f9f7 | 334 | } | 
| <> | 144:ef7eb2e8f9f7 | 335 | #endif | 
| <> | 144:ef7eb2e8f9f7 | 336 | break; | 
| <> | 144:ef7eb2e8f9f7 | 337 | #if defined(_LCD_SEGD4L_MASK) | 
| <> | 144:ef7eb2e8f9f7 | 338 | case 4: | 
| <> | 144:ef7eb2e8f9f7 | 339 | if (bit < 32) | 
| <> | 144:ef7eb2e8f9f7 | 340 | { | 
| <> | 144:ef7eb2e8f9f7 | 341 | BUS_RegBitWrite(&(LCD->SEGD4L), bit, enable); | 
| <> | 144:ef7eb2e8f9f7 | 342 | } | 
| <> | 144:ef7eb2e8f9f7 | 343 | #if defined(_LCD_SEGD4H_MASK) | 
| <> | 144:ef7eb2e8f9f7 | 344 | else | 
| <> | 144:ef7eb2e8f9f7 | 345 | { | 
| <> | 144:ef7eb2e8f9f7 | 346 | bit -= 32; | 
| <> | 144:ef7eb2e8f9f7 | 347 | BUS_RegBitWrite(&(LCD->SEGD4H), bit, enable); | 
| <> | 144:ef7eb2e8f9f7 | 348 | } | 
| <> | 144:ef7eb2e8f9f7 | 349 | #endif | 
| <> | 144:ef7eb2e8f9f7 | 350 | break; | 
| <> | 144:ef7eb2e8f9f7 | 351 | #endif | 
| <> | 144:ef7eb2e8f9f7 | 352 | #if defined(_LCD_SEGD5L_MASK) | 
| <> | 144:ef7eb2e8f9f7 | 353 | case 5: | 
| <> | 144:ef7eb2e8f9f7 | 354 | if (bit < 32) | 
| <> | 144:ef7eb2e8f9f7 | 355 | { | 
| <> | 144:ef7eb2e8f9f7 | 356 | BUS_RegBitWrite(&(LCD->SEGD5L), bit, enable); | 
| <> | 144:ef7eb2e8f9f7 | 357 | } | 
| <> | 144:ef7eb2e8f9f7 | 358 | #if defined(_LCD_SEGD5H_MASK) | 
| <> | 144:ef7eb2e8f9f7 | 359 | else | 
| <> | 144:ef7eb2e8f9f7 | 360 | { | 
| <> | 144:ef7eb2e8f9f7 | 361 | bit -= 32; | 
| <> | 144:ef7eb2e8f9f7 | 362 | BUS_RegBitWrite(&(LCD->SEGD5H), bit, enable); | 
| <> | 144:ef7eb2e8f9f7 | 363 | } | 
| <> | 144:ef7eb2e8f9f7 | 364 | #endif | 
| <> | 144:ef7eb2e8f9f7 | 365 | break; | 
| <> | 144:ef7eb2e8f9f7 | 366 | #endif | 
| <> | 144:ef7eb2e8f9f7 | 367 | case 6: | 
| <> | 144:ef7eb2e8f9f7 | 368 | #if defined(_LCD_SEGD6L_MASK) | 
| <> | 144:ef7eb2e8f9f7 | 369 | if (bit < 32) | 
| <> | 144:ef7eb2e8f9f7 | 370 | { | 
| <> | 144:ef7eb2e8f9f7 | 371 | BUS_RegBitWrite(&(LCD->SEGD6L), bit, enable); | 
| <> | 144:ef7eb2e8f9f7 | 372 | } | 
| <> | 144:ef7eb2e8f9f7 | 373 | #if defined(_LCD_SEGD6H_MASK) | 
| <> | 144:ef7eb2e8f9f7 | 374 | else | 
| <> | 144:ef7eb2e8f9f7 | 375 | { | 
| <> | 144:ef7eb2e8f9f7 | 376 | bit -= 32; | 
| <> | 144:ef7eb2e8f9f7 | 377 | BUS_RegBitWrite(&(LCD->SEGD6H), bit, enable); | 
| <> | 144:ef7eb2e8f9f7 | 378 | } | 
| <> | 144:ef7eb2e8f9f7 | 379 | #endif | 
| <> | 144:ef7eb2e8f9f7 | 380 | break; | 
| <> | 144:ef7eb2e8f9f7 | 381 | #endif | 
| <> | 144:ef7eb2e8f9f7 | 382 | #if defined(_LCD_SEGD7L_MASK) | 
| <> | 144:ef7eb2e8f9f7 | 383 | case 7: | 
| <> | 144:ef7eb2e8f9f7 | 384 | if (bit < 32) | 
| <> | 144:ef7eb2e8f9f7 | 385 | { | 
| <> | 144:ef7eb2e8f9f7 | 386 | BUS_RegBitWrite(&(LCD->SEGD7L), bit, enable); | 
| <> | 144:ef7eb2e8f9f7 | 387 | } | 
| <> | 144:ef7eb2e8f9f7 | 388 | #if defined(_LCD_SEGD7H_MASK) | 
| <> | 144:ef7eb2e8f9f7 | 389 | else | 
| <> | 144:ef7eb2e8f9f7 | 390 | { | 
| <> | 144:ef7eb2e8f9f7 | 391 | bit -= 32; | 
| <> | 144:ef7eb2e8f9f7 | 392 | BUS_RegBitWrite(&(LCD->SEGD7H), bit, enable); | 
| <> | 144:ef7eb2e8f9f7 | 393 | } | 
| <> | 144:ef7eb2e8f9f7 | 394 | #endif | 
| <> | 144:ef7eb2e8f9f7 | 395 | break; | 
| <> | 144:ef7eb2e8f9f7 | 396 | #endif | 
| <> | 144:ef7eb2e8f9f7 | 397 | |
| <> | 144:ef7eb2e8f9f7 | 398 | default: | 
| <> | 144:ef7eb2e8f9f7 | 399 | EFM_ASSERT(0); | 
| <> | 144:ef7eb2e8f9f7 | 400 | break; | 
| <> | 144:ef7eb2e8f9f7 | 401 | } | 
| <> | 144:ef7eb2e8f9f7 | 402 | } | 
| <> | 144:ef7eb2e8f9f7 | 403 | |
| <> | 144:ef7eb2e8f9f7 | 404 | |
| <> | 144:ef7eb2e8f9f7 | 405 | /***************************************************************************//** | 
| <> | 144:ef7eb2e8f9f7 | 406 | * @brief | 
| <> | 144:ef7eb2e8f9f7 | 407 | * Updates the 0-31 lowest segments on a given COM-line in one operation, | 
| <> | 144:ef7eb2e8f9f7 | 408 | * according to bit mask | 
| <> | 144:ef7eb2e8f9f7 | 409 | * | 
| <> | 144:ef7eb2e8f9f7 | 410 | * @param[in] com | 
| <> | 144:ef7eb2e8f9f7 | 411 | * Which COM line to update | 
| <> | 144:ef7eb2e8f9f7 | 412 | * | 
| <> | 144:ef7eb2e8f9f7 | 413 | * @param[in] mask | 
| <> | 144:ef7eb2e8f9f7 | 414 | * Bit mask for segments 0-31 | 
| <> | 144:ef7eb2e8f9f7 | 415 | * | 
| <> | 144:ef7eb2e8f9f7 | 416 | * @param[in] bits | 
| <> | 144:ef7eb2e8f9f7 | 417 | * Bit pattern for segments 0-31 | 
| <> | 144:ef7eb2e8f9f7 | 418 | ******************************************************************************/ | 
| <> | 144:ef7eb2e8f9f7 | 419 | void LCD_SegmentSetLow(int com, uint32_t mask, uint32_t bits) | 
| <> | 144:ef7eb2e8f9f7 | 420 | { | 
| <> | 144:ef7eb2e8f9f7 | 421 | uint32_t segData; | 
| <> | 144:ef7eb2e8f9f7 | 422 | |
| <> | 144:ef7eb2e8f9f7 | 423 | /* Maximum number of com lines */ | 
| <> | 144:ef7eb2e8f9f7 | 424 | #if defined(_LCD_SEGD7L_MASK) | 
| <> | 144:ef7eb2e8f9f7 | 425 | EFM_ASSERT(com < 8); | 
| <> | 144:ef7eb2e8f9f7 | 426 | #else | 
| <> | 144:ef7eb2e8f9f7 | 427 | /* Gecko Family supports up to 4 COM lines */ | 
| <> | 144:ef7eb2e8f9f7 | 428 | EFM_ASSERT(com < 4); | 
| <> | 144:ef7eb2e8f9f7 | 429 | #endif | 
| <> | 144:ef7eb2e8f9f7 | 430 | |
| <> | 144:ef7eb2e8f9f7 | 431 | switch (com) | 
| <> | 144:ef7eb2e8f9f7 | 432 | { | 
| <> | 144:ef7eb2e8f9f7 | 433 | case 0: | 
| <> | 144:ef7eb2e8f9f7 | 434 | segData = LCD->SEGD0L; | 
| <> | 144:ef7eb2e8f9f7 | 435 | segData &= ~(mask); | 
| <> | 144:ef7eb2e8f9f7 | 436 | segData |= (mask & bits); | 
| <> | 144:ef7eb2e8f9f7 | 437 | LCD->SEGD0L = segData; | 
| <> | 144:ef7eb2e8f9f7 | 438 | break; | 
| <> | 144:ef7eb2e8f9f7 | 439 | case 1: | 
| <> | 144:ef7eb2e8f9f7 | 440 | segData = LCD->SEGD1L; | 
| <> | 144:ef7eb2e8f9f7 | 441 | segData &= ~(mask); | 
| <> | 144:ef7eb2e8f9f7 | 442 | segData |= (mask & bits); | 
| <> | 144:ef7eb2e8f9f7 | 443 | LCD->SEGD1L = segData; | 
| <> | 144:ef7eb2e8f9f7 | 444 | break; | 
| <> | 144:ef7eb2e8f9f7 | 445 | case 2: | 
| <> | 144:ef7eb2e8f9f7 | 446 | segData = LCD->SEGD2L; | 
| <> | 144:ef7eb2e8f9f7 | 447 | segData &= ~(mask); | 
| <> | 144:ef7eb2e8f9f7 | 448 | segData |= (mask & bits); | 
| <> | 144:ef7eb2e8f9f7 | 449 | LCD->SEGD2L = segData; | 
| <> | 144:ef7eb2e8f9f7 | 450 | break; | 
| <> | 144:ef7eb2e8f9f7 | 451 | case 3: | 
| <> | 144:ef7eb2e8f9f7 | 452 | segData = LCD->SEGD3L; | 
| <> | 144:ef7eb2e8f9f7 | 453 | segData &= ~(mask); | 
| <> | 144:ef7eb2e8f9f7 | 454 | segData |= (mask & bits); | 
| <> | 144:ef7eb2e8f9f7 | 455 | LCD->SEGD3L = segData; | 
| <> | 144:ef7eb2e8f9f7 | 456 | break; | 
| <> | 144:ef7eb2e8f9f7 | 457 | #if defined(_LCD_SEGD4L_MASK) | 
| <> | 144:ef7eb2e8f9f7 | 458 | case 4: | 
| <> | 144:ef7eb2e8f9f7 | 459 | segData = LCD->SEGD4L; | 
| <> | 144:ef7eb2e8f9f7 | 460 | segData &= ~(mask); | 
| <> | 144:ef7eb2e8f9f7 | 461 | segData |= (mask & bits); | 
| <> | 144:ef7eb2e8f9f7 | 462 | LCD->SEGD4L = segData; | 
| <> | 144:ef7eb2e8f9f7 | 463 | break; | 
| <> | 144:ef7eb2e8f9f7 | 464 | #endif | 
| <> | 144:ef7eb2e8f9f7 | 465 | #if defined(_LCD_SEGD5L_MASK) | 
| <> | 144:ef7eb2e8f9f7 | 466 | case 5: | 
| <> | 144:ef7eb2e8f9f7 | 467 | segData = LCD->SEGD5L; | 
| <> | 144:ef7eb2e8f9f7 | 468 | segData &= ~(mask); | 
| <> | 144:ef7eb2e8f9f7 | 469 | segData |= (mask & bits); | 
| <> | 144:ef7eb2e8f9f7 | 470 | LCD->SEGD5L = segData; | 
| <> | 144:ef7eb2e8f9f7 | 471 | break; | 
| <> | 144:ef7eb2e8f9f7 | 472 | #endif | 
| <> | 144:ef7eb2e8f9f7 | 473 | #if defined(_LCD_SEGD6L_MASK) | 
| <> | 144:ef7eb2e8f9f7 | 474 | case 6: | 
| <> | 144:ef7eb2e8f9f7 | 475 | segData = LCD->SEGD6L; | 
| <> | 144:ef7eb2e8f9f7 | 476 | segData &= ~(mask); | 
| <> | 144:ef7eb2e8f9f7 | 477 | segData |= (mask & bits); | 
| <> | 144:ef7eb2e8f9f7 | 478 | LCD->SEGD6L = segData; | 
| <> | 144:ef7eb2e8f9f7 | 479 | break; | 
| <> | 144:ef7eb2e8f9f7 | 480 | #endif | 
| <> | 144:ef7eb2e8f9f7 | 481 | #if defined(_LCD_SEGD7L_MASK) | 
| <> | 144:ef7eb2e8f9f7 | 482 | case 7: | 
| <> | 144:ef7eb2e8f9f7 | 483 | segData = LCD->SEGD7L; | 
| <> | 144:ef7eb2e8f9f7 | 484 | segData &= ~(mask); | 
| <> | 144:ef7eb2e8f9f7 | 485 | segData |= (mask & bits); | 
| <> | 144:ef7eb2e8f9f7 | 486 | LCD->SEGD7L = segData; | 
| <> | 144:ef7eb2e8f9f7 | 487 | break; | 
| <> | 144:ef7eb2e8f9f7 | 488 | #endif | 
| <> | 144:ef7eb2e8f9f7 | 489 | default: | 
| <> | 144:ef7eb2e8f9f7 | 490 | EFM_ASSERT(0); | 
| <> | 144:ef7eb2e8f9f7 | 491 | break; | 
| <> | 144:ef7eb2e8f9f7 | 492 | } | 
| <> | 144:ef7eb2e8f9f7 | 493 | } | 
| <> | 144:ef7eb2e8f9f7 | 494 | |
| <> | 144:ef7eb2e8f9f7 | 495 | |
| <> | 144:ef7eb2e8f9f7 | 496 | #if defined(_LCD_SEGD0H_MASK) | 
| <> | 144:ef7eb2e8f9f7 | 497 | /***************************************************************************//** | 
| <> | 144:ef7eb2e8f9f7 | 498 | * @brief | 
| <> | 144:ef7eb2e8f9f7 | 499 | * Updated the high (32-39) segments on a given COM-line in one operation | 
| <> | 144:ef7eb2e8f9f7 | 500 | * | 
| <> | 144:ef7eb2e8f9f7 | 501 | * @param[in] com | 
| <> | 144:ef7eb2e8f9f7 | 502 | * Which COM line to update | 
| <> | 144:ef7eb2e8f9f7 | 503 | * | 
| <> | 144:ef7eb2e8f9f7 | 504 | * @param[in] mask | 
| <> | 144:ef7eb2e8f9f7 | 505 | * Bit mask for segments 32-39 | 
| <> | 144:ef7eb2e8f9f7 | 506 | * | 
| <> | 144:ef7eb2e8f9f7 | 507 | * @param[in] bits | 
| <> | 144:ef7eb2e8f9f7 | 508 | * Bit pattern for segments 32-39 | 
| <> | 144:ef7eb2e8f9f7 | 509 | ******************************************************************************/ | 
| <> | 144:ef7eb2e8f9f7 | 510 | void LCD_SegmentSetHigh(int com, uint32_t mask, uint32_t bits) | 
| <> | 144:ef7eb2e8f9f7 | 511 | { | 
| <> | 144:ef7eb2e8f9f7 | 512 | uint32_t segData; | 
| <> | 144:ef7eb2e8f9f7 | 513 | |
| <> | 144:ef7eb2e8f9f7 | 514 | #if defined(_LCD_SEGD7H_MASK) | 
| <> | 144:ef7eb2e8f9f7 | 515 | EFM_ASSERT(com < 8); | 
| <> | 144:ef7eb2e8f9f7 | 516 | #else | 
| <> | 144:ef7eb2e8f9f7 | 517 | EFM_ASSERT(com < 4); | 
| <> | 144:ef7eb2e8f9f7 | 518 | #endif | 
| <> | 144:ef7eb2e8f9f7 | 519 | |
| <> | 144:ef7eb2e8f9f7 | 520 | /* Maximum number of com lines */ | 
| <> | 144:ef7eb2e8f9f7 | 521 | switch (com) | 
| <> | 144:ef7eb2e8f9f7 | 522 | { | 
| <> | 144:ef7eb2e8f9f7 | 523 | case 0: | 
| <> | 144:ef7eb2e8f9f7 | 524 | segData = LCD->SEGD0H; | 
| <> | 144:ef7eb2e8f9f7 | 525 | segData &= ~(mask); | 
| <> | 144:ef7eb2e8f9f7 | 526 | segData |= (mask & bits); | 
| <> | 144:ef7eb2e8f9f7 | 527 | LCD->SEGD0H = segData; | 
| <> | 144:ef7eb2e8f9f7 | 528 | break; | 
| <> | 144:ef7eb2e8f9f7 | 529 | case 1: | 
| <> | 144:ef7eb2e8f9f7 | 530 | segData = LCD->SEGD1H; | 
| <> | 144:ef7eb2e8f9f7 | 531 | segData &= ~(mask); | 
| <> | 144:ef7eb2e8f9f7 | 532 | segData |= (mask & bits); | 
| <> | 144:ef7eb2e8f9f7 | 533 | LCD->SEGD1H = segData; | 
| <> | 144:ef7eb2e8f9f7 | 534 | break; | 
| <> | 144:ef7eb2e8f9f7 | 535 | case 2: | 
| <> | 144:ef7eb2e8f9f7 | 536 | segData = LCD->SEGD2H; | 
| <> | 144:ef7eb2e8f9f7 | 537 | segData &= ~(mask); | 
| <> | 144:ef7eb2e8f9f7 | 538 | segData |= (mask & bits); | 
| <> | 144:ef7eb2e8f9f7 | 539 | LCD->SEGD2H = segData; | 
| <> | 144:ef7eb2e8f9f7 | 540 | break; | 
| <> | 144:ef7eb2e8f9f7 | 541 | case 3: | 
| <> | 144:ef7eb2e8f9f7 | 542 | segData = LCD->SEGD3H; | 
| <> | 144:ef7eb2e8f9f7 | 543 | segData &= ~(mask); | 
| <> | 144:ef7eb2e8f9f7 | 544 | segData |= (mask & bits); | 
| <> | 144:ef7eb2e8f9f7 | 545 | LCD->SEGD3H = segData; | 
| <> | 144:ef7eb2e8f9f7 | 546 | break; | 
| <> | 144:ef7eb2e8f9f7 | 547 | #if defined(_LCD_SEGD4H_MASK) | 
| <> | 144:ef7eb2e8f9f7 | 548 | case 4: | 
| <> | 144:ef7eb2e8f9f7 | 549 | segData = LCD->SEGD4H; | 
| <> | 144:ef7eb2e8f9f7 | 550 | segData &= ~(mask); | 
| <> | 144:ef7eb2e8f9f7 | 551 | segData |= (mask & bits); | 
| <> | 144:ef7eb2e8f9f7 | 552 | LCD->SEGD4H = segData; | 
| <> | 144:ef7eb2e8f9f7 | 553 | break; | 
| <> | 144:ef7eb2e8f9f7 | 554 | #endif | 
| <> | 144:ef7eb2e8f9f7 | 555 | #if defined(_LCD_SEGD5H_MASK) | 
| <> | 144:ef7eb2e8f9f7 | 556 | case 5: | 
| <> | 144:ef7eb2e8f9f7 | 557 | segData = LCD->SEGD5H; | 
| <> | 144:ef7eb2e8f9f7 | 558 | segData &= ~(mask); | 
| <> | 144:ef7eb2e8f9f7 | 559 | segData |= (mask & bits); | 
| <> | 144:ef7eb2e8f9f7 | 560 | LCD->SEGD5H = segData; | 
| <> | 144:ef7eb2e8f9f7 | 561 | break; | 
| <> | 144:ef7eb2e8f9f7 | 562 | #endif | 
| <> | 144:ef7eb2e8f9f7 | 563 | #if defined(_LCD_SEGD6H_MASK) | 
| <> | 144:ef7eb2e8f9f7 | 564 | case 6: | 
| <> | 144:ef7eb2e8f9f7 | 565 | segData = LCD->SEGD6H; | 
| <> | 144:ef7eb2e8f9f7 | 566 | segData &= ~(mask); | 
| <> | 144:ef7eb2e8f9f7 | 567 | segData |= (mask & bits); | 
| <> | 144:ef7eb2e8f9f7 | 568 | LCD->SEGD6H = segData; | 
| <> | 144:ef7eb2e8f9f7 | 569 | break; | 
| <> | 144:ef7eb2e8f9f7 | 570 | #endif | 
| <> | 144:ef7eb2e8f9f7 | 571 | #if defined(_LCD_SEGD7H_MASK) | 
| <> | 144:ef7eb2e8f9f7 | 572 | case 7: | 
| <> | 144:ef7eb2e8f9f7 | 573 | segData = LCD->SEGD7H; | 
| <> | 144:ef7eb2e8f9f7 | 574 | segData &= ~(mask); | 
| <> | 144:ef7eb2e8f9f7 | 575 | segData |= (mask & bits); | 
| <> | 144:ef7eb2e8f9f7 | 576 | LCD->SEGD7H = segData; | 
| <> | 144:ef7eb2e8f9f7 | 577 | break; | 
| <> | 144:ef7eb2e8f9f7 | 578 | #endif | 
| <> | 144:ef7eb2e8f9f7 | 579 | default: | 
| <> | 144:ef7eb2e8f9f7 | 580 | break; | 
| <> | 144:ef7eb2e8f9f7 | 581 | } | 
| <> | 144:ef7eb2e8f9f7 | 582 | } | 
| <> | 144:ef7eb2e8f9f7 | 583 | #endif | 
| <> | 144:ef7eb2e8f9f7 | 584 | |
| <> | 144:ef7eb2e8f9f7 | 585 | /***************************************************************************//** | 
| <> | 144:ef7eb2e8f9f7 | 586 | * @brief | 
| <> | 144:ef7eb2e8f9f7 | 587 | * Configure contrast level on LCD panel | 
| <> | 144:ef7eb2e8f9f7 | 588 | * | 
| <> | 144:ef7eb2e8f9f7 | 589 | * @param[in] level | 
| <> | 144:ef7eb2e8f9f7 | 590 | * Contrast level in the range 0-31 | 
| <> | 144:ef7eb2e8f9f7 | 591 | ******************************************************************************/ | 
| <> | 144:ef7eb2e8f9f7 | 592 | void LCD_ContrastSet(int level) | 
| <> | 144:ef7eb2e8f9f7 | 593 | { | 
| <> | 144:ef7eb2e8f9f7 | 594 | EFM_ASSERT(level < 32); | 
| <> | 144:ef7eb2e8f9f7 | 595 | |
| <> | 144:ef7eb2e8f9f7 | 596 | LCD->DISPCTRL = (LCD->DISPCTRL & ~_LCD_DISPCTRL_CONLEV_MASK) | 
| <> | 144:ef7eb2e8f9f7 | 597 | | (level << _LCD_DISPCTRL_CONLEV_SHIFT); | 
| <> | 144:ef7eb2e8f9f7 | 598 | } | 
| <> | 144:ef7eb2e8f9f7 | 599 | |
| <> | 144:ef7eb2e8f9f7 | 600 | |
| <> | 144:ef7eb2e8f9f7 | 601 | /***************************************************************************//** | 
| <> | 144:ef7eb2e8f9f7 | 602 | * @brief | 
| <> | 144:ef7eb2e8f9f7 | 603 | * Configure voltage booster | 
| <> | 144:ef7eb2e8f9f7 | 604 | * | 
| <> | 144:ef7eb2e8f9f7 | 605 | * The resulting voltage level is described in each part number's data sheet | 
| <> | 144:ef7eb2e8f9f7 | 606 | * | 
| <> | 144:ef7eb2e8f9f7 | 607 | * @param[in] vboost | 
| <> | 144:ef7eb2e8f9f7 | 608 | * Voltage boost level | 
| <> | 144:ef7eb2e8f9f7 | 609 | ******************************************************************************/ | 
| <> | 144:ef7eb2e8f9f7 | 610 | void LCD_VBoostSet(LCD_VBoostLevel_TypeDef vboost) | 
| <> | 144:ef7eb2e8f9f7 | 611 | { | 
| <> | 144:ef7eb2e8f9f7 | 612 | /* Reconfigure Voltage Boost */ | 
| <> | 144:ef7eb2e8f9f7 | 613 | LCD->DISPCTRL = (LCD->DISPCTRL & ~_LCD_DISPCTRL_VBLEV_MASK) | vboost; | 
| <> | 144:ef7eb2e8f9f7 | 614 | } | 
| <> | 144:ef7eb2e8f9f7 | 615 | |
| <> | 144:ef7eb2e8f9f7 | 616 | |
| <> | 144:ef7eb2e8f9f7 | 617 | #if defined(LCD_CTRL_DSC) | 
| <> | 144:ef7eb2e8f9f7 | 618 | /***************************************************************************//** | 
| <> | 144:ef7eb2e8f9f7 | 619 | * @brief | 
| <> | 144:ef7eb2e8f9f7 | 620 | * Configure bias level for a specific segment line for Direct Segment Control | 
| <> | 144:ef7eb2e8f9f7 | 621 | * | 
| <> | 144:ef7eb2e8f9f7 | 622 | * @note | 
| <> | 144:ef7eb2e8f9f7 | 623 | * When DSC is active, each configuration takes up 4 bits in the Segment | 
| <> | 144:ef7eb2e8f9f7 | 624 | * Registers (SEGD0L/SEGD1H) which defines bias level. | 
| <> | 144:ef7eb2e8f9f7 | 625 | * For optimal use of this feature, the entire SEGD-registers should be set | 
| <> | 144:ef7eb2e8f9f7 | 626 | * at once in a optimized routine, so this function is mainly here to | 
| <> | 144:ef7eb2e8f9f7 | 627 | * demonstrate how to correctly configure the bias levels, and should be used | 
| <> | 144:ef7eb2e8f9f7 | 628 | * with care. | 
| <> | 144:ef7eb2e8f9f7 | 629 | * | 
| <> | 144:ef7eb2e8f9f7 | 630 | * @param[in] segmentLine | 
| <> | 144:ef7eb2e8f9f7 | 631 | * Segment line number | 
| <> | 144:ef7eb2e8f9f7 | 632 | * | 
| <> | 144:ef7eb2e8f9f7 | 633 | * @param[in] biasLevel | 
| <> | 144:ef7eb2e8f9f7 | 634 | * Bias configuration level, 0-4. This value must be within the constraint | 
| <> | 144:ef7eb2e8f9f7 | 635 | * defined by the LCD_DISPCTRL bias setting, see Reference Manual/Datasheet | 
| <> | 144:ef7eb2e8f9f7 | 636 | ******************************************************************************/ | 
| <> | 144:ef7eb2e8f9f7 | 637 | void LCD_BiasSegmentSet(int segmentLine, int biasLevel) | 
| <> | 144:ef7eb2e8f9f7 | 638 | { | 
| <> | 144:ef7eb2e8f9f7 | 639 | int biasRegister; | 
| <> | 144:ef7eb2e8f9f7 | 640 | int bitShift; | 
| <> | 144:ef7eb2e8f9f7 | 641 | volatile uint32_t *segmentRegister; | 
| <> | 144:ef7eb2e8f9f7 | 642 | |
| <> | 144:ef7eb2e8f9f7 | 643 | #if !defined(_LCD_SEGD0H_MASK) | 
| <> | 144:ef7eb2e8f9f7 | 644 | EFM_ASSERT(segmentLine < 20); | 
| <> | 144:ef7eb2e8f9f7 | 645 | |
| <> | 144:ef7eb2e8f9f7 | 646 | /* Bias config for 8 segment lines per SEGDnL register */ | 
| <> | 144:ef7eb2e8f9f7 | 647 | biasRegister = segmentLine / 8; | 
| <> | 144:ef7eb2e8f9f7 | 648 | bitShift = (segmentLine % 8) * 4; | 
| <> | 144:ef7eb2e8f9f7 | 649 | |
| <> | 144:ef7eb2e8f9f7 | 650 | switch (biasRegister) | 
| <> | 144:ef7eb2e8f9f7 | 651 | { | 
| <> | 144:ef7eb2e8f9f7 | 652 | case 0: | 
| <> | 144:ef7eb2e8f9f7 | 653 | segmentRegister = &LCD->SEGD0L; | 
| <> | 144:ef7eb2e8f9f7 | 654 | break; | 
| <> | 144:ef7eb2e8f9f7 | 655 | case 1: | 
| <> | 144:ef7eb2e8f9f7 | 656 | segmentRegister = &LCD->SEGD1L; | 
| <> | 144:ef7eb2e8f9f7 | 657 | break; | 
| <> | 144:ef7eb2e8f9f7 | 658 | case 2: | 
| <> | 144:ef7eb2e8f9f7 | 659 | segmentRegister = &LCD->SEGD2L; | 
| <> | 144:ef7eb2e8f9f7 | 660 | break; | 
| <> | 144:ef7eb2e8f9f7 | 661 | case 3: | 
| <> | 144:ef7eb2e8f9f7 | 662 | segmentRegister = &LCD->SEGD3L; | 
| <> | 144:ef7eb2e8f9f7 | 663 | break; | 
| <> | 144:ef7eb2e8f9f7 | 664 | default: | 
| <> | 144:ef7eb2e8f9f7 | 665 | segmentRegister = (uint32_t *)0x00000000; | 
| <> | 144:ef7eb2e8f9f7 | 666 | EFM_ASSERT(0); | 
| <> | 144:ef7eb2e8f9f7 | 667 | break; | 
| <> | 144:ef7eb2e8f9f7 | 668 | } | 
| <> | 144:ef7eb2e8f9f7 | 669 | #else | 
| <> | 144:ef7eb2e8f9f7 | 670 | EFM_ASSERT(segmentLine < 40); | 
| <> | 144:ef7eb2e8f9f7 | 671 | |
| <> | 144:ef7eb2e8f9f7 | 672 | /* Bias config for 10 segment lines per SEGDn L+H registers */ | 
| <> | 144:ef7eb2e8f9f7 | 673 | biasRegister = segmentLine / 10; | 
| <> | 144:ef7eb2e8f9f7 | 674 | bitShift = (segmentLine % 10) * 4; | 
| <> | 144:ef7eb2e8f9f7 | 675 | |
| <> | 144:ef7eb2e8f9f7 | 676 | switch (biasRegister) | 
| <> | 144:ef7eb2e8f9f7 | 677 | { | 
| <> | 144:ef7eb2e8f9f7 | 678 | case 0: | 
| <> | 144:ef7eb2e8f9f7 | 679 | if (bitShift < 32) | 
| <> | 144:ef7eb2e8f9f7 | 680 | { | 
| <> | 144:ef7eb2e8f9f7 | 681 | segmentRegister = &LCD->SEGD0L; | 
| <> | 144:ef7eb2e8f9f7 | 682 | } | 
| <> | 144:ef7eb2e8f9f7 | 683 | else | 
| <> | 144:ef7eb2e8f9f7 | 684 | { | 
| <> | 144:ef7eb2e8f9f7 | 685 | segmentRegister = &LCD->SEGD0H; | 
| <> | 144:ef7eb2e8f9f7 | 686 | bitShift -= 32; | 
| <> | 144:ef7eb2e8f9f7 | 687 | } | 
| <> | 144:ef7eb2e8f9f7 | 688 | break; | 
| <> | 144:ef7eb2e8f9f7 | 689 | case 1: | 
| <> | 144:ef7eb2e8f9f7 | 690 | if (bitShift < 32) | 
| <> | 144:ef7eb2e8f9f7 | 691 | { | 
| <> | 144:ef7eb2e8f9f7 | 692 | segmentRegister = &LCD->SEGD1L; | 
| <> | 144:ef7eb2e8f9f7 | 693 | } | 
| <> | 144:ef7eb2e8f9f7 | 694 | else | 
| <> | 144:ef7eb2e8f9f7 | 695 | { | 
| <> | 144:ef7eb2e8f9f7 | 696 | segmentRegister = &LCD->SEGD1H; | 
| <> | 144:ef7eb2e8f9f7 | 697 | bitShift -= 32; | 
| <> | 144:ef7eb2e8f9f7 | 698 | } | 
| <> | 144:ef7eb2e8f9f7 | 699 | break; | 
| <> | 144:ef7eb2e8f9f7 | 700 | case 2: | 
| <> | 144:ef7eb2e8f9f7 | 701 | if (bitShift < 32) | 
| <> | 144:ef7eb2e8f9f7 | 702 | { | 
| <> | 144:ef7eb2e8f9f7 | 703 | segmentRegister = &LCD->SEGD2L; | 
| <> | 144:ef7eb2e8f9f7 | 704 | } | 
| <> | 144:ef7eb2e8f9f7 | 705 | else | 
| <> | 144:ef7eb2e8f9f7 | 706 | { | 
| <> | 144:ef7eb2e8f9f7 | 707 | segmentRegister = &LCD->SEGD1H; | 
| <> | 144:ef7eb2e8f9f7 | 708 | bitShift -= 32; | 
| <> | 144:ef7eb2e8f9f7 | 709 | } | 
| <> | 144:ef7eb2e8f9f7 | 710 | break; | 
| <> | 144:ef7eb2e8f9f7 | 711 | case 3: | 
| <> | 144:ef7eb2e8f9f7 | 712 | if (bitShift < 32) | 
| <> | 144:ef7eb2e8f9f7 | 713 | { | 
| <> | 144:ef7eb2e8f9f7 | 714 | segmentRegister = &LCD->SEGD3L; | 
| <> | 144:ef7eb2e8f9f7 | 715 | } | 
| <> | 144:ef7eb2e8f9f7 | 716 | else | 
| <> | 144:ef7eb2e8f9f7 | 717 | { | 
| <> | 144:ef7eb2e8f9f7 | 718 | segmentRegister = &LCD->SEGD3H; | 
| <> | 144:ef7eb2e8f9f7 | 719 | bitShift -= 32; | 
| <> | 144:ef7eb2e8f9f7 | 720 | } | 
| <> | 144:ef7eb2e8f9f7 | 721 | break; | 
| <> | 144:ef7eb2e8f9f7 | 722 | default: | 
| <> | 144:ef7eb2e8f9f7 | 723 | segmentRegister = (uint32_t *)0x00000000; | 
| <> | 144:ef7eb2e8f9f7 | 724 | EFM_ASSERT(0); | 
| <> | 144:ef7eb2e8f9f7 | 725 | break; | 
| <> | 144:ef7eb2e8f9f7 | 726 | } | 
| <> | 144:ef7eb2e8f9f7 | 727 | #endif | 
| <> | 144:ef7eb2e8f9f7 | 728 | |
| <> | 144:ef7eb2e8f9f7 | 729 | /* Configure new bias setting */ | 
| <> | 144:ef7eb2e8f9f7 | 730 | *segmentRegister = (*segmentRegister & ~(0xF << bitShift)) | (biasLevel << bitShift); | 
| <> | 144:ef7eb2e8f9f7 | 731 | } | 
| <> | 144:ef7eb2e8f9f7 | 732 | #endif | 
| <> | 144:ef7eb2e8f9f7 | 733 | |
| <> | 144:ef7eb2e8f9f7 | 734 | |
| <> | 144:ef7eb2e8f9f7 | 735 | #if defined(LCD_CTRL_DSC) | 
| <> | 144:ef7eb2e8f9f7 | 736 | /***************************************************************************//** | 
| <> | 144:ef7eb2e8f9f7 | 737 | * @brief | 
| <> | 144:ef7eb2e8f9f7 | 738 | * Configure bias level for a specific segment line | 
| <> | 144:ef7eb2e8f9f7 | 739 | * | 
| <> | 144:ef7eb2e8f9f7 | 740 | * @note | 
| <> | 144:ef7eb2e8f9f7 | 741 | * When DSC is active, each configuration takes up 4 bits in the Segment | 
| <> | 144:ef7eb2e8f9f7 | 742 | * Registers (SEGD4L/SEGD4H) which defines bias level. | 
| <> | 144:ef7eb2e8f9f7 | 743 | * For optimal use of this feature, the entire SEGD-registers should be set | 
| <> | 144:ef7eb2e8f9f7 | 744 | * at once in a optimized routine, so this function is mainly here to | 
| <> | 144:ef7eb2e8f9f7 | 745 | * demonstrate how to correctly configure the bias levels, and should be used | 
| <> | 144:ef7eb2e8f9f7 | 746 | * with care. | 
| <> | 144:ef7eb2e8f9f7 | 747 | * | 
| <> | 144:ef7eb2e8f9f7 | 748 | * @param[in] comLine | 
| <> | 144:ef7eb2e8f9f7 | 749 | * COM line number, 0-7 | 
| <> | 144:ef7eb2e8f9f7 | 750 | * | 
| <> | 144:ef7eb2e8f9f7 | 751 | * @param[in] biasLevel | 
| <> | 144:ef7eb2e8f9f7 | 752 | * Bias configuration level, 0-4. This value must be within the constraint | 
| <> | 144:ef7eb2e8f9f7 | 753 | * defined by the LCD_DISPCTRL bias setting, see Reference Manual/Datasheet | 
| <> | 144:ef7eb2e8f9f7 | 754 | ******************************************************************************/ | 
| <> | 144:ef7eb2e8f9f7 | 755 | void LCD_BiasComSet(int comLine, int biasLevel) | 
| <> | 144:ef7eb2e8f9f7 | 756 | { | 
| <> | 144:ef7eb2e8f9f7 | 757 | int bitShift; | 
| <> | 144:ef7eb2e8f9f7 | 758 | EFM_ASSERT(comLine < 8); | 
| <> | 144:ef7eb2e8f9f7 | 759 | |
| <> | 144:ef7eb2e8f9f7 | 760 | bitShift = comLine * 4; | 
| <> | 144:ef7eb2e8f9f7 | 761 | LCD->SEGD4L = (LCD->SEGD4L & ~(0xF << bitShift)) | (biasLevel << bitShift); | 
| <> | 144:ef7eb2e8f9f7 | 762 | } | 
| <> | 144:ef7eb2e8f9f7 | 763 | #endif | 
| <> | 144:ef7eb2e8f9f7 | 764 | |
| <> | 144:ef7eb2e8f9f7 | 765 | /** @} (end addtogroup LCD) */ | 
| <> | 150:02e0a0aed4ec | 766 | /** @} (end addtogroup emlib) */ | 
| <> | 144:ef7eb2e8f9f7 | 767 | |
| <> | 144:ef7eb2e8f9f7 | 768 | #endif /* defined(LCD_COUNT) && (LCD_COUNT > 0) */ | 
