Ejemplo n.º 1
0
/**************************************************************************//**
 * @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;
}
Ejemplo n.º 2
0
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 );
	}
}