Code to run the cheap 2.4" TFT made by mcufriend.com on the STM nucleo. No modifications required, this plugs into the arduino header.

Dependents:   ST7735_V2_STM32F407

Fork of TFTLCD_8bit by Thiha Electronics

Revision:
15:af3cd35886fb
Parent:
12:d0978272a340
Child:
16:4ccc2fa2cfec
--- a/ssd1289.cpp	Tue Dec 11 20:52:22 2012 +0000
+++ b/ssd1289.cpp	Tue Dec 11 23:42:47 2012 +0000
@@ -35,7 +35,7 @@
 void SSD1289_LCD::Initialize( orientation_t orientation, colordepth_t colors )
 {
     _orientation = orientation;
-    _colorDepth = RGB16;
+    _colorDepth = colors;
     
     _lcd_pin_reset = HIGH;
     wait_ms( 5 );
@@ -51,48 +51,126 @@
     wait_ms( 15 );
     
     Activate();
-    WriteCmdData( 0x00, 0x0001 ); wait_ms( 1 );
-    WriteCmdData( 0x03, 0xA8A4 ); wait_ms( 1 );
-    WriteCmdData( 0x0C, 0x0000 ); wait_ms( 1 );
-    WriteCmdData( 0x0D, 0x080C ); wait_ms( 1 );
-    WriteCmdData( 0x0E, 0x2B00 ); wait_ms( 1 );
-    WriteCmdData( 0x1E, 0x00B7 ); wait_ms( 1 );
-    WriteCmdData( 0x01, 0x2B3F ); wait_ms( 1 );
-    WriteCmdData( 0x02, 0x0600 ); wait_ms( 1 );
-    WriteCmdData( 0x10, 0x0000 ); wait_ms( 1 );
-    WriteCmdData( 0x11, 0x6070 ); wait_ms( 1 );
-    WriteCmdData( 0x05, 0x0000 ); wait_ms( 1 );
-    WriteCmdData( 0x06, 0x0000 ); wait_ms( 1 );
-    WriteCmdData( 0x16, 0xEF1C ); wait_ms( 1 );
-    WriteCmdData( 0x17, 0x0003 ); wait_ms( 1 );
-    WriteCmdData( 0x07, 0x0233 ); wait_ms( 1 );
-    WriteCmdData( 0x0B, 0x0000 ); wait_ms( 1 );
-    WriteCmdData( 0x0F, 0x0000 ); wait_ms( 1 );
-    WriteCmdData( 0x41, 0x0000 ); wait_ms( 1 );
-    WriteCmdData( 0x42, 0x0000 ); wait_ms( 1 );
-    WriteCmdData( 0x48, 0x0000 ); wait_ms( 1 );
-    WriteCmdData( 0x49, 0x013F ); wait_ms( 1 );
-    WriteCmdData( 0x4A, 0x0000 ); wait_ms( 1 );
-    WriteCmdData( 0x4B, 0x0000 ); wait_ms( 1 );
-    WriteCmdData( 0x44, 0xEF00 ); wait_ms( 1 );
-    WriteCmdData( 0x45, 0x0000 ); wait_ms( 1 );
-    WriteCmdData( 0x46, 0x013F ); wait_ms( 1 );
-    WriteCmdData( 0x30, 0x0707 ); wait_ms( 1 );
-    WriteCmdData( 0x31, 0x0204 ); wait_ms( 1 );
-    WriteCmdData( 0x32, 0x0204 ); wait_ms( 1 );
-    WriteCmdData( 0x33, 0x0502 ); wait_ms( 1 );
-    WriteCmdData( 0x34, 0x0507 ); wait_ms( 1 );
-    WriteCmdData( 0x35, 0x0204 ); wait_ms( 1 );
-    WriteCmdData( 0x36, 0x0204 ); wait_ms( 1 );
-    WriteCmdData( 0x37, 0x0502 ); wait_ms( 1 );
-    WriteCmdData( 0x3A, 0x0302 ); wait_ms( 1 );
-    WriteCmdData( 0x3B, 0x0302 ); wait_ms( 1 );
-    WriteCmdData( 0x23, 0x0000 ); wait_ms( 1 );
-    WriteCmdData( 0x24, 0x0000 ); wait_ms( 1 );
-    WriteCmdData( 0x25, 0x8000 ); wait_ms( 1 );
-    WriteCmdData( 0x4f, 0x0000 ); wait_ms( 1 );
-    WriteCmdData( 0x4e, 0x0000 ); wait_ms( 1 );
-    WriteCmd( 0x22 );
+    WriteCmdData( 0x00, 0x0001 ); // oscillator: 1 = on, 0 = off
+    wait_ms( 1 );
+    WriteCmdData( 0x03, 0xA8A4 ); // power control
+    wait_ms( 1 );
+    WriteCmdData( 0x0C, 0x0000 ); // power control 2
+    wait_ms( 1 );
+    WriteCmdData( 0x0D, 0x080C ); // power control 3
+    wait_ms( 1 );
+    WriteCmdData( 0x0E, 0x2B00 ); // power control 4
+    wait_ms( 1 );
+    WriteCmdData( 0x1E, 0x00B7 ); // power control 5
+    wait_ms( 1 );
+    WriteCmdData( 0x01, 0x2B3F ); // driver output control
+    wait_ms( 1 );
+    WriteCmdData( 0x02, 0x0600 ); // driving waveform control
+    wait_ms( 1 );
+    WriteCmdData( 0x10, 0x0000 ); // sleep mode: 0 = exit, 1 = enter
+    wait_ms( 1 );
+    if ( _colorDepth == RGB16 )
+    {
+        switch ( _orientation )
+        {
+            case LANDSCAPE:
+                WriteCmdData( 0x11, 0x6098 ); // entry mode
+                break;
+            case PORTRAIT_REV:
+                WriteCmdData( 0x11, 0x6080 ); // entry mode
+                break;
+            case LANDSCAPE_REV:
+                WriteCmdData( 0x11, 0x60A8 ); // entry mode
+                break;
+            case PORTRAIT:
+            default:
+                WriteCmdData( 0x11, 0x60B0 ); // entry mode
+                break;
+        }
+    }
+    else if ( _colorDepth == RGB18 )
+    {
+        switch ( _orientation )
+        {
+            case LANDSCAPE:
+                WriteCmdData( 0x11, 0x4098 ); // entry mode
+                break;
+            case PORTRAIT_REV:
+                WriteCmdData( 0x11, 0x4080 ); // entry mode
+                break;
+            case LANDSCAPE_REV:
+                WriteCmdData( 0x11, 0x40A8 ); // entry mode
+                break;
+            case PORTRAIT:
+            default:
+                WriteCmdData( 0x11, 0x40B0 ); // entry mode
+                break;
+        }
+    }
+    wait_ms( 1 );
+    WriteCmdData( 0x05, 0x0000 ); // compare register
+    wait_ms( 1 );
+    WriteCmdData( 0x06, 0x0000 ); // compare register
+    wait_ms( 1 );
+    WriteCmdData( 0x16, 0xEF1C ); // horizontal porch
+    wait_ms( 1 );
+    WriteCmdData( 0x17, 0x0003 ); // vertical porch
+    wait_ms( 1 );
+    WriteCmdData( 0x07, 0x0233 ); // display control
+    wait_ms( 1 );
+    WriteCmdData( 0x0B, 0x0000 ); // frame cycle control
+    wait_ms( 1 );
+    WriteCmdData( 0x0F, 0x0000 ); // gate scan position
+    wait_ms( 1 );
+    WriteCmdData( 0x41, 0x0000 ); // vertical scroll control
+    wait_ms( 1 );
+    WriteCmdData( 0x42, 0x0000 ); // vertical scroll control
+    wait_ms( 1 );
+    WriteCmdData( 0x48, 0x0000 ); // 1st screen driving position
+    wait_ms( 1 );
+    WriteCmdData( 0x49, 0x013F ); // 1st screen driving position
+    wait_ms( 1 );
+    WriteCmdData( 0x4A, 0x0000 ); // 2nd screen driving position
+    wait_ms( 1 );
+    WriteCmdData( 0x4B, 0x0000 ); // 2nd screen driving position
+    wait_ms( 1 );
+    WriteCmdData( 0x44, 0xEF00 ); // horizontal ram address position
+    wait_ms( 1 );
+    WriteCmdData( 0x45, 0x0000 ); // vertical ram address position
+    wait_ms( 1 );
+    WriteCmdData( 0x46, 0x013F ); // vertical ram address position
+    wait_ms( 1 );
+    WriteCmdData( 0x30, 0x0707 ); // gamma control
+    wait_ms( 1 );
+    WriteCmdData( 0x31, 0x0204 ); // gamma control
+    wait_ms( 1 );
+    WriteCmdData( 0x32, 0x0204 ); // gamma control
+    wait_ms( 1 );
+    WriteCmdData( 0x33, 0x0502 ); // gamma control
+    wait_ms( 1 );
+    WriteCmdData( 0x34, 0x0507 ); // gamma control
+    wait_ms( 1 );
+    WriteCmdData( 0x35, 0x0204 ); // gamma control
+    wait_ms( 1 );
+    WriteCmdData( 0x36, 0x0204 ); // gamma control
+    wait_ms( 1 );
+    WriteCmdData( 0x37, 0x0502 ); // gamma control
+    wait_ms( 1 );
+    WriteCmdData( 0x3A, 0x0302 ); // gamma control
+    wait_ms( 1 );
+    WriteCmdData( 0x3B, 0x0302 ); // gamma control
+    wait_ms( 1 );
+    WriteCmdData( 0x23, 0x0000 ); // GRAM write mask for red and green pins
+    wait_ms( 1 );
+    WriteCmdData( 0x24, 0x0000 ); // GRAM write mask for blue pins
+    wait_ms( 1 );
+    WriteCmdData( 0x25, 0x8000 ); // frame frequency control
+    wait_ms( 1 );
+    WriteCmdData( 0x4e, 0x0000 ); // ram address set
+    wait_ms( 1 );
+    WriteCmdData( 0x4f, 0x0000 ); // ram address set
+    wait_ms( 1 );
+    WriteCmd( 0x22 ); // write GRAM
     Deactivate();
 }
 
