Tool/software: Code Composer Studio
i cant enable this tft display with interface with tm4c1294ncpdt board
this display is k430wqc-v3-ff (ssd1963) 480x272x16
i m transmit 8 bit dat via gpio port
i need to sample code for this display for ssd1963 8 bit
i am attach my code but still is it not work in that some issue i want simple color in display red blue green
#include <stdint.h> #include <stdbool.h> #include "inc/hw_gpio.h" #include "inc/hw_ints.h" #include "inc/hw_memmap.h" #include "inc/hw_types.h" #include "driverlib/gpio.h" #include "driverlib/interrupt.h" #include "driverlib/sysctl.h" #include "driverlib/timer.h" #include "driverlib/rom.h" #include "grlib/grlib.h" #include "Kentec480x272x16_SSD1963_8bit.h" #if ! defined(PORTRAIT) && ! defined(PORTRAIT_FLIP) && \ ! defined(LANDSCAPE) && ! defined(LANDSCAPE_FLIP) #define LANDSCAPE //#define PORTRAIT #endif #define LCD_HEIGHT 272 #define LCD_WIDTH 480 //***************************************************************************** // // Various definitions controlling coordinate space mapping and drawing // direction in the four supported orientations. // //***************************************************************************** #ifdef PORTRAIT #define HORIZ_DIRECTION 0xa0 #define VERT_DIRECTION 0x80 #define MAPPED_X(x, y) (LCD_WIDTH-1- (y)) #define MAPPED_Y(x, y) (x) #endif #ifdef LANDSCAPE #define HORIZ_DIRECTION 0x00 #define VERT_DIRECTION 0x20 #define MAPPED_X(x, y) (x) #define MAPPED_Y(x, y) (y) #endif #ifdef PORTRAIT_FLIP #define HORIZ_DIRECTION 0xa2 #define VERT_DIRECTION 0x81 #define MAPPED_X(x, y) (y) #define MAPPED_Y(x, y) (LCD_HEIGHT-1 - (x)) #endif #ifdef LANDSCAPE_FLIP #define HORIZ_DIRECTION 0x02 #define VERT_DIRECTION 0x01 #define MAPPED_X(x, y) (LCD_WIDTH- (x)) #define MAPPED_Y(x, y) (LCD_HEIGHT- (y)) #endif //***************************************************************************** // // Defines for the pins that are used to communicate with the SSD1963. // //***************************************************************************** #define LCD_DATAH_PERIPH SYSCTL_PERIPH_GPIOD #define LCD_DATAH_BASE GPIO_PORTD_BASE #define LCD_DATAH_PINS 0xFF // // LCD control line GPIO definitions. // #define LCD_CS_PERIPH SYSCTL_PERIPH_GPIOA #define LCD_CS_BASE GPIO_PORTA_BASE #define LCD_CS_PIN GPIO_PIN_3 #define LCD_DC_PERIPH SYSCTL_PERIPH_GPIOA #define LCD_DC_BASE GPIO_PORTA_BASE #define LCD_DC_PIN GPIO_PIN_2 #define LCD_WR_PERIPH SYSCTL_PERIPH_GPIOA #define LCD_WR_BASE GPIO_PORTA_BASE #define LCD_WR_PIN GPIO_PIN_5 #define LCD_RD_PERIPH SYSCTL_PERIPH_GPIOA #define LCD_RD_BASE GPIO_PORTA_BASE #define LCD_RD_PIN GPIO_PIN_4 #define LCD_RST_PERIPH SYSCTL_PERIPH_GPIOA #define LCD_RST_BASE GPIO_PORTA_BASE #define LCD_RST_PIN GPIO_PIN_7 //***************************************************************************** // // Macro used to set the LCD data bus in preparation for writing a byte to the // device. // //***************************************************************************** #define SET_LCD_DATA(ucByte) \ { \ GPIOPinWrite( LCD_DATAH_BASE, LCD_DATAH_PINS, ucByte); \ } //***************************************************************************** // // Various internal SSD1963 registers name labels // //***************************************************************************** #define ENTRY_MODE_DEFAULT 0x6830 #define MAKE_ENTRY_MODE(x) ((ENTRY_MODE_DEFAULT & 0xFF00) | (x)) //***************************************************************************** // // The dimensions of the LCD panel. // //***************************************************************************** #define LCD_VERTICAL_MAX 272 #define LCD_HORIZONTAL_MAX 480 //***************************************************************************** // // Translates a 24-bit RGB color to a display driver-specific color. // // \param c is the 24-bit RGB color. The least-significant byte is the blue // channel, the next byte is the green channel, and the third byte is the red // channel. // // This macro translates a 24-bit RGB color into a value that can be written // into the display's frame buffer in order to reproduce that color, or the // closest possible approximation of that color. // // \return Returns the display-driver specific color. // //***************************************************************************** #define DPYCOLORTRANSLATE(c) ((((c) & 0x00f80000) >> 8) | \ (((c) & 0x0000fc00) >> 5) | \ (((c) & 0x000000f8) >> 3)) //***************************************************************************** // // Function pointer types for low level LCD controller access functions. // //***************************************************************************** typedef void (*pfnWriteData)(unsigned short usData); typedef void (*pfnWriteSetting)(unsigned short usData); typedef void (*pfnWriteCommand)(unsigned short ucData); //***************************************************************************** // // Function pointers for low level LCD controller access functions. // //***************************************************************************** static void WriteDataGPIO(unsigned short usData); static void WriteSettingGPIO(unsigned short usData); static void WriteCommandGPIO(unsigned short ucData); pfnWriteData WriteData = WriteDataGPIO; pfnWriteData WriteSetting = WriteSettingGPIO; pfnWriteCommand WriteCommand = WriteCommandGPIO; //***************************************************************************** // // Writes a data word to the SSD2119. This function implements the basic GPIO // interface to the LCD display. // //***************************************************************************** static void WriteDataGPIO(unsigned short usData) { GPIOPinWrite( LCD_DATAH_BASE, LCD_DATAH_PINS, 0x00); SET_LCD_DATA(usData & 0xE0); GPIOPinWrite(LCD_WR_BASE, LCD_WR_PIN, 0x00); GPIOPinWrite(LCD_WR_BASE, LCD_WR_PIN, 0x00); // // Deassert the write enable signal. GPIOPinWrite(LCD_WR_BASE, LCD_WR_PIN, LCD_WR_PIN); // /WR=1 // Write the mid byte of the data to the bus. // //GPIO_setOutputLowOnPin(LCD_DATAH_BASE,0xFF); //check please //SET_LCD_DATA((usData >> 5)<<2); SET_LCD_DATA(usData & 0x18); // // Assert the write enable signal. We need to do this 2 times to ensure // that we don't violate the timing requirements for the display. // GPIOPinWrite(LCD_WR_BASE, LCD_WR_PIN, 0x00); GPIOPinWrite(LCD_WR_BASE, LCD_WR_PIN, 0x00); // // Deassert the write enable signal. // //HWREG(LCD_WR_BASE + GPIO_O_DATA + (LCD_WR_PIN << 2)) = LCD_WR_PIN; //HWREG(LCD_WR_BASE + GPIO_O_DATA + (LCD_WR_PIN << 2)) = LCD_WR_PIN; //GPIO_setOutpuHighOnPin(LCD_WR_BASE ,LCD_WR_PIN); GPIOPinWrite(LCD_WR_BASE, LCD_WR_PIN, LCD_WR_PIN); // /WR=1 // // Write the least significant byte of the data to the bus. // // SET_LCD_DATA(usData<<3); SET_LCD_DATA(usData & 0x07); // // Assert the write enable signal. // //HWREG(LCD_WR_BASE + GPIO_O_DATA + (LCD_WR_PIN << 2)) = 0; //HWREG(LCD_WR_BASE + GPIO_O_DATA + (LCD_WR_PIN << 2)) = 0; GPIOPinWrite(LCD_WR_BASE, LCD_WR_PIN, 0x00); GPIOPinWrite(LCD_WR_BASE, LCD_WR_PIN, 0x00); // // Deassert the write enable signal. // // HWREG(LCD_WR_BASE + GPIO_O_DATA + (LCD_WR_PIN << 2)) = LCD_WR_PIN; //HWREG(LCD_WR_BASE + GPIO_O_DATA + (LCD_WR_PIN << 2)) = LCD_WR_PIN; // GPIO_setOutpuHighOnPin(LCD_WR_BASE ,LCD_WR_PIN); GPIOPinWrite(LCD_WR_BASE, LCD_WR_PIN, LCD_WR_PIN); // /WR=1 } static void WriteSettingGPIO(unsigned short usData) { // HWREG(LCD_CS_BASE + GPIO_O_DATA + (LCD_CS_PIN << 2)) = 0; // // Write the least significant byte of the data to the bus. // //SET_LCD_DATA(usData); GPIOPinWrite(LCD_DATAH_BASE, LCD_DATAH_PINS , 0x00); // Data Bus OUT SET_LCD_DATA(usData & 0x07); // // Assert the write enable signal. // GPIOPinWrite(LCD_WR_BASE, LCD_WR_PIN, 0x00); GPIOPinWrite(LCD_WR_BASE, LCD_WR_PIN, 0x00); // // Deassert the write enable signal. // //HWREG(LCD_WR_BASE + GPIO_O_DATA + (LCD_WR_PIN << 2)) = LCD_WR_PIN; //HWREG(LCD_WR_BASE + GPIO_O_DATA + (LCD_WR_PIN << 2)) = LCD_WR_PIN; //GPIO_setOutpuHighOnPin(LCD_WR_BASE ,LCD_WR_PIN); GPIOPinWrite(LCD_WR_BASE, LCD_WR_PIN, LCD_WR_PIN); // /WR=1 } //***************************************************************************** // // Writes a command to the SSD2119. This function implements the basic GPIO // interface to the LCD display. // //***************************************************************************** static void WriteCommandGPIO(unsigned short ucData) { // HWREG(LCD_CS_BASE + GPIO_O_DATA + (LCD_CS_PIN << 2)) = 0; // // Write the most significant byte of the data to the bus. This is always // 0 since commands are no more than 8 bits. // GPIOPinWrite(LCD_DATAH_BASE, LCD_DATAH_PINS , 0x00); // Data Bus OUT SET_LCD_DATA(0); // // Assert DC GPIOPinWrite(LCD_DC_BASE, LCD_DC_PIN, 0x00); // D/C=0 // // Assert the write enable signal. We need to do this 2 times to ensure // that we don't violate the timing requirements for the display. GPIOPinWrite(LCD_WR_BASE, LCD_WR_PIN, 0x00); GPIOPinWrite(LCD_WR_BASE, LCD_WR_PIN, 0x00); // // Deassert the write enable signal. // //HWREG(LCD_WR_BASE + GPIO_O_DATA + (LCD_WR_PIN << 2)) = LCD_WR_PIN; //HWREG(LCD_WR_BASE + GPIO_O_DATA + (LCD_WR_PIN << 2)) = LCD_WR_PIN; //GPIO_setOutpuHighOnPin(LCD_WR_BASE ,LCD_WR_PIN); GPIOPinWrite(LCD_WR_BASE, LCD_WR_PIN, LCD_WR_PIN); // /WR=1 // Write the least significant byte of the data to the bus. // SET_LCD_DATA(ucData); SET_LCD_DATA(ucData & 0x07); // // Assert the write enable signal. // //HWREG(LCD_WR_BASE + GPIO_O_DATA + (LCD_WR_PIN << 2)) = 0; //HWREG(LCD_WR_BASE + GPIO_O_DATA + (LCD_WR_PIN << 2)) = 0; GPIOPinWrite(LCD_WR_BASE, LCD_WR_PIN, 0x00); GPIOPinWrite(LCD_WR_BASE, LCD_WR_PIN, 0x00); // // Deassert the write enable signal. // //HWREG(LCD_WR_BASE + GPIO_O_DATA + (LCD_WR_PIN << 2)) = LCD_WR_PIN; //HWREG(LCD_WR_BASE + GPIO_O_DATA + (LCD_WR_PIN << 2)) = LCD_WR_PIN; // GPIO_setOutpuHighOnPin(LCD_WR_BASE ,LCD_WR_PIN); GPIOPinWrite(LCD_WR_BASE, LCD_WR_PIN, LCD_WR_PIN); // /WR=1 // // Set the DC signal high, indicating that following writes are data. // // HWREG(LCD_DC_BASE + GPIO_O_DATA + (LCD_DC_PIN << 2)) = LCD_DC_PIN; GPIOPinWrite(LCD_DC_BASE, LCD_DC_PIN, LCD_DC_PIN); } //***************************************************************************** // // Initializes the pins required for the GPIO-based LCD interface. // // This function configures the GPIO pins used to control the LCD display // when the basic GPIO interface is in use. On exit, the LCD controller // has been reset and is ready to receive command and data writes. // // \return None. // //***************************************************************************** /* static void InitGPIOLCDInterface() { // // Configure the pins that connect to the LCD as GPIO outputs. // GPIOPinTypeGPIOOutput(LCD_DATAH_BASE, LCD_DATAH_PINS); GPIOPinTypeGPIOOutput(LCD_DC_BASE, LCD_DC_PIN); GPIOPinTypeGPIOOutput(LCD_RD_BASE, LCD_RD_PIN); GPIOPinTypeGPIOOutput(LCD_WR_BASE, LCD_WR_PIN); GPIOPinTypeGPIOOutput(LCD_CS_BASE, LCD_CS_PIN); GPIOPinTypeGPIOOutput(LCD_RST_BASE, LCD_RST_PIN); GPIOPadConfigSet(LCD_DATAH_BASE, LCD_DATAH_PINS, GPIO_STRENGTH_8MA, GPIO_PIN_TYPE_STD_WPU ); GPIOPadConfigSet(LCD_DC_BASE, LCD_DC_PIN, GPIO_STRENGTH_8MA, GPIO_PIN_TYPE_STD); GPIOPadConfigSet(LCD_RD_BASE, LCD_RD_PIN, GPIO_STRENGTH_8MA, GPIO_PIN_TYPE_STD); GPIOPadConfigSet(LCD_WR_BASE, LCD_WR_PIN, GPIO_STRENGTH_8MA, GPIO_PIN_TYPE_STD); GPIOPadConfigSet(LCD_CS_BASE, LCD_CS_PIN, GPIO_STRENGTH_8MA, GPIO_PIN_TYPE_STD); GPIOPadConfigSet(LCD_RST_BASE, LCD_RST_PIN, GPIO_STRENGTH_8MA, GPIO_PIN_TYPE_STD); GPIOPinWrite(LCD_DATAH_BASE, LCD_DATAH_PINS, 0xff); GPIOPinWrite(LCD_DC_BASE, LCD_DC_PIN, 0x00); GPIOPinWrite(LCD_RD_BASE, LCD_RD_PIN, LCD_RD_PIN); GPIOPinWrite(LCD_WR_BASE, LCD_WR_PIN, LCD_WR_PIN); GPIOPinWrite(LCD_CS_BASE, LCD_CS_PIN, 0X00); // // Delay for 1ms. // //SysCtlDelay(ulClockMS); SysCtlDelay(SysCtlClockGet()/4); // // Deassert the LCD reset signal. // // GPIOPinWrite(LCD_RST_BASE, LCD_RST_PIN, LCD_RST_PIN); // // Delay for 1ms while the LCD comes out of reset. // //SysCtlDelay(ulClockMS); SysCtlDelay(SysCtlClockGet()/4); } */ //***************************************************************************** // //! Initializes the display driver. //! //! This function initializes the SSD2119 display controller on the panel, //! preparing it to display data. //! //! \return None. // //***************************************************************************** void Kentec480x272x16_SSD1963Init() { unsigned long ulCount; SysCtlPeripheralEnable(LCD_DATAH_PERIPH); SysCtlPeripheralEnable(LCD_DC_PERIPH); SysCtlPeripheralEnable(LCD_RD_PERIPH); SysCtlPeripheralEnable(LCD_WR_PERIPH); SysCtlPeripheralEnable(LCD_CS_PERIPH); SysCtlPeripheralEnable(LCD_RST_PERIPH); GPIOPinTypeGPIOOutput(LCD_DATAH_BASE, LCD_DATAH_PINS); GPIOPinTypeGPIOOutput(LCD_DC_BASE, LCD_DC_PIN); GPIOPinTypeGPIOOutput(LCD_RD_BASE, LCD_RD_PIN); GPIOPinTypeGPIOOutput(LCD_WR_BASE, LCD_WR_PIN); GPIOPinTypeGPIOOutput(LCD_CS_BASE, LCD_CS_PIN); GPIOPinTypeGPIOOutput(LCD_RST_BASE, LCD_RST_PIN); GPIOPadConfigSet(LCD_DATAH_BASE, LCD_DATAH_PINS, GPIO_STRENGTH_8MA, GPIO_PIN_TYPE_STD_WPU ); GPIOPadConfigSet(LCD_DC_BASE, LCD_DC_PIN, GPIO_STRENGTH_8MA, GPIO_PIN_TYPE_STD); GPIOPadConfigSet(LCD_RD_BASE, LCD_RD_PIN, GPIO_STRENGTH_8MA, GPIO_PIN_TYPE_STD); GPIOPadConfigSet(LCD_WR_BASE, LCD_WR_PIN, GPIO_STRENGTH_8MA, GPIO_PIN_TYPE_STD); GPIOPadConfigSet(LCD_CS_BASE, LCD_CS_PIN, GPIO_STRENGTH_8MA, GPIO_PIN_TYPE_STD); GPIOPadConfigSet(LCD_RST_BASE, LCD_RST_PIN, GPIO_STRENGTH_8MA, GPIO_PIN_TYPE_STD); GPIOPinWrite(LCD_DATAH_BASE, LCD_DATAH_PINS, 0xff); GPIOPinWrite(LCD_DC_BASE, LCD_DC_PIN, 0x00); GPIOPinWrite(LCD_RD_BASE, LCD_RD_PIN, LCD_RD_PIN); GPIOPinWrite(LCD_WR_BASE, LCD_WR_PIN, LCD_WR_PIN); GPIOPinWrite(LCD_CS_BASE, LCD_CS_PIN, 0X00); WriteCommand(0x0001); // software reset WriteCommand(0x00E2); //PLL multiplier, set PLL clock to 120M WriteSetting(0x0014);//29 WriteSetting(0x0003); WriteSetting(0x0004); WriteCommand(0x00E0); // PLL enable WriteSetting(0x0001); WriteCommand(0x00E0); WriteSetting(0x0003); WriteCommand(0x00E6); //PLL setting for PCLK, depends on resolution WriteSetting(0x0003);//04 WriteSetting(0x00A0);//B9 WriteSetting(0x0000);//38 WriteCommand(0x00B0); //LCD SPECIFICATION WriteSetting(0x0020);//24 WriteSetting(0x0000); WriteSetting(0x01); //Set HDP WriteSetting(0xDF); WriteSetting(0x01); WriteSetting(0x0F); WriteSetting(0x00); WriteCommand(0x00B4); //HSYNC WriteSetting(0x02); WriteSetting(0x0D); WriteSetting(0x00); WriteSetting(0x25); WriteSetting(0x02); WriteSetting(0x00); WriteSetting(0x00); WriteSetting(0x00); WriteCommand(0x00B6); //VSYNC WriteSetting(0x01); WriteSetting(0x1E); WriteSetting(0x00); WriteSetting(0x08); WriteSetting(0x01); WriteSetting(0x00); WriteSetting(0x00); WriteCommand(0xB8); WriteSetting(0x0007);//GPIO3=input, GPIO[2:0]=output WriteSetting(0x0001);//GPIO0 normal WriteCommand(0xBA); WriteSetting(0x000D);//GPIO[3:0] out 1 //GPIO[1]=0, RESET G2452 WriteCommand(0x36);//rotation WriteSetting(0x0000); WriteCommand(0x00F0); //pixel data interface // WriteSetting(0x0003); WriteSetting(0x0000); WriteCommand(0x00BE); //set PWM for B/L WriteSetting(0x0001);//06 frequency WriteSetting(0x00FF);//C0 duty WriteSetting(0x0009);//bit[3]DBC enable,bit[0]PWM enable WriteSetting(0x00FF);//C0 DBC manual brightness WriteSetting(0x0088);//10 DBC minimum brightness WriteSetting(0x0000);//08 Brightness prescaler WriteCommand(0x00d4); WriteSetting(0x0000); WriteSetting(0x001C); WriteSetting(0x0020); WriteSetting(0x0000); WriteSetting(0x0046); WriteSetting(0x0050); WriteSetting(0x0000); WriteSetting(0x00A8); WriteSetting(0x00C0); WriteCommand(0x00d0); //WriteSetting(0x000D);//DBC Aggressive mode WriteSetting(0x0001);//DBC disable //WriteCommand(0x0021); //Enter Invert Mode WriteCommand(0x0029); //display on // // Clear the contents of the display buffer. // WriteCommand(0x002A); WriteSetting(0); WriteSetting(0); WriteSetting(479>>8); WriteSetting(479&0x00ff); WriteCommand(0x002b); WriteSetting(0); WriteSetting(0); WriteSetting(271>>8); WriteSetting(271&0x00ff); WriteCommand(0x002c); for(ulCount = 0; ulCount < (480 * 272); ulCount++) { WriteData(0x0000); } } //***************************************************************************** // //! Draws a pixel on the screen. //! //! \param pvDisplayData is a pointer to the driver-specific data for this //! display driver. //! \param lX is the X coordinate of the pixel. //! \param lY is the Y coordinate of the pixel. //! \param ulValue is the color of the pixel. //! //! This function sets the given pixel to a particular color. The coordinates //! of the pixel are assumed to be within the extents of the display. //! //! \return None. // //***************************************************************************** static void Kentec480x272x16_SSD1963PixelDraw(void *pvDisplayData, int32_t lX, int32_t lY, uint32_t ulValue) { // // Set the X address of the display cursor. // WriteCommand(0x2A); WriteSetting(MAPPED_X(lX, lY)>>8); WriteSetting(MAPPED_X(lX, lY)&0xff); WriteSetting((LCD_WIDTH-1)>>8); WriteSetting((LCD_WIDTH-1)&0xff); // // Set the Y address of the display cursor. // WriteCommand(0x2B); WriteSetting(MAPPED_Y(lX, lY)>>8); WriteSetting(MAPPED_Y(lX, lY)&0xff); WriteSetting((LCD_HEIGHT-1)>>8); WriteSetting((LCD_HEIGHT-1)&0xff); // // Write the pixel value. // WriteCommand(0x2C); WriteData(ulValue); } void Kentec480x272x16_SSD1963PixelDraw_x(long lX, long lY, unsigned long ulValue) { // // Set the X address of the display cursor. // WriteCommand(0x2A); WriteSetting(MAPPED_X(lX, lY)>>8); WriteSetting(MAPPED_X(lX, lY)&0xff); WriteSetting((LCD_WIDTH-1)>>8); WriteSetting((LCD_WIDTH-1)&0xff); // // Set the Y address of the display cursor. // WriteCommand(0x2B); WriteSetting(MAPPED_Y(lX, lY)>>8); WriteSetting(MAPPED_Y(lX, lY)&0xff); WriteSetting((LCD_HEIGHT-1)>>8); WriteSetting((LCD_HEIGHT-1)&0xff); // // Write the pixel value. // WriteCommand(0x2C); WriteData(ulValue); } //***************************************************************************** // //! Draws a horizontal sequence of pixels on the screen. //! //! \param pvDisplayData is a pointer to the driver-specific data for this //! display driver. //! \param lX is the X coordinate of the first pixel. //! \param lY is the Y coordinate of the first pixel. //! \param lX0 is sub-pixel offset within the pixel data, which is valid for 1 //! or 4 bit per pixel formats. //! \param lCount is the number of pixels to draw. //! \param lBPP is the number of bits per pixel; must be 1, 4, or 8. //! \param pucData is a pointer to the pixel data. For 1 and 4 bit per pixel //! formats, the most significant bit(s) represent the left-most pixel. //! \param pucPalette is a pointer to the palette used to draw the pixels. //! //! This function draws a horizontal sequence of pixels on the screen, using //! the supplied palette. For 1 bit per pixel format, the palette contains //! pre-translated colors; for 4 and 8 bit per pixel formats, the palette //! contains 24-bit RGB values that must be translated before being written to //! the display. //! //! \return None. // //***************************************************************************** static void Kentec480x272x16_SSD1963PixelDrawMultiple(void *pvDisplayData, int32_t lX, int32_t lY, int32_t lX0, int32_t lCount, int32_t lBPP, const unsigned char *pucData, const unsigned char *pucPalette) { unsigned long ulByte; // // Set the cursor increment to left to right, followed by top to bottom. // WriteCommand(0x36); WriteSetting(MAKE_ENTRY_MODE(HORIZ_DIRECTION)); // // Set the X address of the display cursor. // WriteCommand(0x2A); WriteSetting(MAPPED_X(lX, lY)>>8); WriteSetting(MAPPED_X(lX, lY)&0xff); WriteSetting((LCD_WIDTH-1)>>8); WriteSetting((LCD_WIDTH-1)&0xff); // // Set the Y address of the display cursor. // WriteCommand(0x2B); WriteSetting(MAPPED_Y(lX, lY)>>8); WriteSetting(MAPPED_Y(lX, lY)&0xff); WriteSetting((LCD_HEIGHT-1)>>8); WriteSetting((LCD_HEIGHT-1)&0xff); // // Write the data RAM write command. // WriteCommand(0x2C); // // Determine how to interpret the pixel data based on the number of bits // per pixel. // switch(lBPP) { // // The pixel data is in 1 bit per pixel format. // case 1: { // // Loop while there are more pixels to draw. // while(lCount) { // // Get the next byte of image data. // ulByte = *pucData++; // // Loop through the pixels in this byte of image data. // for(; (lX0 < 8) && lCount; lX0++, lCount--) { // // Draw this pixel in the appropriate color. // WriteData(((unsigned long *)pucPalette)[(ulByte >> (7 - lX0)) & 1]); } // // Start at the beginning of the next byte of image data. // lX0 = 0; } // // The image data has been drawn. // break; } // // The pixel data is in 4 bit per pixel format. // case 4: { // // Loop while there are more pixels to draw. "Duff's device" is // used to jump into the middle of the loop if the first nibble of // the pixel data should not be used. Duff's device makes use of // the fact that a case statement is legal anywhere within a // sub-block of a switch statement. See // http://en.wikipedia.org/wiki/Duff's_device for detailed // information about Duff's device. // switch(lX0 & 1) { case 0: while(lCount) { // // Get the upper nibble of the next byte of pixel data // and extract the corresponding entry from the // palette. // ulByte = (*pucData >> 4) * 3; ulByte = (*(unsigned long *)(pucPalette + ulByte) & 0x00ffffff); // // Translate this palette entry and write it to the // screen. // WriteData(DPYCOLORTRANSLATE(ulByte)); // // Decrement the count of pixels to draw. // lCount--; // // See if there is another pixel to draw. // if(lCount) { case 1: // // Get the lower nibble of the next byte of pixel // data and extract the corresponding entry from // the palette. // ulByte = (*pucData++ & 15) * 3; ulByte = (*(unsigned long *)(pucPalette + ulByte) & 0x00ffffff); // // Translate this palette entry and write it to the // screen. // WriteData(DPYCOLORTRANSLATE(ulByte)); // // Decrement the count of pixels to draw. // lCount--; } } } // // The image data has been drawn. // break; } // // The pixel data is in 8 bit per pixel format. // case 8: { // // Loop while there are more pixels to draw. // while(lCount--) { // // Get the next byte of pixel data and extract the // corresponding entry from the palette. // ulByte = *pucData++ * 3; ulByte = *(unsigned long *)(pucPalette + ulByte) & 0x00ffffff; // // Translate this palette entry and write it to the screen. // WriteData(DPYCOLORTRANSLATE(ulByte)); } // // The image data has been drawn. // break; } } // UARTprintf("\n\Draw Multi Pixel finish \n"); } //***************************************************************************** // //! Draws a horizontal line. //! //! \param pvDisplayData is a pointer to the driver-specific data for this //! display driver. //! \param lX1 is the X coordinate of the start of the line. //! \param lX2 is the X coordinate of the end of the line. //! \param lY is the Y coordinate of the line. //! \param ulValue is the color of the line. //! //! This function draws a horizontal line on the display. The coordinates of //! the line are assumed to be within the extents of the display. //! //! \return None. // //***************************************************************************** static void Kentec480x272x16_SSD1963LineDrawH(void *pvDisplayData, int32_t lX1, int32_t lX2, int32_t lY, uint32_t ulValue) { // // Set the cursor increment to left to right, followed by top to bottom. // WriteCommand(0x36); WriteSetting(MAKE_ENTRY_MODE(HORIZ_DIRECTION)); // // Set the X address of the display cursor. // WriteCommand(0x2A); WriteSetting(MAPPED_X(lX1, lY)>>8); WriteSetting(MAPPED_X(lX1, lY)&0xff); WriteSetting((LCD_WIDTH-1)>>8); WriteSetting((LCD_WIDTH-1)&0xff); // // Set the Y address of the display cursor. // WriteCommand(0x2B); WriteSetting(MAPPED_Y(lX1, lY)>>8); WriteSetting(MAPPED_Y(lX1, lY)&0xff); WriteSetting((LCD_HEIGHT-1)>>8); WriteSetting((LCD_HEIGHT-1)&0xff); // // Write the data RAM write command. // WriteCommand(0x2C); // // Loop through the pixels of this horizontal line. // while(lX1++ <= lX2) { // // Write the pixel value. // WriteData(ulValue); } //UARTprintf("\n\Draw Horiz finish %d \n",MAKE_ENTRY_MODE(HORIZ_DIRECTION)); } //***************************************************************************** // //! Draws a vertical line. //! //! \param pvDisplayData is a pointer to the driver-specific data for this //! display driver. //! \param lX is the X coordinate of the line. //! \param lY1 is the Y coordinate of the start of the line. //! \param lY2 is the Y coordinate of the end of the line. //! \param ulValue is the color of the line. //! //! This function draws a vertical line on the display. The coordinates of the //! line are assumed to be within the extents of the display. //! //! \return None. // //***************************************************************************** static void Kentec480x272x16_SSD1963LineDrawV(void *pvDisplayData, int32_t lX, int32_t lY1, int32_t lY2, uint32_t ulValue) { // // Set the cursor increment to top to bottom, followed by left to right. // WriteCommand(0x36); WriteSetting(MAKE_ENTRY_MODE(VERT_DIRECTION)); // // Set the X address of the display cursor. // WriteCommand(0x2A); WriteSetting(MAPPED_X(lX, lY1)>>8); WriteSetting(MAPPED_X(lX, lY1)&0xff); WriteSetting((LCD_WIDTH-1)>>8); WriteSetting((LCD_WIDTH-1)&0xff); // // Set the Y address of the display cursor. // WriteCommand(0x2B); WriteSetting(MAPPED_Y(lX, lY1)>>8); WriteSetting(MAPPED_Y(lX, lY1)&0xff); WriteSetting((LCD_HEIGHT-1)>>8); WriteSetting((LCD_HEIGHT-1)&0xff); // // Write the data RAM write command. // WriteCommand(0x2C); // // Loop through the pixels of this vertical line. // while(lY1++ <= lY2) { // // Write the pixel value. // WriteData(ulValue); } //UARTprintf("\n\Draw Vertical over \n"); } //***************************************************************************** // //! Fills a rectangle. //! //! \param pvDisplayData is a pointer to the driver-specific data for this //! display driver. //! \param pRect is a pointer to the structure describing the rectangle. //! \param ulValue is the color of the rectangle. //! //! This function fills a rectangle on the display. The coordinates of the //! rectangle are assumed to be within the extents of the display, and the //! rectangle specification is fully inclusive (in other words, both sXMin and //! sXMax are drawn, along with sYMin and sYMax). //! //! \return None. // //***************************************************************************** static void Kentec480x272x16_SSD1963RectFill(void *pvDisplayData, const tRectangle *pRect, uint32_t ulValue) { long lCount_x, lCount_y; // unsigned int HDP_S=799; // unsigned int VDP_S=479; // // / Set the cursor increment to top to bottom, followed by left to right. // WriteCommand(0x36); WriteSetting(MAKE_ENTRY_MODE(HORIZ_DIRECTION)); // // Set the display cursor to the upper left of the rectangle (in application // coordinate space). // WriteCommand(0x2A); WriteSetting(MAPPED_X(pRect->i16XMin, pRect->i16YMin)>>8); WriteSetting(MAPPED_X(pRect->i16XMin, pRect->i16YMin)&0xff); #if (defined PORTRAIT) || (defined LANDSCAPE) WriteSetting(MAPPED_X(pRect->i16XMax, pRect->i16YMax)>>8); WriteSetting(MAPPED_X(pRect->i16XMax, pRect->i16YMax)&0xff); #else WriteSetting(MAPPED_X(pRect->i16XMin, pRect->i16YMin)>>8); WriteSetting(MAPPED_X(pRect->i16XMin, pRect->i16YMin)&0xff); #endif WriteCommand(0x2B); WriteSetting(MAPPED_Y(pRect->i16XMin, pRect->i16YMin)>>8); WriteSetting(MAPPED_Y(pRect->i16XMin, pRect->i16YMin)&0xff); #if (defined LANDSCAPE_FLIP) || (defined PORTRAIT) WriteSetting((MAPPED_Y(pRect->i16XMin, pRect->i16YMin) | (MAPPED_Y(pRect->i16XMax, pRect->i16YMax) << 8))>>8); WriteSetting((MAPPED_Y(pRect->i16XMin, pRect->i16YMin) | (MAPPED_Y(pRect->i16XMax, pRect->i16YMax) << 8))&0xff); #else WriteSetting((MAPPED_Y(pRect->i16XMax, pRect->i16YMax) | (MAPPED_Y(pRect->i16XMin, pRect->i16YMin) << 8))>>8); WriteSetting((MAPPED_Y(pRect->i16XMax, pRect->i16YMax) | (MAPPED_Y(pRect->i16XMin, pRect->i16YMin) << 8))&0xff); #endif // // Tell the controller we are about to write data into its RAM. // WriteCommand(0x2C); for(lCount_y =(pRect->i16YMax - pRect->i16YMin);lCount_y >= 0; lCount_y--) { for(lCount_x =(pRect->i16XMax - pRect->i16XMin);lCount_x >= 0; lCount_x--) // // Write the pixel value. // WriteData(ulValue); } } //***************************************************************************** // //! Translates a 24-bit RGB color to a display driver-specific color. //! //! \param pvDisplayData is a pointer to the driver-specific data for this //! display driver. //! \param ulValue is the 24-bit RGB color. The least-significant byte is the //! blue channel, the next byte is the green channel, and the third byte is the //! red channel. //! //! This function translates a 24-bit RGB color into a value that can be //! written into the display's frame buffer in order to reproduce that color, //! or the closest possible approximation of that color. //! //! \return Returns the display-driver specific color. // //***************************************************************************** static uint32_t Kentec480x272x16_SSD1963ColorTranslate(void *pvDisplayData, uint32_t ulValue) { // // Translate from a 24-bit RGB color to a 5-6-5 RGB color. // return(DPYCOLORTRANSLATE(ulValue)); } //***************************************************************************** // //! Flushes any cached drawing operations. //! //! \param pvDisplayData is a pointer to the driver-specific data for this //! display driver. //! //! This functions flushes any cached drawing operations to the display. This //! is useful when a local frame buffer is used for drawing operations, and the //! flush would copy the local frame buffer to the display. For the SSD1963 //! driver, the flush is a no operation. //! //! \return None. // //***************************************************************************** static void Kentec480x272x16_SSD1963Flush(void *pvDisplayData) { // // There is nothing to be done. // } //***************************************************************************** // //! The display structure that describes the driver for the Kentec Display //! K430WQC-V3-F TFT panel with an SSD1963 controller. // //***************************************************************************** const tDisplay g_sLcd480x272x16_8bit = { sizeof(tDisplay), 0, #if defined(PORTRAIT) || defined(PORTRAIT_FLIP) LCD_HEIGHT, LCD_WIDTH, #else LCD_WIDTH, LCD_HEIGHT, #endif Kentec480x272x16_SSD1963PixelDraw, Kentec480x272x16_SSD1963PixelDrawMultiple, Kentec480x272x16_SSD1963LineDrawH, Kentec480x272x16_SSD1963LineDrawV, Kentec480x272x16_SSD1963RectFill, Kentec480x272x16_SSD1963ColorTranslate, Kentec480x272x16_SSD1963Flush }; //***************************************************************************** // // Close the Doxygen group. //! @} // //********
#include <stdint.h> #include <stdbool.h> #include "inc/hw_memmap.h" #include "inc/hw_nvic.h" #include "inc/hw_sysctl.h" #include "inc/hw_types.h" #include "driverlib/fpu.h" #include "driverlib/gpio.h" #include "driverlib/flash.h" #include "driverlib/sysctl.h" #include "driverlib/systick.h" #include "driverlib/uart.h" #include "driverlib/udma.h" #include "driverlib/rom.h" #include "driverlib/rom_map.h" #include "grlib/grlib.h" #include "utils/ustdlib.h" #include "Kentec480x272x16_SSD1963_8bit.h" //extern const uint8_t g_pui8Image[]; volatile uint32_t g_ui32SysClock; tContext sContext; tRectangle sRect; int main(void) { g_ui32SysClock = SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480), 120000000); // // Initialize the display driver. // Kentec480x272x16_SSD1963Init(); // // Initialize the graphics context. // GrContextInit(&sContext, &g_sLcd480x272x16_8bit); while(1) { // /* // Fill the top 24 rows of the screen with blue to create the banner. // sRect.i16XMin = 0; sRect.i16YMin = 0; sRect.i16XMax = GrContextDpyWidthGet(&sContext) - 1; sRect.i16YMax = 23; GrContextForegroundSet(&sContext, ClrDarkBlue); GrRectFill(&sContext, &sRect); */ sRect.i16XMin = 0; sRect.i16YMin = 0; sRect.i16XMax = 319; sRect.i16YMax = 239; GrContextForegroundSet(&sContext, ClrHotPink ); GrRectFill(&sContext, &sRect); SysCtlDelay(SysCtlClockGet()/4); sRect.i16XMin = 0; sRect.i16YMin = 0; sRect.i16XMax = 319; sRect.i16YMax = 239; GrContextForegroundSet(&sContext, ClrLightBlue ); GrRectFill(&sContext, &sRect); SysCtlDelay(SysCtlClockGet()); sRect.i16XMin = 0; sRect.i16YMin = 239; sRect.i16XMax = 319; sRect.i16YMax = 0; GrContextForegroundSet(&sContext, ClrLightGoldenrodYellow ); GrRectFill(&sContext, &sRect); SysCtlDelay(SysCtlClockGet()); sRect.i16XMin = 0; sRect.i16YMin = 0; sRect.i16XMax = 319; sRect.i16YMax = 239; GrContextForegroundSet(&sContext, ClrOrangeRed ); GrRectFill(&sContext, &sRect); } }