added prescaler for 16 bit pwm in LPC1347 target

Fork of mbed-dev by mbed official

Committer:
bogdanm
Date:
Thu Oct 01 15:25:22 2015 +0300
Revision:
0:9b334a45a8ff
Child:
50:a417edff4437
Initial commit on mbed-dev

Replaces mbed-src (now inactive)

Who changed what in which revision?

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