This is a port of Henning Kralsen's UTFT library for Arduino/chipKIT to mbed, refactored to make full use of C inheritance and access control, in order to reduce work when implementing new drivers and at the same time make the code more readable and easier to maintain. As of now supported are SSD1289 (16-bit interface), HX8340-B (serial interface) and ST7735 (serial interface). Drivers for other controllers will be added as time and resources to acquire the displays to test the code permit.

Dependents:   UTFT_SSD1289

Fork of TFTLCD by Todor Todorov

Revision:
16:4ccc2fa2cfec
Parent:
15:af3cd35886fb
Child:
17:866f2a851dd7
diff -r af3cd35886fb -r 4ccc2fa2cfec ssd1289.cpp
--- a/ssd1289.cpp	Tue Dec 11 23:42:47 2012 +0000
+++ b/ssd1289.cpp	Wed Dec 12 07:17:31 2012 +0000
@@ -63,8 +63,6 @@
     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
@@ -74,17 +72,26 @@
         switch ( _orientation )
         {
             case LANDSCAPE:
-                WriteCmdData( 0x11, 0x6098 ); // entry mode
+                WriteCmdData( 0x01, 0x2B3F ); // driver output control // 0x293F 0x2B3F 0x2D3F 0x2F3F 0x693F 0x6B3F 0x6D3F 0x6F3F
+                wait_ms( 1 );
+                WriteCmdData( 0x11, 0x6030 ); // entry mode // 0x6040 0x6048 0x6050 0x6058 0x6060 0x6068
                 break;
+                
             case PORTRAIT_REV:
-                WriteCmdData( 0x11, 0x6080 ); // entry mode
+                WriteCmdData( 0x01, 0x693F ); // driver output control
+                wait_ms( 1 );
+                WriteCmdData( 0x11, 0x6070 ); // entry mode
                 break;
+                
             case LANDSCAPE_REV:
                 WriteCmdData( 0x11, 0x60A8 ); // entry mode
                 break;
+                
             case PORTRAIT:
             default:
-                WriteCmdData( 0x11, 0x60B0 ); // entry mode
+                WriteCmdData( 0x01, 0x2B3F ); // driver output control
+                wait_ms( 1 );
+                WriteCmdData( 0x11, 0x6070 ); // entry mode
                 break;
         }
     }
@@ -93,17 +100,26 @@
         switch ( _orientation )
         {
             case LANDSCAPE:
-                WriteCmdData( 0x11, 0x4098 ); // entry mode
+                WriteCmdData( 0x01, 0x293F ); // driver output control // 0x293F 0x2B3F 0x2D3F 0x2F3F 0x693F 0x6B3F 0x6D3F 0x6F3F
+                wait_ms( 1 );
+                WriteCmdData( 0x11, 0x4048 ); // entry mode // 0x4040 0x4048 0x4050 0x4058 0x4060 0x4068
                 break;
+                
             case PORTRAIT_REV:
-                WriteCmdData( 0x11, 0x4080 ); // entry mode
+                WriteCmdData( 0x01, 0x693F ); // driver output control
+                wait_ms( 1 );
+                WriteCmdData( 0x11, 0x4070 ); // entry mode
                 break;
+                
             case LANDSCAPE_REV:
-                WriteCmdData( 0x11, 0x40A8 ); // entry mode
+                WriteCmdData( 0x11, 0x4068 ); // entry mode
                 break;
+                
             case PORTRAIT:
             default:
-                WriteCmdData( 0x11, 0x40B0 ); // entry mode
+                WriteCmdData( 0x01, 0x2B3F ); // driver output control
+                wait_ms( 1 );
+                WriteCmdData( 0x11, 0x4070 ); // entry mode
                 break;
         }
     }
@@ -215,15 +231,19 @@
 void SSD1289_LCD::SetPixelColor( unsigned int color )
 {
     unsigned char r, g, b;
+    unsigned short clr;
     r = ( color >> 16 ) & 0xFF;
     g = ( color >> 8 ) & 0xFF;
     b = color & 0xFF;
     if ( _colorDepth == RGB16 )
     {
-        unsigned short clr = ( ( ( ( r ) & 0xF8 ) | ( ( g ) >> 5 ) ) << 8 ) | ( ( ( ( g ) & 0x1C ) << 3 ) | ( ( b ) >> 3 ) );
+        clr = ( ( ( ( r ) & 0xF8 ) | ( ( g ) >> 5 ) ) << 8 ) | ( ( ( ( g ) & 0x1C ) << 3 ) | ( ( b ) >> 3 ) );
         WriteData( clr );
     }
     else if ( _colorDepth == RGB18 )
     {
+        clr = ( ( r & 0xFC ) << 8 ) | ( g & 0xFC );
+        WriteData( clr );
+        WriteData( b & 0xFC );
     }
 }