@@ -126,15 +204,6 @@
 
 void SSD1289_LCD::SetXY( uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2 )
 {
-    if ( _orientation == LANDSCAPE )
-    {
-        swap( uint16_t, x1, y1 )
-        swap( uint16_t, x2, y2 )
-        y1 = _disp_height - y1;
-        y2 = _disp_height - y2;
-        swap( uint16_t, y1, y2 )
-    }
-
     WriteCmdData( 0x44, ( x2 << 8 ) + x1 );
     WriteCmdData( 0x45, y1 );
     WriteCmdData( 0x46, y2 );
@@ -149,6 +218,12 @@
     r = ( color >> 16 ) & 0xFF;
     g = ( color >> 8 ) & 0xFF;
     b = color & 0xFF;
-    unsigned short clr = ( ( ( ( r ) & 0xF8 ) | ( ( g ) >> 5 ) ) << 8 ) | ( ( ( ( g ) & 0x1C ) << 3 ) | ( ( b ) >> 3 ) );
-    WriteData( clr );
+    if ( _colorDepth == RGB16 )
+    {
+        unsigned short clr = ( ( ( ( r ) & 0xF8 ) | ( ( g ) >> 5 ) ) << 8 ) | ( ( ( ( g ) & 0x1C ) << 3 ) | ( ( b ) >> 3 ) );
+        WriteData( clr );
+    }
+    else if ( _colorDepth == RGB18 )
+    {
+    }
 }