LCD TFT for ssd0139 driver 8 bit mode

Dependents:   receiver TFT_CJS_ssd0139 poster8x8_ranger

Fork of LCDTFT by Ale C.-

/media/uploads/cstevens/20140902_103801.jpg

Files at this revision

API Documentation at this revision

Comitter:
cstevens
Date:
Tue Sep 02 09:02:18 2014 +0000
Parent:
1:1085b6177f6e
Child:
3:f999653c1069
Commit message:
based on fuentes library for tft lcd - this does the ssd0139 samsung driver for 240x320 color screens like those often sold on ebay

Changed in this revision

LCDTFT.cpp Show annotated file Show diff for this revision Revisions of this file
LCDTFT.h Show annotated file Show diff for this revision Revisions of this file
--- a/LCDTFT.cpp	Tue Mar 15 01:47:35 2011 +0000
+++ b/LCDTFT.cpp	Tue Sep 02 09:02:18 2014 +0000
@@ -14,8 +14,8 @@
 ////                                                                   ////
 ////                                                                   ////
 ////        (C) Copyright 2011 www.micros-designs.com.ar               ////
-//// Este código puede ser usado, modificado y distribuido libremente  ////
-//// sin eliminar esta cabecera y  sin garantía de ningún tipo.        ////
+//// Este c�digo puede ser usado, modificado y distribuido libremente  ////
+//// sin eliminar esta cabecera y  sin garant�a de ning�n tipo.        ////
 ////                                                                   ////
 ////                                                                   ////
 /////////////////////////////////////////////////////////////////////////// 
@@ -31,8 +31,62 @@
     _Alto=1;
     _Color=0x0000;
 }
+// global variable for screen orientation set by init
+bool orient=0;
 
