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

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers spilcd_qvga.h Source File

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