These are the examples provided for [[/users/frank26080115/libraries/LPC1700CMSIS_Lib/]] Note, the entire "program" is not compilable!
LCD/QVGA_TFT_LCD/GLCD_SPI_LPC1700.c
- Committer:
- frank26080115
- Date:
- 2011-03-20
- Revision:
- 0:bf7b9fba3924
File content as of revision 0:bf7b9fba3924:
/******************************************************************************/ /* GLCD_SPI_LPC1700.c: LPC1700 low level Graphic LCD (320x240 pixels) driven */ /* with SPI functions */ /******************************************************************************/ /* This file is part of the uVision/ARM development tools. */ /* Copyright (c) 2005-2009 Keil Software. All rights reserved. */ /* This software may only be used under the terms of a valid, current, */ /* end user licence from KEIL for a compatible version of KEIL software */ /* development tools. Nothing else gives you the right to use this software. */ /******************************************************************************/ #include <lpc17xx.h> #include "GLCD.h" #include "Font_24x16.h" /*********************** Hardware specific configuration **********************/ /* SPI Interface: SPI3 PINS: - CS = P0.6 (GPIO pin) - RS = GND - WR/SCK = P0.7 (SCK1) - RD = GND - SDO = P0.8 (MISO1) - SDI = P0.9 (MOSI1) */ #define PIN_CS (1 << 6) /* SPI_SR - bit definitions */ #define TFE 0x01 #define RNE 0x04 #define BSY 0x10 /*------------------------- Speed dependant settings -------------------------*/ /* If processor works on high frequency delay has to be increased, it can be increased by factor 2^N by this constant */ #define DELAY_2N 18 /*---------------------- Graphic LCD size definitions ------------------------*/ #define WIDTH 320 /* Screen Width (in pixels) */ #define HEIGHT 240 /* Screen Hight (in pixels) */ #define BPP 16 /* Bits per pixel */ #define BYPP ((BPP+7)/8) /* Bytes per pixel */ /*--------------- Graphic LCD interface hardware definitions -----------------*/ /* Pin CS setting to 0 or 1 */ #define LCD_CS(x) ((x) ? (LPC_GPIO0->FIOSET = PIN_CS) : (LPC_GPIO0->FIOCLR = PIN_CS)); #define SPI_START (0x70) /* Start byte for SPI transfer */ #define SPI_RD (0x01) /* WR bit 1 within start */ #define SPI_WR (0x00) /* WR bit 0 within start */ #define SPI_DATA (0x02) /* RS bit 1 within start byte */ #define SPI_INDEX (0x00) /* RS bit 0 within start byte */ /*---------------------------- Global variables ------------------------------*/ /******************************************************************************/ static volatile unsigned short TextColor = Black, BackColor = White; /************************ Local auxiliary functions ***************************/ /******************************************************************************* * Delay in while loop cycles * * Parameter: cnt: number of while cycles to delay * * Return: * *******************************************************************************/ static void delay (int cnt) { cnt <<= DELAY_2N; while (cnt--); } /******************************************************************************* * Send 1 byte over serial communication * * Parameter: byte: byte to be sent * * Return: byte read while sending * *******************************************************************************/ static __INLINE unsigned char spi_send (unsigned char byte) { LPC_SSP1->DR = byte; while (!(LPC_SSP1->SR & RNE)); /* Wait for send to finish */ return (LPC_SSP1->DR); } /******************************************************************************* * Write command to LCD controller * * Parameter: c: command to be written * * Return: * *******************************************************************************/ static __INLINE void wr_cmd (unsigned char c) { LCD_CS(0) spi_send(SPI_START | SPI_WR | SPI_INDEX); /* Write : RS = 0, RW = 0 */ spi_send(0); spi_send(c); LCD_CS(1) } /******************************************************************************* * Write data to LCD controller * * Parameter: c: data to be written * * Return: * *******************************************************************************/ static __INLINE void wr_dat (unsigned short c) { LCD_CS(0) spi_send(SPI_START | SPI_WR | SPI_DATA); /* Write : RS = 1, RW = 0 */ spi_send((c >> 8)); /* Write D8..D15 */ spi_send((c & 0xFF)); /* Write D0..D7 */ LCD_CS(1) } /******************************************************************************* * Start of data writing to LCD controller * * Parameter: * * Return: * *******************************************************************************/ static __INLINE void wr_dat_start (void) { LCD_CS(0) spi_send(SPI_START | SPI_WR | SPI_DATA); /* Write : RS = 1, RW = 0 */ } /******************************************************************************* * Stop of data writing to LCD controller * * Parameter: * * Return: * *******************************************************************************/ static __INLINE void wr_dat_stop (void) { LCD_CS(1) } /******************************************************************************* * Data writing to LCD controller * * Parameter: c: data to be written * * Return: * *******************************************************************************/ static __INLINE void wr_dat_only (unsigned short c) { spi_send((c >> 8)); /* Write D8..D15 */ spi_send((c & 0xFF)); /* Write D0..D7 */ } /******************************************************************************* * Read data from LCD controller * * Parameter: * * Return: read data * *******************************************************************************/ static __INLINE unsigned short rd_dat (void) { unsigned short val = 0; LCD_CS(0) spi_send(SPI_START | SPI_RD | SPI_DATA); /* Read: RS = 1, RW = 1 */ spi_send(0); /* Dummy read */ val = spi_send(0); /* Read D8..D15 */ val <<= 8; val |= spi_send(0); /* Read D0..D7 */ LCD_CS(1) return (val); } /******************************************************************************* * Write to LCD register * * Parameter: reg: register to be read * * val: value to write to register * *******************************************************************************/ static __INLINE void wr_reg (unsigned char reg, unsigned short val) { wr_cmd(reg); wr_dat(val); } /******************************************************************************* * Read from LCD register * * Parameter: reg: register to be read * * Return: value read from register * *******************************************************************************/ static unsigned short rd_reg (unsigned char reg) { wr_cmd(reg); return (rd_dat()); } /************************ Exported functions **********************************/ /******************************************************************************* * Initialize the Graphic LCD controller * * Parameter: * * Return: * *******************************************************************************/ void GLCD_Init (void) { static unsigned short driverCode; /* Enable clock for SSP1, clock = CCLK / 2 */ LPC_SC->PCONP |= 0x00000400; LPC_SC->PCLKSEL0 |= 0x00200000; /* Configure the LCD Control pins */ LPC_PINCON->PINSEL9 &= 0xF0FFFFFF; LPC_GPIO4->FIODIR |= 0x30000000; LPC_GPIO4->FIOSET = 0x20000000; /* SSEL1 is GPIO output set to high */ LPC_GPIO0->FIODIR |= 0x00000040; LPC_GPIO0->FIOSET = 0x00000040; LPC_PINCON->PINSEL0 &= 0xFFF03FFF; LPC_PINCON->PINSEL0 |= 0x000A8000; /* Enable SPI in Master Mode, CPOL=1, CPHA=1 */ /* Max. 25 MBit used for Data Transfer @ 100MHz */ LPC_SSP1->CR0 = 0xC7; LPC_SSP1->CPSR = 0x02; LPC_SSP1->CR1 = 0x02; delay(5); /* Delay 50 ms */ driverCode = rd_reg(0x00); /* Start Initial Sequence --------------------------------------------------*/ wr_reg(0x01, 0x0100); /* Set SS bit */ wr_reg(0x02, 0x0700); /* Set 1 line inversion */ wr_reg(0x04, 0x0000); /* Resize register */ wr_reg(0x08, 0x0207); /* 2 lines front, 7 back porch */ wr_reg(0x09, 0x0000); /* Set non-disp area refresh cyc ISC */ wr_reg(0x0A, 0x0000); /* FMARK function */ wr_reg(0x0C, 0x0000); /* RGB interface setting */ wr_reg(0x0D, 0x0000); /* Frame marker Position */ wr_reg(0x0F, 0x0000); /* RGB interface polarity */ /* Power On sequence -------------------------------------------------------*/ wr_reg(0x10, 0x0000); /* Reset Power Control 1 */ wr_reg(0x11, 0x0000); /* Reset Power Control 2 */ wr_reg(0x12, 0x0000); /* Reset Power Control 3 */ wr_reg(0x13, 0x0000); /* Reset Power Control 4 */ delay(20); /* Discharge cap power voltage (200ms)*/ wr_reg(0x10, 0x12B0); /* SAP, BT[3:0], AP, DSTB, SLP, STB */ wr_reg(0x11, 0x0007); /* DC1[2:0], DC0[2:0], VC[2:0] */ delay(5); /* Delay 50 ms */ wr_reg(0x12, 0x01BD); /* VREG1OUT voltage */ delay(5); /* Delay 50 ms */ wr_reg(0x13, 0x1400); /* VDV[4:0] for VCOM amplitude */ wr_reg(0x29, 0x000E); /* VCM[4:0] for VCOMH */ delay(5); /* Delay 50 ms */ wr_reg(0x20, 0x0000); /* GRAM horizontal Address */ wr_reg(0x21, 0x0000); /* GRAM Vertical Address */ /* Adjust the Gamma Curve --------------------------------------------------*/ if (driverCode == 0x5408) { /* LCD with touch */ wr_reg(0x30, 0x0B0D); wr_reg(0x31, 0x1923); wr_reg(0x32, 0x1C26); wr_reg(0x33, 0x261C); wr_reg(0x34, 0x2419); wr_reg(0x35, 0x0D0B); wr_reg(0x36, 0x1006); wr_reg(0x37, 0x0610); wr_reg(0x38, 0x0706); wr_reg(0x39, 0x0304); wr_reg(0x3A, 0x0E05); wr_reg(0x3B, 0x0E01); wr_reg(0x3C, 0x010E); wr_reg(0x3D, 0x050E); wr_reg(0x3E, 0x0403); wr_reg(0x3F, 0x0607); } if (driverCode == 0xC990) { /* LCD without touch */ wr_reg(0x30, 0x0006); wr_reg(0x31, 0x0101); wr_reg(0x32, 0x0003); wr_reg(0x35, 0x0106); wr_reg(0x36, 0x0B02); wr_reg(0x37, 0x0302); wr_reg(0x38, 0x0707); wr_reg(0x39, 0x0007); wr_reg(0x3C, 0x0600); wr_reg(0x3D, 0x020B); } /* Set GRAM area -----------------------------------------------------------*/ wr_reg(0x50, 0x0000); /* Horizontal GRAM Start Address */ wr_reg(0x51, (HEIGHT-1)); /* Horizontal GRAM End Address */ wr_reg(0x52, 0x0000); /* Vertical GRAM Start Address */ wr_reg(0x53, (WIDTH-1)); /* Vertical GRAM End Address */ wr_reg(0x60, 0xA700); /* Gate Scan Line */ if (driverCode == 0x5408) /* LCD with touch */ wr_reg(0x60, 0xA700); /* Gate Scan Line */ if (driverCode == 0xC990) /* LCD without touch */ wr_reg(0x60, 0x2700); /* Gate Scan Line */ wr_reg(0x61, 0x0001); /* NDL,VLE, REV */ wr_reg(0x6A, 0x0000); /* Set scrolling line */ /* Partial Display Control -------------------------------------------------*/ wr_reg(0x80, 0x0000); wr_reg(0x81, 0x0000); wr_reg(0x82, 0x0000); wr_reg(0x83, 0x0000); wr_reg(0x84, 0x0000); wr_reg(0x85, 0x0000); /* Panel Control -----------------------------------------------------------*/ wr_reg(0x90, 0x0010); wr_reg(0x92, 0x0000); wr_reg(0x93, 0x0003); wr_reg(0x95, 0x0110); wr_reg(0x97, 0x0000); wr_reg(0x98, 0x0000); /* Set GRAM write direction I/D=10 (Horizontal : increment, Vertical : increment) AM=1 (address is updated in vertical writing direction) */ wr_reg(0x03, 0x1038); wr_reg(0x07, 0x0137); /* 262K color and display ON */ LPC_GPIO4->FIOSET = 0x10000000; } /******************************************************************************* * Set draw window region to whole screen * * Parameter: * * Return: * *******************************************************************************/ void GLCD_WindowMax (void) { wr_reg(0x50, 0); /* Horizontal GRAM Start Address */ wr_reg(0x51, HEIGHT-1); /* Horizontal GRAM End Address (-1) */ wr_reg(0x52, 0); /* Vertical GRAM Start Address */ wr_reg(0x53, WIDTH-1); /* Vertical GRAM End Address (-1) */ } /******************************************************************************* * Draw a pixel in foreground color * * Parameter: x: horizontal position * * y: vertical position * * Return: * *******************************************************************************/ void GLCD_PutPixel (unsigned int x, unsigned int y) { wr_reg(0x20, y); wr_reg(0x21, WIDTH-1-x); wr_cmd(0x22); wr_dat(TextColor); } /******************************************************************************* * Set foreground color * * Parameter: color: foreground color * * Return: * *******************************************************************************/ void GLCD_SetTextColor (unsigned short color) { TextColor = color; } /******************************************************************************* * Set background color * * Parameter: color: background color * * Return: * *******************************************************************************/ void GLCD_SetBackColor (unsigned short color) { BackColor = color; } /******************************************************************************* * Clear display * * Parameter: color: display clearing color * * Return: * *******************************************************************************/ void GLCD_Clear (unsigned short color) { unsigned int i; GLCD_WindowMax(); wr_reg(0x20, 0); wr_reg(0x21, 0); wr_cmd(0x22); wr_dat_start(); for(i = 0; i < (WIDTH*HEIGHT); i++) wr_dat_only(color); wr_dat_stop(); } /******************************************************************************* * Draw character on given position * * Parameter: x: horizontal position * * y: vertical position * * c: pointer to character bitmap * * Return: * *******************************************************************************/ void GLCD_DrawChar (unsigned int x, unsigned int y, unsigned short *c) { int idx = 0, i, j; x = WIDTH-x-CHAR_W; wr_reg(0x50, y); /* Horizontal GRAM Start Address */ wr_reg(0x51, y+CHAR_H-1); /* Horizontal GRAM End Address (-1) */ wr_reg(0x52, x); /* Vertical GRAM Start Address */ wr_reg(0x53, x+CHAR_W-1); /* Vertical GRAM End Address (-1) */ wr_reg(0x20, y); wr_reg(0x21, x); wr_cmd(0x22); wr_dat_start(); for (j = 0; j < CHAR_H; j++) { for (i = CHAR_W-1; i >= 0; i--) { if((c[idx] & (1 << i)) == 0x00) { wr_dat_only(BackColor); } else { wr_dat_only(TextColor); } } c++; } wr_dat_stop(); } /******************************************************************************* * Disply character on given line * * Parameter: ln: line number * * col: column number * * c: ascii character * * Return: * *******************************************************************************/ void GLCD_DisplayChar (unsigned int ln, unsigned int col, unsigned char c) { c -= 32; GLCD_DrawChar(col * CHAR_W, ln * CHAR_H, (unsigned short *)&Font_24x16[c * CHAR_H]); } /******************************************************************************* * Disply string on given line * * Parameter: ln: line number * * col: column number * * s: pointer to string * * Return: * *******************************************************************************/ void GLCD_DisplayString (unsigned int ln, unsigned int col, unsigned char *s) { GLCD_WindowMax(); while (*s) { GLCD_DisplayChar(ln, col++, *s++); } } /******************************************************************************* * Clear given line * * Parameter: ln: line number * * Return: * *******************************************************************************/ void GLCD_ClearLn (unsigned int ln) { GLCD_WindowMax(); GLCD_DisplayString(ln, 0, " "); } /******************************************************************************* * Draw bargraph * * Parameter: x: horizontal position * * y: vertical position * * w: maximum width of bargraph (in pixels) * * val: value of active bargraph (in 1/1024) * * Return: * *******************************************************************************/ void GLCD_Bargraph (unsigned int x, unsigned int y, unsigned int w, unsigned int h, unsigned int val) { int i,j; x = WIDTH-x-w; wr_reg(0x50, y); /* Horizontal GRAM Start Address */ wr_reg(0x51, y+CHAR_H-1); /* Horizontal GRAM End Address (-1) */ wr_reg(0x52, x); /* Vertical GRAM Start Address */ wr_reg(0x53, x+w-1); /* Vertical GRAM End Address (-1) */ val = (val * w) >> 10; /* Scale value for 24x12 characters */ wr_reg(0x20, y); wr_reg(0x21, x); wr_cmd(0x22); wr_dat_start(); for (i = 0; i < h; i++) { for (j = w-1; j >= 0; j--) { if(j >= val) { wr_dat_only(BackColor); } else { wr_dat_only(TextColor); } } } wr_dat_stop(); } /******************************************************************************* * Display graphical bitmap image at position x horizontally and y vertically * * (This function is optimized for 16 bits per pixel format, it has to be * * adapted for any other bits per pixel format) * * Parameter: x: horizontal position * * y: vertical position * * w: width of bitmap * * h: height of bitmap * * bitmap: address at which the bitmap data resides * * Return: * *******************************************************************************/ void GLCD_Bitmap (unsigned int x, unsigned int y, unsigned int w, unsigned int h, unsigned char *bitmap) { unsigned int i, j; unsigned short *bitmap_ptr = (unsigned short *)bitmap; x = WIDTH-x-w; wr_reg(0x50, y); /* Horizontal GRAM Start Address */ wr_reg(0x51, y+h-1); /* Horizontal GRAM End Address (-1) */ wr_reg(0x52, x); /* Vertical GRAM Start Address */ wr_reg(0x53, x+w-1); /* Vertical GRAM End Address (-1) */ wr_reg(0x20, y); wr_reg(0x21, x); wr_cmd(0x22); wr_dat_start(); for (j = 0; j < h; j++) { bitmap_ptr += w-1; for (i = 0; i < w; i++) { wr_dat_only(*bitmap_ptr--); } bitmap_ptr += w+1; } wr_dat_stop(); } /******************************************************************************* * Display graphical bmp file image at position x horizontally and y vertically * * (This function is optimized for 16 bits per pixel format, it has to be * * adapted for any other bits per pixel format) * * Parameter: x: horizontal position * * y: vertical position * * w: width of bitmap * * h: height of bitmap * * bmp: address at which the bmp data resides * * Return: * *******************************************************************************/ void GLCD_Bmp (unsigned int x, unsigned int y, unsigned int w, unsigned int h, unsigned char *bmp) { unsigned int i, j; unsigned short *bitmap_ptr = (unsigned short *)bmp; x = WIDTH-x-w; wr_reg(0x50, y); /* Horizontal GRAM Start Address */ wr_reg(0x51, y+h-1); /* Horizontal GRAM End Address (-1) */ wr_reg(0x52, x); /* Vertical GRAM Start Address */ wr_reg(0x53, x+w-1); /* Vertical GRAM End Address (-1) */ wr_reg(0x20, y); wr_reg(0x21, x); wr_cmd(0x22); wr_dat_start(); bitmap_ptr += (h*w)-1; for (j = 0; j < h; j++) { for (i = 0; i < w; i++) { wr_dat_only(*bitmap_ptr--); } } wr_dat_stop(); } /******************************************************************************/