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.
Fork of TFTLCD by
Diff: ssd1289.cpp
- Revision:
- 16:4ccc2fa2cfec
- Parent:
- 15:af3cd35886fb
- Child:
- 17:866f2a851dd7
--- 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 ); } }