-void LCDTFT::vLCDTFTSetParametersPrintf(unsigned short Xo,unsigned short Yo,unsigned short Xmin,unsigned short Xmax,unsigned char Alto, unsigned short Color){
+ static const unsigned short regValues[] = {
+    0x0000, 0x0001, // start oscillation
+    0x00FF, 0x0010, // wait 16 ms
+    0x0007, 0x0000, //display control - zeros everything ??? 
+    0x0013, 0x0000, // power control 3 setting = all zero
+    0x0011, 0x2604, //power control 2 seting = gvd voltage 0x26 vci1 voltage 0x04
+    0x0014, 0x0015, // power contrlol 4 setting vcmr=0 vcomh=0 vml=13 = amplitude of vcom voltage
+    0x0010, 0x3C00, // power control 1 bt3=0 sap=7 (0b111) bt=4 (0b100)
+    0x0013, 0x0040, //power control 3 PON=1 PON1=0 AON=0
+    0x00FF,0x0010, // wait 16ms
+    0x0013, 0x0060, // power control 3 PON=1 PON1=1 AON=0    
+    0x00FF, 0x0032, // wait 50ms
+    0x0013, 0x0070, //power control 3 PON=1 PON1=1 AON=1
+    0x00FF, 0x0028, // wait 40ms
+       
+    0x0001, 0x0127,  // driver ouptut control
+    0x0002, 0x0700,  //LCD driving waveform settings
+    0x0003, 0x1030,  // entry mode settingtri=0 dfm=0 bgr=1 id1:id0=11
+    0x0007, 0x0000,  // display control 1 pt1-0=0 vle2-1=0 spt=0 gon=0 rev=0 d1-0=0
+    0x0008, 0x0404,  //black period control fp3-0=4 bp3-0=4
+    0x000B, 0x0200,  //frame cycle setting nd1-0=0 sdt1-0=2 ecs2-0=0 div1-0=0 dcr_ex=0 dcr2-0=0 rtn1-0=0
+    0x000C, 0x0000,  //external interface controlrm=0 dm1-0=0 rim1-0=0
+    0x00015,0x0000,  //sub panel control sub_im1-0=0 stn_en=0 mpu_mode=0 fcv_en=0
+       
+    //gamma setting    
+    0x0030, 0x0000,      
+    0x0031, 0x0606,    
+    0x0032, 0x0006,    
+    0x0033, 0x0403,  
+    0x0034, 0x0107,  
+    0x0035, 0x0101, 
+    0x0036, 0x0707,   
+    0x0037, 0x0304,   
+    0x0038, 0x0A00,     
+    0x0039, 0x0706,     
+       // end of gamma settings
+    0x0040, 0x0000,   // gate scan position (start g1 scan) scn5-0=0
+    0x0041, 0x0000,   // vertical scroll setting vl8-0=0
+    0x0042, 0x013F,   // screen end position se18-10=0x13F
+    0x0043, 0x0000,   // screen_start position ss28-20=0
+    0x0044, 0x0000,   // 2nd screen driving position end 00
+    0x0045, 0x0000,   //2nd screen driving position start =00
+    0x0046, 0xEF00,   //window addre horizontal ram for x0,x1 HEA=0xEF HSA=00 ie x=0 and x=239
+    0x0047, 0x013F,   //vertical ram address end vea=0x13F ie y=319
+    0x0048, 0x0000,    //vertical ram address start=00 ie y=0
+    0x0007, 0x0011,  //dispaly control 1
+    0x00FF, 0x0028, //wait 40ms
+    0x0007, 0x0017,    //display control 1
+
+};
+
+
+void LCDTFT::vLCDTFTSetParametersPrintf(unsigned short Xo,unsigned short Yo,unsigned short Xmin,unsigned short Xmax,unsigned char Alto, unsigned short Color,unsigned short BackColor){
 
     X=Xo;
     Y=Yo;
@@ -40,6 +94,7 @@
     X_max=Xmax;
     _Alto=Alto;
     _Color=Color;
+    _Background=BackColor;
 }
 
 int LCDTFT::_putc(int value){
@@ -47,13 +102,13 @@
 
     if(value=='\n'){
         X=X_min;
-        Y+=7*_Alto + 1;
+        Y+=8*_Alto + 1;
     }else{
-        vLCDTFTText(X,Y,(const char *)&Fmt[0],&ARIAL[0],_Alto,_Color);
+        vLCDTFTText(X,Y,(const char *)&Fmt[0],&ARIAL[0],_Alto,_Color,_Background);
         X+=5*_Alto+1;
         if(X >= X_max){
             X = X_min;                           
-            Y += 7*_Alto + 1;                
+            Y += 8*_Alto + 1;                
         }
     }
     return(value);
@@ -67,16 +122,23 @@
     
     LCD_PIN_RS=0;
     LCD_PIN_CS=0;   
-    LCD_PORT->write(Data);   
+    LCD_PORT->write(Data>>8);   // MSB so with an 8 bit port we need to write here the high and ,low bytes successively
     LCD_PIN_WR=0;
     LCD_PIN_WR=1;
+    LCD_PORT->write(Data & 0x00FF);   // LSB
+    LCD_PIN_WR=0;
+    LCD_PIN_WR=1;
+    
     LCD_PIN_CS=1;   
 }
 
 void LCDTFT::vLCDTFTWriteData(unsigned short Data){
     LCD_PIN_RS=1;
     LCD_PIN_CS=0;   
-    LCD_PORT->write(Data);   
+    LCD_PORT->write(Data>>8);   // MSB so with an 8 bit port we need to write here the high and ,low bytes successively
+    LCD_PIN_WR=0;
+    LCD_PIN_WR=1;
+    LCD_PORT->write(Data & 0x00FF);   // LSB
     LCD_PIN_WR=0;
     LCD_PIN_WR=1;
     LCD_PIN_CS =1;   
@@ -100,23 +162,59 @@
 
 void LCDTFT::vLCDTFTAddressSetPoint(unsigned short x,unsigned short y){ 
 
-    vLCDTFTWriteCommandData(0x004e,x);
-    vLCDTFTWriteCommandData(0x004f,y);
-    vLCDTFTWriteCommand(0x0022);       
+// CGRAM addresses are given by (x+y*256) - for some reason the y cordinate 
+// addresses require 17 bits
+// equiv if y is given by 0xYYY and x by 0xXX
+// then address of point x,y is 0xYYYXXX
+     int add;
+     int adl,adh;
+     if(orient==0){ // portrait
+            add=x+y*256; //240 x 320 y but 256 bytes for each x row
+         
+            }
+    else{
+            add=(239-y)+x*256;
+        }   
+      adl=add & 0x00FF; // selects the 8 low bits
+            adh=(add >>8); // the 9 high bits
+   vLCDTFTWriteCommandData(0x0020,adl); // 8 lsb of address
+   vLCDTFTWriteCommandData(0x0021,adh); //9 msb of address
+    vLCDTFTWriteCommand(0x0022);       // prepare to send rgb data
 }  
 
-void LCDTFT::vLCDTFTInit(void){
+void LCDTFT::vLCDTFTInit(bool format){
 
+    int i;
+    unsigned short  address,data;
+    orient=format;
     LCD_PIN_RESET=1;
-    wait_ms(5);   
+    wait_ms(5);   // must hold for at least 1ms after reset
     LCD_PIN_RESET=0;
-    wait_ms(10);
+    wait_ms(10); // wait for stable R-C oscillation
     LCD_PIN_RESET=1;
+    wait_ms(5); // final wait for rest to be acitvated
     LCD_PIN_CS=1;
     LCD_PIN_RD=1;
     LCD_PIN_WR=1;
     wait_ms(20);
+    
+    for(i=0;i<sizeof(regValues)/4;i++)
+    {
+        address=regValues[i*2];
+        data=regValues[i*2+1];
+        
+        if(address==0xFF)
+        {
+            wait_ms(data);
+            }
+            else {
+                vLCDTFTWriteCommandData(address,data);
+                }
+        }
+        wait_ms(1);
+        
 
+/*
     vLCDTFTWriteCommandData(0x0000,0x0001);    wait_ms(1);  
     vLCDTFTWriteCommandData(0x0003,0xA8A4);    wait_ms(1);  
     vLCDTFTWriteCommandData(0x000C,0x0000);    wait_ms(1);   
@@ -159,11 +257,15 @@
     vLCDTFTWriteCommandData(0x004f,0);        
     vLCDTFTWriteCommandData(0x004e,0);        
     vLCDTFTWriteCommand(0x0022);
+    */
 }
 
 void LCDTFT::vLCDTFTFillScreen(unsigned short Color){
     unsigned short i,j;
-    vLCDTFTAddressSet(0,0,239,319);
+
+     vLCDTFTWriteCommandData(0x0020,00); //set x=0
+    vLCDTFTWriteCommandData(0x0021,00); // set y=0
+    vLCDTFTWriteCommand(0x0022);       
 
     for(i=0;i<320;i++){
         for (j=0;j<240;j++){
@@ -178,7 +280,7 @@
     vLCDTFTWriteData(Color);
 }
  
-void LCDTFT::vLCDTFTText(unsigned short x,unsigned short y,const char *PtrText,const char (*Fuente)[5],unsigned char Alto,unsigned short Color){
+void LCDTFT::vLCDTFTText(unsigned short x,unsigned short y,const char *PtrText,const char (*Fuente)[5],unsigned char Alto,unsigned short Color,unsigned short BackColor){
    unsigned short i, j, k, l, m, temp;           
    char DataPunto[5]; 
    const char *Ptr;
@@ -205,9 +307,16 @@
                        for(l=0; l < Alto; ++l){                         
                           for(m=0; m < Alto; ++m){
                              vLCDTFTPoint(x+m,y+k*Alto+l,Color);
-                          }
-                       }
-                    }
+                          }//endform
+                       }//endforl
+                    }//endif
+                    else{
+                        for(l=0; l < Alto; ++l){                         
+                          for(m=0; m < Alto; ++m){
+                             vLCDTFTPoint(x+m,y+k*Alto+l,BackColor);
+                          }//endform
+                       }//endforl
+                        }
                  }
               }
               x++;
@@ -271,11 +380,11 @@
 void LCDTFT::vLCDTFTRectangle(unsigned short x1,unsigned short y1,unsigned short x2,unsigned short y2,bool Filled,unsigned short Color){
    
     if(Filled){
-        int Lenght=((int)(x2-x1+1)*(y2-y1+1));  
+        int Lenght=(int)(x2-x1);  
        
-        vLCDTFTAddressSet(x1,y1,x2,y2);      
+            
         for(int i=0;i<Lenght;i++){
-            vLCDTFTWriteData(Color);                         
+            vLCDTFTLine(x1,y1+i,x2,y1+i,Color);                         
         }   
     }else{
         vLCDTFTLine(x1, y1, x2, y1, Color);     
@@ -313,7 +422,7 @@
         else P += 5 + 2 * (a++ - b--);
     }while(a <= b);
 }
-
+/*
 void LCDTFT::vDrawImageBMP24Bits(const char *NameImagen){
 
     #define OffsetWidthPixel    18
@@ -391,7 +500,7 @@
     }
     fclose(Imagen);
 }
-
+*/
 void LCDTFT::vLCDTFTDrawImage(unsigned short x,unsigned short y, unsigned short Width, unsigned short Heigh, unsigned int Lenght, const unsigned short *Imagen){
 
     vLCDTFTAddressSet(x,y,x+Width-1,y+Heigh-1);      
--- a/LCDTFT.h	Tue Mar 15 01:47:35 2011 +0000
+++ b/LCDTFT.h	Tue Sep 02 09:02:18 2014 +0000
@@ -14,8 +14,8 @@
 ////                                                                   ////
 ////                                                                   ////
 ////        (C) Copyright 2011 www.micros-designs.com.ar               ////
-//// Este código puede ser usado, modificado y distribuido libremente  ////
-//// sin eliminar esta cabecera y  sin garantía de ningún tipo.        ////
+//// Este c�digo puede ser usado, modificado y distribuido libremente  ////
+//// sin eliminar esta cabecera y  sin garant�a de ning�n tipo.        ////
 ////                                                                   ////
 ////                                                                   ////
 /////////////////////////////////////////////////////////////////////////// 
@@ -68,7 +68,7 @@
 #define    ColorLime            0x7e0
 #define    ColorAqua            0x7ff
 
-#define       LCD_X_MAX            240
+#define       LCD_X_MAX            240 // these swapped
 #define       LCD_Y_MAX            320
 
 class LCDTFT: public Stream {
@@ -84,9 +84,9 @@
          */
         LCDTFT(PinName PIN_RD,PinName PIN_WR,PinName PIN_RS,PinName PIN_CS,PinName PIN_RESET, BusOut *BUSLCD);
         /** Inicializa LCD
-        *
+        * format =0 portrait and 1 for landscape
         */
-        void vLCDTFTInit(void);
+        void vLCDTFTInit(bool format);
         /** Fija parametros para escritura mediante printf
         *
         * @param Xo X inicial
@@ -95,8 +95,9 @@
         * @param Xmax X maximo
         * @param Alto Alto de letra (1,2,3..)
         * @param Color Color de letra 16-bits
+        * and the background color for clearing
         */
-        void vLCDTFTSetParametersPrintf(unsigned short Xo,unsigned short Yo,unsigned short Xmin,unsigned short Xmax,unsigned char Alto, unsigned short Color);
+        void vLCDTFTSetParametersPrintf(unsigned short Xo,unsigned short Yo,unsigned short Xmin,unsigned short Xmax,unsigned char Alto, unsigned short Color, unsigned short BackColor);
         /** Pinta pantalla completa de color
         * @param Color Color de 16-bits
         */
@@ -115,7 +116,7 @@
         * @param Alto Alto de letra (1,2,3)
         * @param Color Color de 16-bits
         */
-        void vLCDTFTText(unsigned short x,unsigned short y,const char *PtrText,const char (*Fuente)[5],unsigned char Alto,unsigned short Color);
+        void vLCDTFTText(unsigned short x,unsigned short y,const char *PtrText,const char (*Fuente)[5],unsigned char Alto,unsigned short Color,unsigned short BackColor);
         
         void vLCDTFTLine(unsigned short x1,unsigned short y1,unsigned short x2,unsigned short y2,unsigned short Color);
         void vLCDTFTRectangle(unsigned short x1,unsigned short y1,unsigned short x2,unsigned short y2,bool Filled,unsigned short Color);
@@ -143,7 +144,7 @@
     private:
         DigitalOut LCD_PIN_RD,LCD_PIN_WR,LCD_PIN_RS,LCD_PIN_CS,LCD_PIN_RESET;    
         BusOut *LCD_PORT;    
-        unsigned short X,Y,X_min,X_max,_Alto,_Color;
+        unsigned short X,Y,X_min,X_max,_Alto,_Color,_Background;
         // Stream implementation functions
         virtual int _putc(int value);
         virtual int _getc();