2.8" TFT LCD Module (LGDP4531) with T/P , SPI Access, support LCD Only driver(Alpha) and *UNSTABLE* (wrong initialize?) .

Dependencies:   mbed

Committer:
mio
Date:
Wed Jun 16 12:10:45 2010 +0000
Revision:
1:0ed5d89363b8
Parent:
0:0e33d9ea9a2e

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mio 0:0e33d9ea9a2e 1 //
mio 1:0ed5d89363b8 2 // SPILCD_QVGA -- mio
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 1:0ed5d89363b8 122 spi.frequency(4000000);
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 LCD_WR_REG(0x03,0x1038);
mio 0:0e33d9ea9a2e 162
mio 0:0e33d9ea9a2e 163 LCD_WR_REG(0x08,0x0202);
mio 0:0e33d9ea9a2e 164 LCD_WR_REG(0x09,0x0000);
mio 0:0e33d9ea9a2e 165 LCD_WR_REG(0x0A,0x0000);
mio 0:0e33d9ea9a2e 166 LCD_WR_REG(0x0C,0x0001); // 16bit , Internal
mio 0:0e33d9ea9a2e 167
mio 0:0e33d9ea9a2e 168 LCD_WR_REG(0x30,0x0000);
mio 0:0e33d9ea9a2e 169 LCD_WR_REG(0x31,0x0402);
mio 0:0e33d9ea9a2e 170 LCD_WR_REG(0x32,0x0106);
mio 0:0e33d9ea9a2e 171 LCD_WR_REG(0x33,0x0700);
mio 0:0e33d9ea9a2e 172 LCD_WR_REG(0x34,0x0104);
mio 0:0e33d9ea9a2e 173 LCD_WR_REG(0x35,0x0301);
mio 0:0e33d9ea9a2e 174 LCD_WR_REG(0x36,0x0707);
mio 0:0e33d9ea9a2e 175 LCD_WR_REG(0x37,0x0305);
mio 0:0e33d9ea9a2e 176 LCD_WR_REG(0x38,0x0208);
mio 0:0e33d9ea9a2e 177 LCD_WR_REG(0x39,0x0F0B);
mio 0:0e33d9ea9a2e 178 wait_ms(15);
mio 0:0e33d9ea9a2e 179 LCD_WR_REG(0x41,0x0002);
mio 0:0e33d9ea9a2e 180 LCD_WR_REG(0x60,0x2700);
mio 0:0e33d9ea9a2e 181 LCD_WR_REG(0x61,0x0001);
mio 0:0e33d9ea9a2e 182 LCD_WR_REG(0x90,0x0119);
mio 0:0e33d9ea9a2e 183 LCD_WR_REG(0x92,0x010A);
mio 0:0e33d9ea9a2e 184 LCD_WR_REG(0x93,0x0004);
mio 0:0e33d9ea9a2e 185 LCD_WR_REG(0xA0,0x0100);
mio 0:0e33d9ea9a2e 186 LCD_WR_REG(0x07,0x0001);
mio 0:0e33d9ea9a2e 187 wait_ms(15);
mio 0:0e33d9ea9a2e 188 LCD_WR_REG(0x07,0x0021);
mio 0:0e33d9ea9a2e 189 wait_ms(15);
mio 0:0e33d9ea9a2e 190 LCD_WR_REG(0x07,0x0023);
mio 0:0e33d9ea9a2e 191 wait_ms(15);
mio 0:0e33d9ea9a2e 192 LCD_WR_REG(0x07,0x0033);
mio 0:0e33d9ea9a2e 193 wait_ms(15);
mio 0:0e33d9ea9a2e 194 LCD_WR_REG(0x07,0x0133);
mio 0:0e33d9ea9a2e 195 wait_ms(20);
mio 0:0e33d9ea9a2e 196 LCD_WR_REG(0xA0,0x0000);
mio 0:0e33d9ea9a2e 197 wait_ms(20);
mio 0:0e33d9ea9a2e 198 } else {
mio 0:0e33d9ea9a2e 199 pc.printf("UNKNOWN LCD\r\n") ;
mio 0:0e33d9ea9a2e 200 }
mio 0:0e33d9ea9a2e 201 }
mio 0:0e33d9ea9a2e 202
mio 0:0e33d9ea9a2e 203 public:
mio 0:0e33d9ea9a2e 204
mio 0:0e33d9ea9a2e 205 // constructor
mio 0:0e33d9ea9a2e 206 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 207 : cs(cs_pin), rst(rst_pin), spi(mosi_pin, miso_pin, sclk_pin),pc(tx_pin,rx_pin) {
mio 0:0e33d9ea9a2e 208 rw = 0 ;
mio 0:0e33d9ea9a2e 209 rs = 0 ;
mio 0:0e33d9ea9a2e 210 init() ;
mio 0:0e33d9ea9a2e 211 }
mio 0:0e33d9ea9a2e 212
mio 0:0e33d9ea9a2e 213 // wipe all screen
mio 0:0e33d9ea9a2e 214 void filltest(u16 Color) {
mio 0:0e33d9ea9a2e 215 u32 temp;
mio 0:0e33d9ea9a2e 216 u16 x,y ;
mio 0:0e33d9ea9a2e 217 Lcd_SetCursor(0,0);
mio 0:0e33d9ea9a2e 218 Lcd_WR_Start();
mio 0:0e33d9ea9a2e 219 rs = 1 ;
mio 0:0e33d9ea9a2e 220 for (x = 0;x < 240;x++) {
mio 0:0e33d9ea9a2e 221 for (y = 0;y < 320;y++) {
mio 0:0e33d9ea9a2e 222 // Lcd_SetCursor(x,y);
mio 0:0e33d9ea9a2e 223 // LCD_WR_REG(0x22,Color);
mio 0:0e33d9ea9a2e 224 csout(0) ;
mio 0:0e33d9ea9a2e 225 DataToWrite(Color);
mio 0:0e33d9ea9a2e 226 csout(1) ;
mio 0:0e33d9ea9a2e 227 Color++ ;
mio 0:0e33d9ea9a2e 228 }
mio 0:0e33d9ea9a2e 229 }
mio 0:0e33d9ea9a2e 230 rs = 0 ;
mio 0:0e33d9ea9a2e 231 }
mio 0:0e33d9ea9a2e 232 };
mio 0:0e33d9ea9a2e 233
mio 0:0e33d9ea9a2e 234 #endif