/**************************************************************************//** * @brief LCD Initialization routine for EFM32 DVK display * @param lcd Pointer to LCD register block *****************************************************************************/ void LCD_Init(LCD_TypeDef *lcd) { CMU_TypeDef *cmu = CMU; /* Enable LFXO oscillator */ cmu->OSCENCMD |= CMU_OSCENCMD_LFXOEN; while (!(cmu->STATUS & CMU_STATUS_LFXORDY)) ; /* Enable LCD clock in CMU */ cmu->LFACLKEN0 |= CMU_LFACLKEN0_LCD; /* Select LFXO for LCD */ cmu->LFCLKSEL = CMU_LFCLKSEL_LFA_LFXO | CMU_LFCLKSEL_LFB_LFXO; /* LCD Controller Prescaler (divide by 1) */ /* CLKlcd = 0.25 kHz */ cmu->LFAPRESC0 &= ~_CMU_LFAPRESC0_LCD_MASK; cmu->LFAPRESC0 |= _CMU_LFAPRESC0_LCD_DIV128 << _CMU_LFAPRESC0_LCD_SHIFT; /* Set up interrupt handler */ lcd->IEN = 0; while (lcd->SYNCBUSY) ; /* Clear pending interrupts */ lcd->IFC = ~0; /* Enable interrupt */ NVIC_EnableIRQ(LCD_IRQn); lcd->IEN = LCD_IEN_FC; /* Frame rate is 32Hz, 0.25Khz LFCLK128, QUADRUPLEX mode, FDIV=0 */ lcd->DISPCTRL = LCD_DISPCTRL_MUX_QUADRUPLEX | LCD_DISPCTRL_BIAS_ONETHIRD | LCD_DISPCTRL_WAVE_LOWPOWER | LCD_DISPCTRL_CONLEV_MAX | LCD_DISPCTRL_VLCDSEL_VDD | LCD_DISPCTRL_VBLEV_3V00; /* No voltage boost, framerate 32Hz */ cmu->LCDCTRL = 0; /* Turn all segments off */ LCD_AllOff(lcd); /* Enable all segment registers */ lcd->SEGEN = 0x000003FF; lcd->CTRL = LCD_CTRL_EN | LCD_CTRL_UDCTRL_FRAMESTART; while (lcd->SYNCBUSY) ; /* Configure LCD to give a frame counter interrupt every 8th frame. */ lcd->BACTRL = LCD_BACTRL_FCEN | (7 << _LCD_BACTRL_FCTOP_SHIFT) | (0 << _LCD_BACTRL_FCPRESC_SHIFT); while (lcd->SYNCBUSY) ; lcd->IFC = LCD_IFC_FC; lcd->IEN = LCD_IEN_FC; }
void vLCDTask( void *pvParameters ) { long x; LCD_TypeDef *xLCD = LCD; char *pcScrollText = "FreeRTOS Energy Micro "; /* Loop through various different displays. */ for( ;; ) { /* Start by scrolling some text. */ LCD_ScrollText( xLCD, pcScrollText ); LCD_AllOff( xLCD ); /* Count down from 100 on the number section of the LCD display. */ for( x = 100; x > 0; x--) { LCD_Number( xLCD, x ); vTaskDelay( 10 ); } LCD_NumberOff( xLCD ); /* Turn on gecko and EFM32 symbol. */ LCD_Symbol( xLCD, LCD_SYMBOL_GECKO, 1 ); LCD_Symbol( xLCD, LCD_SYMBOL_EFM32, 1 ); LCD_Write( xLCD, " Gecko " ); vTaskDelay( lcdONE_SECOND ); LCD_AllOn( xLCD); vTaskDelay( lcdONE_SECOND ); LCD_AllOff( xLCD); LCD_Write( xLCD, "OOOOOOO" ); vTaskDelay( lcdSHORT_DELAY ); LCD_Write( xLCD, "XXXXXXX" ); vTaskDelay( lcdSHORT_DELAY ); LCD_Write( xLCD, "+++++++" ); vTaskDelay( lcdSHORT_DELAY ); LCD_Write( xLCD, "@@@@@@@" ); vTaskDelay( lcdSHORT_DELAY ); LCD_Write( xLCD, "ENERGY " ); vTaskDelay( lcdQUARTER_SECOND ); LCD_Write( xLCD, "@@ERGY " ); vTaskDelay( lcdSHORT_DELAY ); LCD_Write( xLCD, " @@RGY " ); vTaskDelay( lcdSHORT_DELAY ); LCD_Write( xLCD, " M@@GY " ); vTaskDelay( lcdSHORT_DELAY ); LCD_Write( xLCD, " MI@@Y " ); vTaskDelay( lcdSHORT_DELAY ); LCD_Write( xLCD, " MIC@@ " ); vTaskDelay( lcdSHORT_DELAY ); LCD_Write( xLCD, " MICR@@" ); vTaskDelay( lcdSHORT_DELAY ); LCD_Write( xLCD, " MICRO@" ); vTaskDelay( lcdSHORT_DELAY ); LCD_Write( xLCD, " MICRO " ); vTaskDelay( lcdQUARTER_SECOND ); LCD_Write( xLCD, "-EFM32-" ); vTaskDelay( lcdQUARTER_SECOND ); } }