TFTLCD with FastIO

Fork of TFTLCD by en 129

Revision:
12:d0978272a340
Parent:
10:69571adcfad5
Child:
15:af3cd35886fb
--- a/hx8340bs.cpp	Tue Dec 11 16:50:09 2012 +0000
+++ b/hx8340bs.cpp	Tue Dec 11 18:11:14 2012 +0000
@@ -29,9 +29,10 @@
     else _lcd_pin_bl = 0;
 }
 
-void HX8340S_LCD::Initialize( orientation_t orientation )
+void HX8340S_LCD::Initialize( orientation_t orientation, colordepth_t colors )
 {
     _orientation = orientation;
+    _colorDepth = colors;
     
     wait_ms( 100 );
     _lcd_pin_reset = HIGH;
@@ -47,17 +48,20 @@
     wait_ms( 55 );
     
     Activate();
-    WriteCmd( 0xC1 );
+    WriteCmd( 0xC1 ); // SETEXTCMD
     WriteByteData( 0xFF );
     WriteByteData( 0x83 );
     WriteByteData( 0x40 );
-    WriteCmd( 0x11 );
+    
+    WriteCmd( 0x11 ); // SLPOUT
     wait_ms( 160 );
+    
     WriteCmd( 0xCA );
     WriteByteData( 0x70 );
     WriteByteData( 0x00 );
     WriteByteData( 0xD9 );
-    WriteCmd( 0xB0 );
+    
+    WriteCmd( 0xB0 ); // SETOSC
     WriteByteData( 0x01 );
     WriteByteData( 0x11 );
 
@@ -71,7 +75,8 @@
     WriteByteData( 0x00 );
     WriteByteData( 0x06 );
     wait_ms( 20 );
-    WriteCmd( 0xC2 );
+    
+    WriteCmd( 0xC2 ); // SETGAMMAP
     WriteByteData( 0x60 );
     WriteByteData( 0x71 );
     WriteByteData( 0x01 );
@@ -82,7 +87,7 @@
     WriteByteData( 0x31 );
     WriteByteData( 0x0A );
 
-    WriteCmd( 0xc3 );
+    WriteCmd( 0xc3 ); // SETGAMMAN
     WriteByteData( 0x67 );
     WriteByteData( 0x30 );
     WriteByteData( 0x61 );
@@ -92,31 +97,35 @@
     WriteByteData( 0x05 );
     WriteByteData( 0x33 );
     wait_ms( 10 );
-    WriteCmd( 0xB5 );
+    
+    WriteCmd( 0xB5 ); // SETPWCTR5
     WriteByteData( 0x35 );
     WriteByteData( 0x20 );
     WriteByteData( 0x45 );
 
-    WriteCmd( 0xB4 );
+    WriteCmd( 0xB4 ); // SETPWCTR4
     WriteByteData( 0x33 );
     WriteByteData( 0x25 );
     WriteByteData( 0x4c );
     wait_ms( 10 );
-    WriteCmd( 0x3a );
-    WriteByteData( 0x05 );
-    WriteCmd( 0x29 );
+    
+    WriteCmd( 0x3A ); // COLMOD == color depth: 0x05 => 16bit, 0x06 => 18bit
+    WriteByteData( _colorDepth == RGB16 ? 0x05 : 0x06 );
+    
+    WriteCmd( 0x36 ); // MADCTL
+    switch ( _orientation )
+    {
+        case LANDSCAPE: WriteByteData( 0xB8 ); break;
+        case PORTRAIT_REV: WriteByteData( 0xDC ); break;
+        case LANDSCAPE_REV: WriteByteData( 0x6C ); break;
+        case PORTRAIT:
+        default: WriteByteData( 0x08 ); break;
+    }
+    
+    WriteCmd( 0x29 ); // DISPON
     wait_ms( 10 );
-    WriteCmd( 0x2a );
-    WriteByteData( 0x00 );
-    WriteByteData( 0x00 );
-    WriteByteData( 0x00 );
-    WriteByteData( 0xaf );
-    WriteCmd( 0x2b );
-    WriteByteData( 0x00 );
-    WriteByteData( 0x00 );
-    WriteByteData( 0x00 );
-    WriteByteData( 0xdb );
-    WriteCmd( 0x2c );
+    
+    ClearXY();
     Deactivate();
 }
 
@@ -170,25 +179,30 @@
 
 void HX8340S_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( 0x2a, x1 );
+    WriteCmdData( 0x2A, x1 );  // CASET
     WriteData( x2 );
-    WriteCmdData( 0x2b, y1 );
+    WriteCmdData( 0x2B, y1 );  // PASET
     WriteData( y2 );
-    WriteCmd( 0x2c );
+    WriteCmd( 0x2C ); // RAMWR
 }
 
-void HX8340S_LCD::SetPixelColor( unsigned short color )
+void HX8340S_LCD::SetPixelColor( unsigned int color )
 {
-    WriteData( color );
+    unsigned char r, g, b;
+    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 ) );
+        WriteData( clr );
+    }
+    else
+    {
+        WriteByteData( r & 0xFC );
+        WriteByteData( g & 0xFC );
+        WriteByteData( b & 0xFC );
+    }
 }
 
 void HX8340S_LCD::serializeByte( unsigned char data )