00001
00034 #ifndef __EM_LCD_H
00035 #define __EM_LCD_H
00036
00037 #include "em_device.h"
00038
00039 #if defined(LCD_COUNT) && (LCD_COUNT > 0)
00040 #include <stdint.h>
00041 #include <stdbool.h>
00042
00043 #ifdef __cplusplus
00044 extern "C" {
00045 #endif
00046
00047
00052
00057
00058
00059
00060
00062 typedef enum
00063 {
00065 lcdMuxStatic = LCD_DISPCTRL_MUX_STATIC,
00067 lcdMuxDuplex = LCD_DISPCTRL_MUX_DUPLEX,
00069 lcdMuxTriplex = LCD_DISPCTRL_MUX_TRIPLEX,
00071 lcdMuxQuadruplex = LCD_DISPCTRL_MUX_QUADRUPLEX,
00072 #if defined(_EFM32_TINY_FAMILY) || defined(_EFM32_GIANT_FAMILY) || defined(_EFM32_WONDER_FAMILY)
00073
00074 lcdMuxSextaplex = LCD_DISPCTRL_MUXE_MUXE | LCD_DISPCTRL_MUX_DUPLEX,
00076 lcdMuxOctaplex = LCD_DISPCTRL_MUXE_MUXE | LCD_DISPCTRL_MUX_QUADRUPLEX
00077 #endif
00078 } LCD_Mux_TypeDef;
00079
00081 typedef enum
00082 {
00084 lcdBiasStatic = LCD_DISPCTRL_BIAS_STATIC,
00086 lcdBiasOneHalf = LCD_DISPCTRL_BIAS_ONEHALF,
00088 lcdBiasOneThird = LCD_DISPCTRL_BIAS_ONETHIRD,
00089 #if defined(_EFM32_TINY_FAMILY) || defined(_EFM32_GIANT_FAMILY) || defined(_EFM32_WONDER_FAMILY)
00090
00091 lcdBiasOneFourth = LCD_DISPCTRL_BIAS_ONEFOURTH,
00092 #endif
00093 } LCD_Bias_TypeDef;
00094
00096 typedef enum
00097 {
00099 lcdWaveLowPower = LCD_DISPCTRL_WAVE_LOWPOWER,
00101 lcdWaveNormal = LCD_DISPCTRL_WAVE_NORMAL
00102 } LCD_Wave_TypeDef;
00103
00105 typedef enum
00106 {
00108 lcdVLCDSelVDD = LCD_DISPCTRL_VLCDSEL_VDD,
00110 lcdVLCDSelVExtBoost = LCD_DISPCTRL_VLCDSEL_VEXTBOOST
00111 } LCD_VLCDSel_TypeDef;
00112
00114 typedef enum
00115 {
00117 lcdConConfVLCD = LCD_DISPCTRL_CONCONF_VLCD,
00119 lcdConConfGND = LCD_DISPCTRL_CONCONF_GND
00120 } LCD_ConConf_TypeDef;
00121
00123 typedef enum
00124 {
00125 lcdVBoostLevel0 = LCD_DISPCTRL_VBLEV_LEVEL0,
00126 lcdVBoostLevel1 = LCD_DISPCTRL_VBLEV_LEVEL1,
00127 lcdVBoostLevel2 = LCD_DISPCTRL_VBLEV_LEVEL2,
00128 lcdVBoostLevel3 = LCD_DISPCTRL_VBLEV_LEVEL3,
00129 lcdVBoostLevel4 = LCD_DISPCTRL_VBLEV_LEVEL4,
00130 lcdVBoostLevel5 = LCD_DISPCTRL_VBLEV_LEVEL5,
00131 lcdVBoostLevel6 = LCD_DISPCTRL_VBLEV_LEVEL6,
00132 lcdVBoostLevel7 = LCD_DISPCTRL_VBLEV_LEVEL7
00133 } LCD_VBoostLevel_TypeDef;
00134
00136 typedef enum
00137 {
00139 lcdFCPrescDiv1 = LCD_BACTRL_FCPRESC_DIV1,
00141 lcdFCPrescDiv2 = LCD_BACTRL_FCPRESC_DIV2,
00143 lcdFCPrescDiv4 = LCD_BACTRL_FCPRESC_DIV4,
00145 lcdFCPrescDiv8 = LCD_BACTRL_FCPRESC_DIV8
00146 } LCD_FCPreScale_TypeDef;
00147
00149 typedef enum
00150 {
00152 lcdSegment0_3 = (1 << 0),
00154 lcdSegment4_7 = (1 << 1),
00156 lcdSegment8_11 = (1 << 2),
00158 lcdSegment12_15 = (1 << 3),
00160 lcdSegment16_19 = (1 << 4),
00162 lcdSegment20_23 = (1 << 5),
00163 #if defined(_EFM32_TINY_FAMILY)
00164
00165 lcdSegmentAll = (0x003f)
00166 #endif
00167 #if defined(_EFM32_GECKO_FAMILY) || defined(_EFM32_GIANT_FAMILY) || defined(_EFM32_WONDER_FAMILY)
00169 lcdSegment24_27 = (1 << 6),
00171 lcdSegment28_31 = (1 << 7),
00173 lcdSegment32_35 = (1 << 8),
00175 lcdSegment36_39 = (1 << 9),
00177 lcdSegmentAll = (0x03ff)
00178 #endif
00179 } LCD_SegmentRange_TypeDef;
00180
00182 typedef enum
00183 {
00185 lcdUpdateCtrlRegular = LCD_CTRL_UDCTRL_REGULAR,
00187 lcdUpdateCtrlFCEvent = LCD_CTRL_UDCTRL_FCEVENT,
00189 lcdUpdateCtrlFrameStart = LCD_CTRL_UDCTRL_FRAMESTART
00190 } LCD_UpdateCtrl_TypeDef;
00191
00193 typedef enum
00194 {
00196 lcdAnimShiftNone = _LCD_BACTRL_AREGASC_NOSHIFT,
00198 lcdAnimShiftLeft = _LCD_BACTRL_AREGASC_SHIFTLEFT,
00200 lcdAnimShiftRight = _LCD_BACTRL_AREGASC_SHIFTRIGHT
00201 } LCD_AnimShift_TypeDef;
00202
00204 typedef enum
00205 {
00207 lcdAnimLogicAnd = LCD_BACTRL_ALOGSEL_AND,
00209 lcdAnimLogicOr = LCD_BACTRL_ALOGSEL_OR
00210 } LCD_AnimLogic_TypeDef;
00211
00212
00213
00214
00215
00216
00218 typedef struct
00219 {
00221 bool enable;
00223 uint32_t AReg;
00225 LCD_AnimShift_TypeDef AShift;
00227 uint32_t BReg;
00229 LCD_AnimShift_TypeDef BShift;
00231 LCD_AnimLogic_TypeDef animLogic;
00232 #if defined(_EFM32_GIANT_FAMILY) || defined(_EFM32_WONDER_FAMILY)
00233
00234 int startSeg;
00235 #endif
00236 } LCD_AnimInit_TypeDef;
00237
00239 typedef struct
00240 {
00242 bool enable;
00244 uint32_t top;
00246 LCD_FCPreScale_TypeDef prescale;
00247 } LCD_FrameCountInit_TypeDef;
00248
00250 typedef struct
00251 {
00253 bool enable;
00255 LCD_Mux_TypeDef mux;
00257 LCD_Bias_TypeDef bias;
00259 LCD_Wave_TypeDef wave;
00261 LCD_VLCDSel_TypeDef vlcd;
00263 LCD_ConConf_TypeDef contrast;
00264 } LCD_Init_TypeDef;
00265
00267 #define LCD_INIT_DEFAULT \
00268 { true, \
00269 lcdMuxQuadruplex, \
00270 lcdBiasOneThird, \
00271 lcdWaveLowPower, \
00272 lcdVLCDSelVDD, \
00273 lcdConConfVLCD \
00274 }
00275
00276
00277
00278
00279
00280 void LCD_Init(const LCD_Init_TypeDef *lcdInit);
00281 void LCD_VLCDSelect(LCD_VLCDSel_TypeDef vlcd);
00282 void LCD_UpdateCtrl(LCD_UpdateCtrl_TypeDef ud);
00283 void LCD_FrameCountInit(const LCD_FrameCountInit_TypeDef *fcInit);
00284 void LCD_AnimInit(const LCD_AnimInit_TypeDef *animInit);
00285
00286 void LCD_SegmentRangeEnable(LCD_SegmentRange_TypeDef segment, bool enable);
00287 void LCD_SegmentSet(int com, int bit, bool enable);
00288 void LCD_SegmentSetLow(int com, uint32_t mask, uint32_t bits);
00289 #if defined(_EFM32_GECKO_FAMILY) || defined(_EFM32_GIANT_FAMILY) || defined(_EFM32_WONDER_FAMILY)
00290 void LCD_SegmentSetHigh(int com, uint32_t mask, uint32_t bits);
00291 #endif
00292 void LCD_ContrastSet(int level);
00293 void LCD_VBoostSet(LCD_VBoostLevel_TypeDef vboost);
00294
00295 #if defined(_EFM32_TINY_FAMILY) || defined(_EFM32_GIANT_FAMILY) || defined(_EFM32_WONDER_FAMILY)
00296 void LCD_BiasSegmentSet(int segment, int biasLevel);
00297 void LCD_BiasComSet(int com, int biasLevel);
00298 #endif
00299
00300 __STATIC_INLINE void LCD_Enable(bool enable);
00301 __STATIC_INLINE void LCD_AnimEnable(bool enable);
00302 __STATIC_INLINE void LCD_BlinkEnable(bool enable);
00303 __STATIC_INLINE void LCD_BlankEnable(bool enable);
00304 __STATIC_INLINE void LCD_FrameCountEnable(bool enable);
00305 __STATIC_INLINE int LCD_AnimState(void);
00306 __STATIC_INLINE int LCD_BlinkState(void);
00307 __STATIC_INLINE void LCD_FreezeEnable(bool enable);
00308 __STATIC_INLINE uint32_t LCD_SyncBusyGet(void);
00309 __STATIC_INLINE void LCD_SyncBusyDelay(uint32_t flags);
00310 __STATIC_INLINE uint32_t LCD_IntGet(void);
00311 __STATIC_INLINE uint32_t LCD_IntGetEnabled(void);
00312 __STATIC_INLINE void LCD_IntSet(uint32_t flags);
00313 __STATIC_INLINE void LCD_IntEnable(uint32_t flags);
00314 __STATIC_INLINE void LCD_IntDisable(uint32_t flags);
00315 __STATIC_INLINE void LCD_IntClear(uint32_t flags);
00316 #if defined(_EFM32_TINY_FAMILY) || defined(_EFM32_GIANT_FAMILY) || defined(_EFM32_WONDER_FAMILY)
00317 __STATIC_INLINE void LCD_DSCEnable(bool enable);
00318 #endif
00319
00320
00329 __STATIC_INLINE void LCD_Enable(bool enable)
00330 {
00331 if (enable)
00332 {
00333 LCD->CTRL |= LCD_CTRL_EN;
00334 }
00335 else
00336 {
00337 LCD->CTRL &= ~(LCD_CTRL_EN);
00338 }
00339 }
00340
00341
00342
00349 __STATIC_INLINE void LCD_AnimEnable(bool enable)
00350 {
00351 if (enable)
00352 {
00353 LCD->BACTRL |= LCD_BACTRL_AEN;
00354 }
00355 else
00356 {
00357 LCD->BACTRL &= ~(LCD_BACTRL_AEN);
00358 }
00359 }
00360
00361
00362
00369 __STATIC_INLINE void LCD_BlinkEnable(bool enable)
00370 {
00371 if (enable)
00372 {
00373 LCD->BACTRL |= LCD_BACTRL_BLINKEN;
00374 }
00375 else
00376 {
00377 LCD->BACTRL &= ~(LCD_BACTRL_BLINKEN);
00378 }
00379 }
00380
00381
00382
00389 __STATIC_INLINE void LCD_BlankEnable(bool enable)
00390 {
00391 if (enable)
00392 {
00393 LCD->BACTRL |= LCD_BACTRL_BLANK;
00394 }
00395 else
00396 {
00397 LCD->BACTRL &= ~(LCD_BACTRL_BLANK);
00398 }
00399 }
00400
00401
00402
00409 __STATIC_INLINE void LCD_FrameCountEnable(bool enable)
00410 {
00411 if (enable)
00412 {
00413 LCD->BACTRL |= LCD_BACTRL_FCEN;
00414 }
00415 else
00416 {
00417 LCD->BACTRL &= ~(LCD_BACTRL_FCEN);
00418 }
00419 }
00420
00421
00422
00429 __STATIC_INLINE int LCD_AnimState(void)
00430 {
00431 return (int)(LCD->STATUS & _LCD_STATUS_ASTATE_MASK) >> _LCD_STATUS_ASTATE_SHIFT;
00432 }
00433
00434
00435
00442 __STATIC_INLINE int LCD_BlinkState(void)
00443 {
00444 return (int)(LCD->STATUS & _LCD_STATUS_BLINK_MASK) >> _LCD_STATUS_BLINK_SHIFT;
00445 }
00446
00447
00448
00456 __STATIC_INLINE void LCD_FreezeEnable(bool enable)
00457 {
00458 if (enable)
00459 {
00460 LCD->FREEZE = LCD_FREEZE_REGFREEZE_FREEZE;
00461 }
00462 else
00463 {
00464 LCD->FREEZE = LCD_FREEZE_REGFREEZE_UPDATE;
00465 }
00466 }
00467
00468
00469
00476 __STATIC_INLINE uint32_t LCD_SyncBusyGet(void)
00477 {
00478 return(LCD->SYNCBUSY);
00479 }
00480
00481
00482
00489 __STATIC_INLINE void LCD_SyncBusyDelay(uint32_t flags)
00490 {
00491 while (LCD->SYNCBUSY & flags)
00492 ;
00493 }
00494
00495
00496
00504 __STATIC_INLINE uint32_t LCD_IntGet(void)
00505 {
00506 return(LCD->IF);
00507 }
00508
00509
00510
00528 __STATIC_INLINE uint32_t LCD_IntGetEnabled(void)
00529 {
00530 uint32_t tmp = 0U;
00531
00532
00533
00534 tmp = LCD->IEN;
00535
00536
00537 return LCD->IF & tmp;
00538 }
00539
00540
00541
00550 __STATIC_INLINE void LCD_IntSet(uint32_t flags)
00551 {
00552 LCD->IFS = flags;
00553 }
00554
00555
00556
00565 __STATIC_INLINE void LCD_IntEnable(uint32_t flags)
00566 {
00567 LCD->IEN |= flags;
00568 }
00569
00570
00571
00580 __STATIC_INLINE void LCD_IntDisable(uint32_t flags)
00581 {
00582 LCD->IEN &= ~(flags);
00583 }
00584
00585
00586
00595 __STATIC_INLINE void LCD_IntClear(uint32_t flags)
00596 {
00597 LCD->IFC = flags;
00598 }
00599
00600
00601 #if defined(_EFM32_TINY_FAMILY) || defined(_EFM32_GIANT_FAMILY) || defined(_EFM32_WONDER_FAMILY)
00602
00611 __STATIC_INLINE void LCD_DSCEnable(bool enable)
00612 {
00613 if (enable)
00614 {
00615 LCD->CTRL |= LCD_CTRL_DSC;
00616 }
00617 else
00618 {
00619 LCD->CTRL &= ~(LCD_CTRL_DSC);
00620 }
00621 }
00622 #endif
00623
00627 #ifdef __cplusplus
00628 }
00629 #endif
00630
00631 #endif
00632
00633 #endif