em_lcd.h

Go to the documentation of this file.
00001 /***************************************************************************/
00034 #ifndef __SILICON_LABS_EM_LCD_H_
00035 #define __SILICON_LABS_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  ********************************   ENUMS   ************************************
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  *******************************   STRUCTS   ***********************************
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  *****************************   PROTOTYPES   **********************************
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   /* Store LCD->IEN in temporary variable in order to define explicit order
00533    * of volatile accesses. */
00534   tmp = LCD->IEN;
00535 
00536   /* Bitwise AND of pending and enabled interrupts */
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 /* defined(LCD_COUNT) && (LCD_COUNT > 0) */
00632 
00633 #endif /* __SILICON_LABS_EM_LCD_H_ */