2.8" TFT LCD Module (LGDP4531) with T/P , SPI Access, support LCD Only driver(Alpha) and *UNSTABLE* (wrong initialize?) .
spilcd_qvga.h@0:0e33d9ea9a2e, 2010-06-16 (annotated)
- Committer:
- mio
- Date:
- Wed Jun 16 11:17:27 2010 +0000
- Revision:
- 0:0e33d9ea9a2e
- Child:
- 1:0ed5d89363b8
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
mio | 0:0e33d9ea9a2e | 1 | // |
mio | 0:0e33d9ea9a2e | 2 | // SPILCD_QVGA -- miolab |
mio | 0:0e33d9ea9a2e | 3 | // This code is based on http://mbed.org/users/Sim/programs/SPILCDsample |
mio | 0:0e33d9ea9a2e | 4 | // |
mio | 0:0e33d9ea9a2e | 5 | // 2010/06/16 - Now Supports only "LGDP4531" and screen fill test "filltest()" command only (Alpha level). |
mio | 0:0e33d9ea9a2e | 6 | // |
mio | 0:0e33d9ea9a2e | 7 | |
mio | 0:0e33d9ea9a2e | 8 | #ifndef __SPILCD_QVGA_H__ |
mio | 0:0e33d9ea9a2e | 9 | #define __SPILCD_QVGA_H__ |
mio | 0:0e33d9ea9a2e | 10 | |
mio | 0:0e33d9ea9a2e | 11 | #include "mbed.h" |
mio | 0:0e33d9ea9a2e | 12 | |
mio | 0:0e33d9ea9a2e | 13 | typedef unsigned int u32 ; |
mio | 0:0e33d9ea9a2e | 14 | typedef unsigned short u16 ; |
mio | 0:0e33d9ea9a2e | 15 | typedef unsigned char u8 ; |
mio | 0:0e33d9ea9a2e | 16 | |
mio | 0:0e33d9ea9a2e | 17 | class SPILCD_QVGA { |
mio | 0:0e33d9ea9a2e | 18 | private: |
mio | 0:0e33d9ea9a2e | 19 | int rs,rw; |
mio | 0:0e33d9ea9a2e | 20 | |
mio | 0:0e33d9ea9a2e | 21 | DigitalOut cs, rst; |
mio | 0:0e33d9ea9a2e | 22 | SPI spi; |
mio | 0:0e33d9ea9a2e | 23 | Serial pc; |
mio | 0:0e33d9ea9a2e | 24 | |
mio | 0:0e33d9ea9a2e | 25 | void reset(u16 data) { |
mio | 0:0e33d9ea9a2e | 26 | rst = data ; |
mio | 0:0e33d9ea9a2e | 27 | } |
mio | 0:0e33d9ea9a2e | 28 | |
mio | 0:0e33d9ea9a2e | 29 | void csout(u16 data) { |
mio | 0:0e33d9ea9a2e | 30 | if (data == 0) { |
mio | 0:0e33d9ea9a2e | 31 | cs = 0 ; |
mio | 0:0e33d9ea9a2e | 32 | // debug |
mio | 0:0e33d9ea9a2e | 33 | // pc.printf("[") ; |
mio | 0:0e33d9ea9a2e | 34 | } else { |
mio | 0:0e33d9ea9a2e | 35 | cs = 1 ; |
mio | 0:0e33d9ea9a2e | 36 | // debug |
mio | 0:0e33d9ea9a2e | 37 | // pc.printf("]\r\n") ; |
mio | 0:0e33d9ea9a2e | 38 | } |
mio | 0:0e33d9ea9a2e | 39 | } |
mio | 0:0e33d9ea9a2e | 40 | |
mio | 0:0e33d9ea9a2e | 41 | void DataToWriteBegin(void) { |
mio | 0:0e33d9ea9a2e | 42 | u8 d ; |
mio | 0:0e33d9ea9a2e | 43 | d = (0x70 | (rs ? 0x02 : 0x00) | (rw ? 0x01 : 0x00)) ; |
mio | 0:0e33d9ea9a2e | 44 | spi.write(d) ; |
mio | 0:0e33d9ea9a2e | 45 | // debug |
mio | 0:0e33d9ea9a2e | 46 | // pc.printf("%02X",d) ; |
mio | 0:0e33d9ea9a2e | 47 | } |
mio | 0:0e33d9ea9a2e | 48 | |
mio | 0:0e33d9ea9a2e | 49 | u16 DataToWrite16(u16 data) { |
mio | 0:0e33d9ea9a2e | 50 | u8 hiout,loout ; |
mio | 0:0e33d9ea9a2e | 51 | u8 hi,lo ; |
mio | 0:0e33d9ea9a2e | 52 | hiout = (u8)((data & 0xFF00) >> 8) ; |
mio | 0:0e33d9ea9a2e | 53 | hi = spi.write(hiout); |
mio | 0:0e33d9ea9a2e | 54 | // debug |
mio | 0:0e33d9ea9a2e | 55 | // pc.printf("%02X",hi) ; |
mio | 0:0e33d9ea9a2e | 56 | loout = ((u8)(data & 0x00FF)) ; |
mio | 0:0e33d9ea9a2e | 57 | lo = spi.write(loout); |
mio | 0:0e33d9ea9a2e | 58 | // debug |
mio | 0:0e33d9ea9a2e | 59 | // pc.printf("%02X",lo) ; |
mio | 0:0e33d9ea9a2e | 60 | return (u16)((hi << 8) + lo) ; |
mio | 0:0e33d9ea9a2e | 61 | } |
mio | 0:0e33d9ea9a2e | 62 | |
mio | 0:0e33d9ea9a2e | 63 | void DataToWrite(u16 data) { |
mio | 0:0e33d9ea9a2e | 64 | DataToWriteBegin() ; |
mio | 0:0e33d9ea9a2e | 65 | DataToWrite16(data) ; |
mio | 0:0e33d9ea9a2e | 66 | } |
mio | 0:0e33d9ea9a2e | 67 | |
mio | 0:0e33d9ea9a2e | 68 | u16 DataToRead(u16 dummy) { |
mio | 0:0e33d9ea9a2e | 69 | rw = 1 ; |
mio | 0:0e33d9ea9a2e | 70 | DataToWriteBegin() ; |
mio | 0:0e33d9ea9a2e | 71 | rw = 0 ; |
mio | 0:0e33d9ea9a2e | 72 | // spi.write(0x00) ; // dummy 1 byte read ?? |
mio | 0:0e33d9ea9a2e | 73 | return DataToWrite16(dummy) ; |
mio | 0:0e33d9ea9a2e | 74 | } |
mio | 0:0e33d9ea9a2e | 75 | |
mio | 0:0e33d9ea9a2e | 76 | void LCD_WR_REG(u16 Index,u16 CongfigTemp) { |
mio | 0:0e33d9ea9a2e | 77 | csout(0) ; |
mio | 0:0e33d9ea9a2e | 78 | rs = 0 ; |
mio | 0:0e33d9ea9a2e | 79 | DataToWrite(Index); |
mio | 0:0e33d9ea9a2e | 80 | csout(1) ; |
mio | 0:0e33d9ea9a2e | 81 | wait_us(1); |
mio | 0:0e33d9ea9a2e | 82 | csout(0) ; |
mio | 0:0e33d9ea9a2e | 83 | rs = 1 ; |
mio | 0:0e33d9ea9a2e | 84 | DataToWrite(CongfigTemp); |
mio | 0:0e33d9ea9a2e | 85 | csout(1) ; |
mio | 0:0e33d9ea9a2e | 86 | } |
mio | 0:0e33d9ea9a2e | 87 | |
mio | 0:0e33d9ea9a2e | 88 | u16 LCD_RD_REG(u16 Index) { |
mio | 0:0e33d9ea9a2e | 89 | u16 result ; |
mio | 0:0e33d9ea9a2e | 90 | csout(0) ; |
mio | 0:0e33d9ea9a2e | 91 | rs = 0 ; |
mio | 0:0e33d9ea9a2e | 92 | DataToWrite(Index); |
mio | 0:0e33d9ea9a2e | 93 | csout(1) ; |
mio | 0:0e33d9ea9a2e | 94 | wait_us(1); |
mio | 0:0e33d9ea9a2e | 95 | csout(0) ; |
mio | 0:0e33d9ea9a2e | 96 | rs = 1 ; |
mio | 0:0e33d9ea9a2e | 97 | result = DataToRead(0x0000); |
mio | 0:0e33d9ea9a2e | 98 | csout(1) ; |
mio | 0:0e33d9ea9a2e | 99 | return result ; |
mio | 0:0e33d9ea9a2e | 100 | } |
mio | 0:0e33d9ea9a2e | 101 | |
mio | 0:0e33d9ea9a2e | 102 | |
mio | 0:0e33d9ea9a2e | 103 | void Lcd_WR_Start(void) { |
mio | 0:0e33d9ea9a2e | 104 | csout(0) ; |
mio | 0:0e33d9ea9a2e | 105 | rs = 0 ; |
mio | 0:0e33d9ea9a2e | 106 | DataToWrite(0x0022); |
mio | 0:0e33d9ea9a2e | 107 | csout(1) ; |
mio | 0:0e33d9ea9a2e | 108 | wait_us(1); |
mio | 0:0e33d9ea9a2e | 109 | csout(0) ; |
mio | 0:0e33d9ea9a2e | 110 | rs = 1 ; |
mio | 0:0e33d9ea9a2e | 111 | } |
mio | 0:0e33d9ea9a2e | 112 | |
mio | 0:0e33d9ea9a2e | 113 | void Lcd_SetCursor(u16 x,u16 y) { |
mio | 0:0e33d9ea9a2e | 114 | LCD_WR_REG(0x20,x); |
mio | 0:0e33d9ea9a2e | 115 | LCD_WR_REG(0x21,y); |
mio | 0:0e33d9ea9a2e | 116 | } |
mio | 0:0e33d9ea9a2e | 117 | |
mio | 0:0e33d9ea9a2e | 118 | // boot up sequence |
mio | 0:0e33d9ea9a2e | 119 | void init() { |
mio | 0:0e33d9ea9a2e | 120 | u16 i ; |
mio | 0:0e33d9ea9a2e | 121 | spi.format(8,3); // SPI mode = 3 |
mio | 0:0e33d9ea9a2e | 122 | spi.frequency(2000000); // |
mio | 0:0e33d9ea9a2e | 123 | |
mio | 0:0e33d9ea9a2e | 124 | // reset |
mio | 0:0e33d9ea9a2e | 125 | reset(1); |
mio | 0:0e33d9ea9a2e | 126 | wait_ms(200); |
mio | 0:0e33d9ea9a2e | 127 | reset(0); |
mio | 0:0e33d9ea9a2e | 128 | wait_ms(200); |
mio | 0:0e33d9ea9a2e | 129 | reset(1); |
mio | 0:0e33d9ea9a2e | 130 | |
mio | 0:0e33d9ea9a2e | 131 | // initialize sequence |
mio | 0:0e33d9ea9a2e | 132 | DataToWrite16(0xffff); |
mio | 0:0e33d9ea9a2e | 133 | wait_ms(10); |
mio | 0:0e33d9ea9a2e | 134 | LCD_WR_REG(0x0000,0x0001); |
mio | 0:0e33d9ea9a2e | 135 | wait_ms(10); |
mio | 0:0e33d9ea9a2e | 136 | |
mio | 0:0e33d9ea9a2e | 137 | u16 id = LCD_RD_REG(0x0000) ; // CHECK LCD TYPE (ID READ) |
mio | 0:0e33d9ea9a2e | 138 | pc.printf("CHIP ID=%04X\r\n",id) ; |
mio | 0:0e33d9ea9a2e | 139 | |
mio | 0:0e33d9ea9a2e | 140 | if (id == 0x4531) { |
mio | 0:0e33d9ea9a2e | 141 | csout(0); |
mio | 0:0e33d9ea9a2e | 142 | DataToWrite16(0x0); |
mio | 0:0e33d9ea9a2e | 143 | DataToWrite16(0x0); |
mio | 0:0e33d9ea9a2e | 144 | csout(1); |
mio | 0:0e33d9ea9a2e | 145 | wait_ms(10); |
mio | 0:0e33d9ea9a2e | 146 | |
mio | 0:0e33d9ea9a2e | 147 | // Setup display |
mio | 0:0e33d9ea9a2e | 148 | LCD_WR_REG(0x10,0x0628); |
mio | 0:0e33d9ea9a2e | 149 | LCD_WR_REG(0x12,0x0006); |
mio | 0:0e33d9ea9a2e | 150 | LCD_WR_REG(0x13,0x0A32); |
mio | 0:0e33d9ea9a2e | 151 | LCD_WR_REG(0x11,0x0040); |
mio | 0:0e33d9ea9a2e | 152 | LCD_WR_REG(0x15,0x0050); |
mio | 0:0e33d9ea9a2e | 153 | LCD_WR_REG(0x12,0x0016); |
mio | 0:0e33d9ea9a2e | 154 | wait_ms(15); |
mio | 0:0e33d9ea9a2e | 155 | LCD_WR_REG(0x10,0x5660); |
mio | 0:0e33d9ea9a2e | 156 | wait_ms(15); |
mio | 0:0e33d9ea9a2e | 157 | LCD_WR_REG(0x13,0x2A4E); |
mio | 0:0e33d9ea9a2e | 158 | |
mio | 0:0e33d9ea9a2e | 159 | LCD_WR_REG(0x01,0x0100); |
mio | 0:0e33d9ea9a2e | 160 | LCD_WR_REG(0x02,0x0300); |
mio | 0:0e33d9ea9a2e | 161 | |
mio | 0:0e33d9ea9a2e | 162 | #ifdef USE_PORTRAIT |
mio | 0:0e33d9ea9a2e | 163 | LCD_WR_REG(0x03,0x1030); |
mio | 0:0e33d9ea9a2e | 164 | #else |
mio | 0:0e33d9ea9a2e | 165 | LCD_WR_REG(0x03,0x1038); |
mio | 0:0e33d9ea9a2e | 166 | #endif |
mio | 0:0e33d9ea9a2e | 167 | |
mio | 0:0e33d9ea9a2e | 168 | LCD_WR_REG(0x08,0x0202); |
mio | 0:0e33d9ea9a2e | 169 | LCD_WR_REG(0x09,0x0000); |
mio | 0:0e33d9ea9a2e | 170 | LCD_WR_REG(0x0A,0x0000); |
mio | 0:0e33d9ea9a2e | 171 | LCD_WR_REG(0x0C,0x0001); // 16bit , Internal |
mio | 0:0e33d9ea9a2e | 172 | |
mio | 0:0e33d9ea9a2e | 173 | LCD_WR_REG(0x30,0x0000); |
mio | 0:0e33d9ea9a2e | 174 | LCD_WR_REG(0x31,0x0402); |
mio | 0:0e33d9ea9a2e | 175 | LCD_WR_REG(0x32,0x0106); |
mio | 0:0e33d9ea9a2e | 176 | LCD_WR_REG(0x33,0x0700); |
mio | 0:0e33d9ea9a2e | 177 | LCD_WR_REG(0x34,0x0104); |
mio | 0:0e33d9ea9a2e | 178 | LCD_WR_REG(0x35,0x0301); |
mio | 0:0e33d9ea9a2e | 179 | LCD_WR_REG(0x36,0x0707); |
mio | 0:0e33d9ea9a2e | 180 | LCD_WR_REG(0x37,0x0305); |
mio | 0:0e33d9ea9a2e | 181 | LCD_WR_REG(0x38,0x0208); |
mio | 0:0e33d9ea9a2e | 182 | LCD_WR_REG(0x39,0x0F0B); |
mio | 0:0e33d9ea9a2e | 183 | wait_ms(15); |
mio | 0:0e33d9ea9a2e | 184 | LCD_WR_REG(0x41,0x0002); |
mio | 0:0e33d9ea9a2e | 185 | LCD_WR_REG(0x60,0x2700); |
mio | 0:0e33d9ea9a2e | 186 | LCD_WR_REG(0x61,0x0001); |
mio | 0:0e33d9ea9a2e | 187 | LCD_WR_REG(0x90,0x0119); |
mio | 0:0e33d9ea9a2e | 188 | LCD_WR_REG(0x92,0x010A); |
mio | 0:0e33d9ea9a2e | 189 | LCD_WR_REG(0x93,0x0004); |
mio | 0:0e33d9ea9a2e | 190 | LCD_WR_REG(0xA0,0x0100); |
mio | 0:0e33d9ea9a2e | 191 | LCD_WR_REG(0x07,0x0001); |
mio | 0:0e33d9ea9a2e | 192 | wait_ms(15); |
mio | 0:0e33d9ea9a2e | 193 | LCD_WR_REG(0x07,0x0021); |
mio | 0:0e33d9ea9a2e | 194 | wait_ms(15); |
mio | 0:0e33d9ea9a2e | 195 | LCD_WR_REG(0x07,0x0023); |
mio | 0:0e33d9ea9a2e | 196 | wait_ms(15); |
mio | 0:0e33d9ea9a2e | 197 | LCD_WR_REG(0x07,0x0033); |
mio | 0:0e33d9ea9a2e | 198 | wait_ms(15); |
mio | 0:0e33d9ea9a2e | 199 | LCD_WR_REG(0x07,0x0133); |
mio | 0:0e33d9ea9a2e | 200 | wait_ms(20); |
mio | 0:0e33d9ea9a2e | 201 | LCD_WR_REG(0xA0,0x0000); |
mio | 0:0e33d9ea9a2e | 202 | wait_ms(20); |
mio | 0:0e33d9ea9a2e | 203 | } else { |
mio | 0:0e33d9ea9a2e | 204 | pc.printf("UNKNOWN LCD\r\n") ; |
mio | 0:0e33d9ea9a2e | 205 | } |
mio | 0:0e33d9ea9a2e | 206 | } |
mio | 0:0e33d9ea9a2e | 207 | |
mio | 0:0e33d9ea9a2e | 208 | public: |
mio | 0:0e33d9ea9a2e | 209 | |
mio | 0:0e33d9ea9a2e | 210 | // constructor |
mio | 0:0e33d9ea9a2e | 211 | SPILCD_QVGA(PinName cs_pin, PinName rst_pin, PinName mosi_pin, PinName miso_pin, PinName sclk_pin,PinName tx_pin,PinName rx_pin) |
mio | 0:0e33d9ea9a2e | 212 | : cs(cs_pin), rst(rst_pin), spi(mosi_pin, miso_pin, sclk_pin),pc(tx_pin,rx_pin) { |
mio | 0:0e33d9ea9a2e | 213 | rw = 0 ; |
mio | 0:0e33d9ea9a2e | 214 | rs = 0 ; |
mio | 0:0e33d9ea9a2e | 215 | init() ; |
mio | 0:0e33d9ea9a2e | 216 | } |
mio | 0:0e33d9ea9a2e | 217 | |
mio | 0:0e33d9ea9a2e | 218 | // wipe all screen |
mio | 0:0e33d9ea9a2e | 219 | void filltest(u16 Color) { |
mio | 0:0e33d9ea9a2e | 220 | u32 temp; |
mio | 0:0e33d9ea9a2e | 221 | u16 x,y ; |
mio | 0:0e33d9ea9a2e | 222 | Lcd_SetCursor(0,0); |
mio | 0:0e33d9ea9a2e | 223 | Lcd_WR_Start(); |
mio | 0:0e33d9ea9a2e | 224 | rs = 1 ; |
mio | 0:0e33d9ea9a2e | 225 | for (x = 0;x < 240;x++) { |
mio | 0:0e33d9ea9a2e | 226 | for (y = 0;y < 320;y++) { |
mio | 0:0e33d9ea9a2e | 227 | // Lcd_SetCursor(x,y); |
mio | 0:0e33d9ea9a2e | 228 | // LCD_WR_REG(0x22,Color); |
mio | 0:0e33d9ea9a2e | 229 | csout(0) ; |
mio | 0:0e33d9ea9a2e | 230 | DataToWrite(Color); |
mio | 0:0e33d9ea9a2e | 231 | csout(1) ; |
mio | 0:0e33d9ea9a2e | 232 | Color++ ; |
mio | 0:0e33d9ea9a2e | 233 | } |
mio | 0:0e33d9ea9a2e | 234 | } |
mio | 0:0e33d9ea9a2e | 235 | rs = 0 ; |
mio | 0:0e33d9ea9a2e | 236 | } |
mio | 0:0e33d9ea9a2e | 237 | }; |
mio | 0:0e33d9ea9a2e | 238 | |
mio | 0:0e33d9ea9a2e | 239 | #endif |