void vLCDTask( void * pvParameters ) { unsigned portBASE_TYPE uxIndex; const unsigned char ucCFGData[] = { 0x30, /* Set data bus to 8-bits. */ 0x30, 0x30, 0x3C, /* Number of lines/font. */ 0x08, /* Display off. */ 0x01, /* Display clear. */ 0x06, /* Entry mode [cursor dir][shift]. */ 0x0C /* Display on [display on][curson on][blinking on]. */ }; /* The strings that are written to the LCD. */ const char *pcStringsToDisplay[] = { "Stellaris", "Demo", "One", "www.FreeRTOS.org", "" }; /* Configure the LCD. */ uxIndex = 0; while( uxIndex < sizeof( ucCFGData ) ) { prvPDCWrite( PDC_LCD_CSR, ucCFGData[ uxIndex ] ); uxIndex++; vTaskDelay( mainCHAR_WRITE_DELAY ); } /* Turn the LCD Backlight on. */ prvPDCWrite( PDC_CSR, 0x01 ); /* Clear display. */ vTaskDelay( mainCHAR_WRITE_DELAY ); prvPDCWrite( PDC_LCD_CSR, LCD_CLEAR ); uxIndex = 0; for( ;; ) { /* Display the string on the LCD. */ prvWriteString( pcStringsToDisplay[ uxIndex ] ); /* Move on to the next string - wrapping if necessary. */ uxIndex++; if( *( pcStringsToDisplay[ uxIndex ] ) == 0x00 ) { uxIndex = 0; /* Longer pause on the last string to be sent. */ vTaskDelay( mainSTRING_WRITE_DELAY * 2 ); } /* Wait until it is time to move onto the next string. */ vTaskDelay( mainSTRING_WRITE_DELAY ); } }
static void prvWriteString( const char *pcString ) { /* Write pcString to the LED, pausing between each character. */ prvPDCWrite(PDC_LCD_CSR, LCD_CLEAR); while( *pcString ) { vTaskDelay( mainCHAR_WRITE_DELAY ); prvPDCWrite( PDC_LCD_RAM, *pcString ); pcString++; } }
void prvLCDTask( void * pvParameters ) { unsigned portBASE_TYPE uxIndex; xQueueHandle *pxLCDQueue; xLCDMessage xReceivedMessage; char *pcString; const unsigned char ucCFGData[] = { 0x30, /* Set data bus to 8-bits. */ 0x30, 0x30, 0x3C, /* Number of lines/font. */ 0x08, /* Display off. */ 0x01, /* Display clear. */ 0x06, /* Entry mode [cursor dir][shift]. */ 0x0C /* Display on [display on][curson on][blinking on]. */ }; /* To test the parameter passing mechanism, the queue on which messages are received is passed in as a parameter even though it is available as a file scope variable anyway. */ pxLCDQueue = ( xQueueHandle * ) pvParameters; /* Configure the LCD. */ uxIndex = 0; while( uxIndex < sizeof( ucCFGData ) ) { prvPDCWrite( PDC_LCD_CSR, ucCFGData[ uxIndex ] ); uxIndex++; vTaskDelay( mainCHAR_WRITE_DELAY ); } /* Turn the LCD Backlight on. */ prvPDCWrite( PDC_CSR, 0x01 ); /* Clear display. */ vTaskDelay( mainCHAR_WRITE_DELAY ); prvPDCWrite( PDC_LCD_CSR, LCD_CLEAR ); uxIndex = 0; for( ;; ) { /* Wait for a message to arrive. */ if( xQueueReceive( *pxLCDQueue, &xReceivedMessage, portMAX_DELAY ) ) { /* Which row does the received message say to write to? */ PDCLCDSetPos( 0, xReceivedMessage.xRow ); /* Where is the string we are going to display? */ pcString = *xReceivedMessage.ppcMessageToDisplay; while( *pcString ) { /* Don't write out the string too quickly as LCD's are usually pretty slow devices. */ vTaskDelay( mainCHAR_WRITE_DELAY ); prvPDCWrite( PDC_LCD_RAM, *pcString ); pcString++; } } } }