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
st7735.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 "st7735.h" 00023 #include "helpers.h" 00024 00025 ST7735_LCD::ST7735_LCD( PinName CS, PinName RESET, PinName RS, PinName SCL, PinName SDA, PinName BL, backlight_t blType, float defaultBackLightLevel ) 00026 : LCD( 128, 160, CS, RS, RESET, BL, blType, defaultBackLightLevel ), _lcd_pin_scl( SCL ), _lcd_pin_sda( SDA ) 00027 { 00028 } 00029 00030 void ST7735_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_rs = HIGH; 00043 _lcd_pin_scl = HIGH; 00044 _lcd_pin_sda = HIGH; 00045 if ( _lcd_pin_bl != 0 ) 00046 *_lcd_pin_bl = HIGH; 00047 else if ( _bl_pwm != 0 ) 00048 *_bl_pwm = _bl_pwm_default; 00049 wait_ms( 55 ); 00050 00051 Activate(); 00052 WriteCmd( 0x01 ); // SW reset 00053 wait_ms( 120 ); 00054 00055 WriteCmd( 0x11 ); // sleep out 00056 wait_ms( 120 ); 00057 00058 WriteCmd( 0xB1 ); // frame control 1 00059 WriteByteData( 0x01 ); 00060 WriteByteData( 0x2C ); 00061 WriteByteData( 0x2D ); 00062 00063 WriteCmd( 0xB2 ); // frame control 2 00064 WriteByteData( 0x01 ); 00065 WriteByteData( 0x2C ); 00066 WriteByteData( 0x2D ); 00067 00068 WriteCmd( 0xB3 ); // frame control 3 00069 WriteByteData( 0x01 ); 00070 WriteByteData( 0x2C ); 00071 WriteByteData( 0x2D ); 00072 WriteByteData( 0x01 ); 00073 WriteByteData( 0x2C ); 00074 WriteByteData( 0x2D ); 00075 00076 WriteCmd( 0xB4 ); // column inversion 00077 //WriteByteData( 0x07 ); 00078 WriteByteData( 0x00 ); 00079 00080 // ST7735R Power Sequence 00081 WriteCmd( 0xC0 ); // power control 1 00082 WriteByteData( 0xA2 ); 00083 WriteByteData( 0x02 ); 00084 WriteByteData( 0x84 ); 00085 00086 WriteCmd( 0xC1 ); // power control 2 00087 WriteByteData( 0xC5 ); 00088 00089 WriteCmd( 0xC2 ); // power control 3 00090 WriteByteData( 0x0A ); 00091 WriteByteData( 0x00 ); 00092 00093 WriteCmd( 0xC3 ); // power control 4 00094 WriteByteData( 0x8A ); 00095 WriteByteData( 0x2A ); 00096 00097 WriteCmd( 0xC4 ); // power control 5 00098 WriteByteData( 0x8A ); 00099 WriteByteData( 0xEE ); 00100 00101 WriteCmd( 0xC5 ); // voltage control 1 00102 WriteByteData( 0x0E ); 00103 00104 // ST7735R Gamma Sequence 00105 WriteCmd( 0xE0 ); // gamma positive 00106 WriteByteData( 0x0F ); 00107 WriteByteData( 0x1A ); 00108 WriteByteData( 0x0F ); 00109 WriteByteData( 0x18 ); 00110 WriteByteData( 0x2F ); 00111 WriteByteData( 0x28 ); 00112 WriteByteData( 0x20 ); 00113 WriteByteData( 0x22 ); 00114 WriteByteData( 0x1F ); 00115 WriteByteData( 0x1B ); 00116 WriteByteData( 0x23 ); 00117 WriteByteData( 0x37 ); 00118 WriteByteData( 0x00 ); 00119 WriteByteData( 0x07 ); 00120 WriteByteData( 0x02 ); 00121 WriteByteData( 0x10 ); 00122 00123 WriteCmd( 0xE1 ); // gamma negative 00124 WriteByteData( 0x0F ); 00125 WriteByteData( 0x1B ); 00126 WriteByteData( 0x0F ); 00127 WriteByteData( 0x17 ); 00128 WriteByteData( 0x33 ); 00129 WriteByteData( 0x2C ); 00130 WriteByteData( 0x29 ); 00131 WriteByteData( 0x2E ); 00132 WriteByteData( 0x30 ); 00133 WriteByteData( 0x30 ); 00134 WriteByteData( 0x39 ); 00135 WriteByteData( 0x3F ); 00136 WriteByteData( 0x00 ); 00137 WriteByteData( 0x07 ); 00138 WriteByteData( 0x03 ); 00139 WriteByteData( 0x10 ); 00140 00141 WriteCmd( 0x2A ); // set column address 00142 WriteByteData( 0x00 ); 00143 WriteByteData( 0x00 ); 00144 WriteByteData( 0x00 ); 00145 WriteByteData( 0x7F ); 00146 00147 WriteCmd( 0x2B ); // set row address 00148 WriteByteData( 0x00 ); 00149 WriteByteData( 0x00 ); 00150 WriteByteData( 0x00 ); 00151 WriteByteData( 0x9F ); 00152 00153 WriteCmd( 0xF0 ); // enable extensions command 00154 WriteByteData( 0x01 ); 00155 00156 WriteCmd( 0xF6 ); // disable ram power save mode 00157 WriteByteData( 0x00 ); 00158 00159 WriteCmd( 0x3A ); // interface pixel format (color mode): 0x05 => RGB16, 0x06 => RGB18 00160 WriteByteData( _colorDepth == RGB16 ? 0x05 : 0x06 ); 00161 00162 WriteCmd( 0x36 ); //MX, MY, RGB mode 00163 switch ( _orientation ) 00164 { 00165 case LANDSCAPE: WriteByteData( 0x6C ); break; 00166 case PORTRAIT_REV: WriteByteData( 0xDC ); break; 00167 case LANDSCAPE_REV: WriteByteData( 0xB8 ); break; 00168 case PORTRAIT: 00169 default: WriteByteData( 0x08 ); break; 00170 } 00171 00172 WriteCmd( 0x29 ); // display on 00173 00174 Deactivate(); 00175 } 00176 00177 void ST7735_LCD::Sleep( void ) 00178 { 00179 Activate(); 00180 WriteCmd( 0x28 ); 00181 wait_ms( 10 ); 00182 WriteCmd( 0x10 ); 00183 wait_ms( 125 ); 00184 LCD::Sleep(); 00185 Deactivate(); 00186 } 00187 00188 void ST7735_LCD::WakeUp( void ) 00189 { 00190 Activate(); 00191 WriteCmd( 0x29 ); 00192 wait_ms( 10 ); 00193 WriteCmd( 0x11 ); 00194 wait_ms( 125 ); 00195 LCD::WakeUp(); 00196 Deactivate(); 00197 } 00198 00199 void ST7735_LCD::WriteCmd( unsigned short cmd ) 00200 { 00201 _lcd_pin_rs = LOW; 00202 serializeByte( cmd & 0xFF ); 00203 } 00204 00205 void ST7735_LCD::WriteData( unsigned short data ) 00206 { 00207 _lcd_pin_rs = HIGH; 00208 serializeByte( ( data >> 8 ) & 0xFF ); 00209 serializeByte( data & 0xFF ); 00210 } 00211 00212 void ST7735_LCD::WriteByteData( unsigned char data ) 00213 { 00214 _lcd_pin_rs = HIGH; 00215 serializeByte( data ); 00216 } 00217 00218 void ST7735_LCD::SetXY( unsigned short x1, unsigned short y1, unsigned short x2, unsigned short y2 ) 00219 { 00220 WriteCmdData( 0x2a, x1 ); 00221 WriteData( x2 ); 00222 WriteCmdData( 0x2b, y1 ); 00223 WriteData( y2 ); 00224 WriteCmd( 0x2c ); 00225 } 00226 00227 void ST7735_LCD::SetPixelColor( unsigned int color, colordepth_t mode ) 00228 { 00229 unsigned char r = 0, g = 0, b = 0; 00230 unsigned short clr; 00231 if ( _colorDepth == RGB16 ) 00232 { 00233 switch ( mode ) 00234 { 00235 case RGB16: 00236 WriteData( color & 0xFFFF ); 00237 break; 00238 case RGB18: 00239 r = ( color >> 10 ) & 0xF8; 00240 g = ( color >> 4 ) & 0xFC; 00241 b = ( color >> 1 ) & 0x1F; 00242 clr = ( ( r | ( g >> 5 ) ) << 8 ) | ( ( g << 3 ) | b ); 00243 WriteData( clr ); 00244 break; 00245 case RGB24: 00246 r = ( color >> 16 ) & 0xF8; 00247 g = ( color >> 8 ) & 0xFC; 00248 b = color & 0xF8; 00249 clr = ( ( r | ( g >> 5 ) ) << 8 ) | ( ( g << 3 ) | ( b >> 3 ) ); 00250 WriteData( clr ); 00251 break; 00252 } 00253 } 00254 else if ( _colorDepth == RGB18 ) 00255 { 00256 switch ( mode ) 00257 { 00258 case RGB16: 00259 r = ( ( color >> 8 ) & 0xF8 ) | ( ( color & 0x8000 ) >> 13 ); 00260 g = ( color >> 3 ) & 0xFC; 00261 b = ( ( color << 3 ) & 0xFC ) | ( ( color >> 3 ) & 0x01 ); 00262 break; 00263 case RGB18: 00264 b = ( color << 2 ) & 0xFC; 00265 g = ( color >> 4 ) & 0xFC; 00266 r = ( color >> 10 ) & 0xFC; 00267 break; 00268 case RGB24: 00269 r = ( color >> 16 ) & 0xFC; 00270 g = ( color >> 8 ) & 0xFC; 00271 b = color & 0xFC; 00272 break; 00273 } 00274 WriteByteData( r ); 00275 WriteByteData( g ); 00276 WriteByteData( b ); 00277 } 00278 } 00279 00280 void ST7735_LCD::serializeByte( unsigned char data ) 00281 { 00282 for ( int i = 0; i < 8; i++ ) 00283 { 00284 if ( data & 0x80 ) _lcd_pin_sda = HIGH; 00285 else _lcd_pin_sda = LOW; 00286 pulseLow( _lcd_pin_scl ); 00287 data = data << 1; 00288 } 00289 }
Generated on Thu Jul 14 2022 02:02:54 by 1.7.2