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: test SDCard capstone_display capstone_display_2 ... more
hx8340bs.cpp
00001 /* 00002 * Copyright (C)2010-2012 Henning Karlsen. All right reserved. 00003 * Copyright (C)2012 Todor Todorov. 00004 * 00005 * This library is free software; you can redistribute it and/or 00006 * modify it under the terms of the GNU Lesser General Public 00007 * License as published by the Free Software Foundation; either 00008 * version 2.1 of the License, or (at your option) any later version. 00009 * 00010 * This library is distributed in the hope that it will be useful, 00011 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00013 * Lesser General Public License for more details. 00014 * 00015 * You should have received a copy of the GNU Lesser General Public 00016 * License along with this library; if not, write to: 00017 * 00018 * Free Software Foundation, Inc. 00019 * 51 Franklin St, 5th Floor, Boston, MA 02110-1301, USA 00020 * 00021 *********************************************************************/ 00022 #include "hx8340bs.h" 00023 #include "helpers.h" 00024 00025 HX8340S_LCD::HX8340S_LCD( PinName CS, PinName RESET, PinName SCL, PinName SDI, PinName BL, backlight_t blType, float defaultBackLightLevel ) 00026 : LCD( 176, 220, CS, NC, RESET, BL, blType, defaultBackLightLevel ), _lcd_pin_scl( SCL ), _lcd_pin_sdi( SDI ) 00027 { 00028 } 00029 00030 void HX8340S_LCD::Initialize( orientation_t orientation, colordepth_t colors ) 00031 { 00032 _orientation = orientation; 00033 _colorDepth = colors; 00034 00035 wait_ms( 100 ); 00036 _lcd_pin_reset = HIGH; 00037 wait_ms( 5 ); 00038 _lcd_pin_reset = LOW; 00039 wait_ms( 15 ); 00040 _lcd_pin_reset = HIGH; 00041 _lcd_pin_cs = HIGH; 00042 _lcd_pin_scl = HIGH; 00043 _lcd_pin_sdi = HIGH; 00044 if ( _lcd_pin_bl != 0 ) 00045 *_lcd_pin_bl = HIGH; 00046 else if ( _bl_pwm != 0 ) 00047 *_bl_pwm = _bl_pwm_default; 00048 wait_ms( 55 ); 00049 00050 Activate(); 00051 WriteCmd( 0xC1 ); // SETEXTCMD 00052 WriteByteData( 0xFF ); 00053 WriteByteData( 0x83 ); 00054 WriteByteData( 0x40 ); 00055 00056 WriteCmd( 0x11 ); // SLPOUT 00057 wait_ms( 160 ); 00058 00059 WriteCmd( 0xCA ); 00060 WriteByteData( 0x70 ); 00061 WriteByteData( 0x00 ); 00062 WriteByteData( 0xD9 ); 00063 00064 WriteCmd( 0xB0 ); // SETOSC 00065 WriteByteData( 0x01 ); 00066 WriteByteData( 0x11 ); 00067 00068 WriteCmd( 0xC9 ); 00069 WriteByteData( 0x90 ); 00070 WriteByteData( 0x49 ); 00071 WriteByteData( 0x10 ); 00072 WriteByteData( 0x28 ); 00073 WriteByteData( 0x28 ); 00074 WriteByteData( 0x10 ); 00075 WriteByteData( 0x00 ); 00076 WriteByteData( 0x06 ); 00077 wait_ms( 20 ); 00078 00079 WriteCmd( 0xC2 ); // SETGAMMAP 00080 WriteByteData( 0x60 ); 00081 WriteByteData( 0x71 ); 00082 WriteByteData( 0x01 ); 00083 WriteByteData( 0x0E ); 00084 WriteByteData( 0x05 ); 00085 WriteByteData( 0x02 ); 00086 WriteByteData( 0x09 ); 00087 WriteByteData( 0x31 ); 00088 WriteByteData( 0x0A ); 00089 00090 WriteCmd( 0xc3 ); // SETGAMMAN 00091 WriteByteData( 0x67 ); 00092 WriteByteData( 0x30 ); 00093 WriteByteData( 0x61 ); 00094 WriteByteData( 0x17 ); 00095 WriteByteData( 0x48 ); 00096 WriteByteData( 0x07 ); 00097 WriteByteData( 0x05 ); 00098 WriteByteData( 0x33 ); 00099 wait_ms( 10 ); 00100 00101 WriteCmd( 0xB5 ); // SETPWCTR5 00102 WriteByteData( 0x35 ); 00103 WriteByteData( 0x20 ); 00104 WriteByteData( 0x45 ); 00105 00106 WriteCmd( 0xB4 ); // SETPWCTR4 00107 WriteByteData( 0x33 ); 00108 WriteByteData( 0x25 ); 00109 WriteByteData( 0x4c ); 00110 wait_ms( 10 ); 00111 00112 WriteCmd( 0x3A ); // COLMOD == color depth: 0x05 => 16bit, 0x06 => 18bit 00113 WriteByteData( _colorDepth == RGB16 ? 0x05 : 0x06 ); 00114 00115 WriteCmd( 0x36 ); // MADCTL 00116 switch ( _orientation ) 00117 { 00118 case LANDSCAPE: WriteByteData( 0xB8 ); break; 00119 case PORTRAIT_REV: WriteByteData( 0xDC ); break; 00120 case LANDSCAPE_REV: WriteByteData( 0x6C ); break; 00121 case PORTRAIT: 00122 default: WriteByteData( 0x08 ); break; 00123 } 00124 00125 WriteCmd( 0x29 ); // DISPON 00126 wait_ms( 10 ); 00127 00128 ClearXY(); 00129 Deactivate(); 00130 } 00131 00132 void HX8340S_LCD::Sleep( void ) 00133 { 00134 Activate(); 00135 WriteCmd( 0x28 ); 00136 wait_ms( 10 ); 00137 WriteCmd( 0x10 ); 00138 wait_ms( 125 ); 00139 LCD::Sleep(); 00140 Deactivate(); 00141 } 00142 00143 void HX8340S_LCD::WakeUp( void ) 00144 { 00145 Activate(); 00146 WriteCmd( 0x29 ); 00147 wait_ms( 10 ); 00148 WriteCmd( 0x11 ); 00149 wait_ms( 125 ); 00150 LCD::WakeUp(); 00151 Deactivate(); 00152 } 00153 00154 void HX8340S_LCD::WriteCmd( unsigned short cmd ) 00155 { 00156 _lcd_pin_sdi = LOW; 00157 pulseLow( _lcd_pin_scl ); 00158 serializeByte( cmd & 0xFF ); 00159 } 00160 00161 void HX8340S_LCD::WriteData( unsigned short data ) 00162 { 00163 _lcd_pin_sdi = HIGH; 00164 pulseLow( _lcd_pin_scl ); 00165 serializeByte( ( data >> 8 ) & 0xFF ); 00166 _lcd_pin_sdi = HIGH; 00167 pulseLow( _lcd_pin_scl ); 00168 serializeByte( data & 0xFF ); 00169 } 00170 00171 void HX8340S_LCD::WriteByteData( unsigned char data ) 00172 { 00173 _lcd_pin_sdi = HIGH; 00174 pulseLow( _lcd_pin_scl ); 00175 serializeByte( data ); 00176 } 00177 00178 void HX8340S_LCD::SetXY( unsigned short x1, unsigned short y1, unsigned short x2, unsigned short y2 ) 00179 { 00180 WriteCmdData( 0x2A, x1 ); // CASET 00181 WriteData( x2 ); 00182 WriteCmdData( 0x2B, y1 ); // PASET 00183 WriteData( y2 ); 00184 WriteCmd( 0x2C ); // RAMWR 00185 } 00186 00187 void HX8340S_LCD::SetPixelColor( unsigned int color, colordepth_t mode ) 00188 { 00189 unsigned char r = 0, g = 0, b = 0; 00190 unsigned short clr; 00191 if ( _colorDepth == RGB16 ) 00192 { 00193 switch ( mode ) 00194 { 00195 case RGB16: 00196 WriteData( color & 0xFFFF ); 00197 break; 00198 case RGB18: 00199 r = ( color >> 10 ) & 0xF8; 00200 g = ( color >> 4 ) & 0xFC; 00201 b = ( color >> 1 ) & 0x1F; 00202 clr = ( ( r | ( g >> 5 ) ) << 8 ) | ( ( g << 3 ) | b ); 00203 WriteData( clr ); 00204 break; 00205 case RGB24: 00206 r = ( color >> 16 ) & 0xF8; 00207 g = ( color >> 8 ) & 0xFC; 00208 b = color & 0xF8; 00209 clr = ( ( r | ( g >> 5 ) ) << 8 ) | ( ( g << 3 ) | ( b >> 3 ) ); 00210 WriteData( clr ); 00211 break; 00212 } 00213 } 00214 else if ( _colorDepth == RGB18 ) 00215 { 00216 switch ( mode ) 00217 { 00218 case RGB16: 00219 r = ( ( color >> 8 ) & 0xF8 ) | ( ( color & 0x8000 ) >> 13 ); 00220 g = ( color >> 3 ) & 0xFC; 00221 b = ( ( color << 3 ) & 0xFC ) | ( ( color >> 3 ) & 0x01 ); 00222 break; 00223 case RGB18: 00224 b = ( color << 2 ) & 0xFC; 00225 g = ( color >> 4 ) & 0xFC; 00226 r = ( color >> 10 ) & 0xFC; 00227 break; 00228 case RGB24: 00229 r = ( color >> 16 ) & 0xFC; 00230 g = ( color >> 8 ) & 0xFC; 00231 b = color & 0xFC; 00232 break; 00233 } 00234 WriteByteData( r ); 00235 WriteByteData( g ); 00236 WriteByteData( b ); 00237 } 00238 } 00239 00240 void HX8340S_LCD::serializeByte( unsigned char data ) 00241 { 00242 for ( int i = 0; i < 8; i++ ) 00243 { 00244 if ( data & 0x80 ) _lcd_pin_sdi = HIGH; 00245 else _lcd_pin_sdi = LOW; 00246 pulseLow( _lcd_pin_scl ); 00247 data = data << 1; 00248 } 00249 }
Generated on Thu Jul 14 2022 02:02:54 by 1.7.2