2.8" TFT LCD Module (LGDP4531) with T/P , SPI Access, support LCD Only driver(Alpha) and *UNSTABLE* (wrong initialize?) .
spilcd_qvga.h
00001 // 00002 // SPILCD_QVGA -- mio 00003 // This code is based on http://mbed.org/users/Sim/programs/SPILCDsample 00004 // 00005 // 2010/06/16 - Now Supports only "LGDP4531" and screen fill test "filltest()" command only (Alpha level). 00006 // 00007 00008 #ifndef __SPILCD_QVGA_H__ 00009 #define __SPILCD_QVGA_H__ 00010 00011 #include "mbed.h" 00012 00013 typedef unsigned int u32 ; 00014 typedef unsigned short u16 ; 00015 typedef unsigned char u8 ; 00016 00017 class SPILCD_QVGA { 00018 private: 00019 int rs,rw; 00020 00021 DigitalOut cs, rst; 00022 SPI spi; 00023 Serial pc; 00024 00025 void reset(u16 data) { 00026 rst = data ; 00027 } 00028 00029 void csout(u16 data) { 00030 if (data == 0) { 00031 cs = 0 ; 00032 // debug 00033 // pc.printf("[") ; 00034 } else { 00035 cs = 1 ; 00036 // debug 00037 // pc.printf("]\r\n") ; 00038 } 00039 } 00040 00041 void DataToWriteBegin(void) { 00042 u8 d ; 00043 d = (0x70 | (rs ? 0x02 : 0x00) | (rw ? 0x01 : 0x00)) ; 00044 spi.write(d) ; 00045 // debug 00046 // pc.printf("%02X",d) ; 00047 } 00048 00049 u16 DataToWrite16(u16 data) { 00050 u8 hiout,loout ; 00051 u8 hi,lo ; 00052 hiout = (u8)((data & 0xFF00) >> 8) ; 00053 hi = spi.write(hiout); 00054 // debug 00055 // pc.printf("%02X",hi) ; 00056 loout = ((u8)(data & 0x00FF)) ; 00057 lo = spi.write(loout); 00058 // debug 00059 // pc.printf("%02X",lo) ; 00060 return (u16)((hi << 8) + lo) ; 00061 } 00062 00063 void DataToWrite(u16 data) { 00064 DataToWriteBegin() ; 00065 DataToWrite16(data) ; 00066 } 00067 00068 u16 DataToRead(u16 dummy) { 00069 rw = 1 ; 00070 DataToWriteBegin() ; 00071 rw = 0 ; 00072 // spi.write(0x00) ; // dummy 1 byte read ?? 00073 return DataToWrite16(dummy) ; 00074 } 00075 00076 void LCD_WR_REG(u16 Index,u16 CongfigTemp) { 00077 csout(0) ; 00078 rs = 0 ; 00079 DataToWrite(Index); 00080 csout(1) ; 00081 wait_us(1); 00082 csout(0) ; 00083 rs = 1 ; 00084 DataToWrite(CongfigTemp); 00085 csout(1) ; 00086 } 00087 00088 u16 LCD_RD_REG(u16 Index) { 00089 u16 result ; 00090 csout(0) ; 00091 rs = 0 ; 00092 DataToWrite(Index); 00093 csout(1) ; 00094 wait_us(1); 00095 csout(0) ; 00096 rs = 1 ; 00097 result = DataToRead(0x0000); 00098 csout(1) ; 00099 return result ; 00100 } 00101 00102 00103 void Lcd_WR_Start(void) { 00104 csout(0) ; 00105 rs = 0 ; 00106 DataToWrite(0x0022); 00107 csout(1) ; 00108 wait_us(1); 00109 csout(0) ; 00110 rs = 1 ; 00111 } 00112 00113 void Lcd_SetCursor(u16 x,u16 y) { 00114 LCD_WR_REG(0x20,x); 00115 LCD_WR_REG(0x21,y); 00116 } 00117 00118 // boot up sequence 00119 void init() { 00120 u16 i ; 00121 spi.format(8,3); // SPI mode = 3 00122 spi.frequency(4000000); 00123 00124 // reset 00125 reset(1); 00126 wait_ms(200); 00127 reset(0); 00128 wait_ms(200); 00129 reset(1); 00130 00131 // initialize sequence 00132 DataToWrite16(0xffff); 00133 wait_ms(10); 00134 LCD_WR_REG(0x0000,0x0001); 00135 wait_ms(10); 00136 00137 u16 id = LCD_RD_REG(0x0000) ; // CHECK LCD TYPE (ID READ) 00138 pc.printf("CHIP ID=%04X\r\n",id) ; 00139 00140 if (id == 0x4531) { 00141 csout(0); 00142 DataToWrite16(0x0); 00143 DataToWrite16(0x0); 00144 csout(1); 00145 wait_ms(10); 00146 00147 // Setup display 00148 LCD_WR_REG(0x10,0x0628); 00149 LCD_WR_REG(0x12,0x0006); 00150 LCD_WR_REG(0x13,0x0A32); 00151 LCD_WR_REG(0x11,0x0040); 00152 LCD_WR_REG(0x15,0x0050); 00153 LCD_WR_REG(0x12,0x0016); 00154 wait_ms(15); 00155 LCD_WR_REG(0x10,0x5660); 00156 wait_ms(15); 00157 LCD_WR_REG(0x13,0x2A4E); 00158 00159 LCD_WR_REG(0x01,0x0100); 00160 LCD_WR_REG(0x02,0x0300); 00161 LCD_WR_REG(0x03,0x1038); 00162 00163 LCD_WR_REG(0x08,0x0202); 00164 LCD_WR_REG(0x09,0x0000); 00165 LCD_WR_REG(0x0A,0x0000); 00166 LCD_WR_REG(0x0C,0x0001); // 16bit , Internal 00167 00168 LCD_WR_REG(0x30,0x0000); 00169 LCD_WR_REG(0x31,0x0402); 00170 LCD_WR_REG(0x32,0x0106); 00171 LCD_WR_REG(0x33,0x0700); 00172 LCD_WR_REG(0x34,0x0104); 00173 LCD_WR_REG(0x35,0x0301); 00174 LCD_WR_REG(0x36,0x0707); 00175 LCD_WR_REG(0x37,0x0305); 00176 LCD_WR_REG(0x38,0x0208); 00177 LCD_WR_REG(0x39,0x0F0B); 00178 wait_ms(15); 00179 LCD_WR_REG(0x41,0x0002); 00180 LCD_WR_REG(0x60,0x2700); 00181 LCD_WR_REG(0x61,0x0001); 00182 LCD_WR_REG(0x90,0x0119); 00183 LCD_WR_REG(0x92,0x010A); 00184 LCD_WR_REG(0x93,0x0004); 00185 LCD_WR_REG(0xA0,0x0100); 00186 LCD_WR_REG(0x07,0x0001); 00187 wait_ms(15); 00188 LCD_WR_REG(0x07,0x0021); 00189 wait_ms(15); 00190 LCD_WR_REG(0x07,0x0023); 00191 wait_ms(15); 00192 LCD_WR_REG(0x07,0x0033); 00193 wait_ms(15); 00194 LCD_WR_REG(0x07,0x0133); 00195 wait_ms(20); 00196 LCD_WR_REG(0xA0,0x0000); 00197 wait_ms(20); 00198 } else { 00199 pc.printf("UNKNOWN LCD\r\n") ; 00200 } 00201 } 00202 00203 public: 00204 00205 // constructor 00206 SPILCD_QVGA(PinName cs_pin, PinName rst_pin, PinName mosi_pin, PinName miso_pin, PinName sclk_pin,PinName tx_pin,PinName rx_pin) 00207 : cs(cs_pin), rst(rst_pin), spi(mosi_pin, miso_pin, sclk_pin),pc(tx_pin,rx_pin) { 00208 rw = 0 ; 00209 rs = 0 ; 00210 init() ; 00211 } 00212 00213 // wipe all screen 00214 void filltest(u16 Color) { 00215 u32 temp; 00216 u16 x,y ; 00217 Lcd_SetCursor(0,0); 00218 Lcd_WR_Start(); 00219 rs = 1 ; 00220 for (x = 0;x < 240;x++) { 00221 for (y = 0;y < 320;y++) { 00222 // Lcd_SetCursor(x,y); 00223 // LCD_WR_REG(0x22,Color); 00224 csout(0) ; 00225 DataToWrite(Color); 00226 csout(1) ; 00227 Color++ ; 00228 } 00229 } 00230 rs = 0 ; 00231 } 00232 }; 00233 00234 #endif
Generated on Fri Jul 22 2022 02:00:09 by 1.7.2