Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: GR-PEACH_TFTLCD_8bit
Fork of TFTLCD_8bit by
ssd1289.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 "ssd1289.h" 00023 #include "helpers.h" 00024 00025 SSD1289_LCD::SSD1289_LCD( PinName CS, PinName RESET, PinName RS, PinName WR, BusOut* DATA_PORT, PinName BL, PinName RD, backlight_t blType, float defaultBackLightLevel ) 00026 : LCD( 240, 320, CS, RS, RESET, BL, blType, defaultBackLightLevel ), _lcd_pin_wr( WR ) 00027 { 00028 _lcd_port = DATA_PORT; 00029 if ( RD != NC ) _lcd_pin_rd = new DigitalOut( RD ); 00030 else _lcd_pin_rd = 0; 00031 } 00032 00033 void SSD1289_LCD::Initialize( orientation_t orientation, colordepth_t colors ) 00034 { 00035 _orientation = orientation; 00036 _colorDepth = colors; 00037 00038 _lcd_pin_reset = HIGH; 00039 wait_ms( 5 ); 00040 _lcd_pin_reset = LOW; 00041 wait_ms( 15 ); 00042 _lcd_pin_reset = HIGH; 00043 _lcd_pin_cs = 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 if ( _lcd_pin_rd != 0 ) 00049 *_lcd_pin_rd = HIGH; 00050 _lcd_pin_wr = HIGH; 00051 wait_ms( 15 ); 00052 00053 Activate(); 00054 WriteCmdData( 0x00, 0x0001 ); // oscillator: 1 = on, 0 = off 00055 wait_ms( 1 ); 00056 WriteCmdData( 0x03, 0xA8A4 ); // power control 00057 wait_ms( 1 ); 00058 WriteCmdData( 0x0C, 0x0000 ); // power control 2 00059 wait_ms( 1 ); 00060 WriteCmdData( 0x0D, 0x080C ); // power control 3 00061 wait_ms( 1 ); 00062 WriteCmdData( 0x0E, 0x2B00 ); // power control 4 00063 wait_ms( 1 ); 00064 WriteCmdData( 0x1E, 0x00B7 ); // power control 5 00065 wait_ms( 1 ); 00066 WriteCmdData( 0x02, 0x0600 ); // driving waveform control 00067 wait_ms( 1 ); 00068 WriteCmdData( 0x10, 0x0000 ); // sleep mode: 0 = exit, 1 = enter 00069 wait_ms( 1 ); 00070 if ( _colorDepth == RGB16 ) 00071 { 00072 switch ( _orientation ) 00073 { 00074 case LANDSCAPE: // works 00075 WriteCmdData( 0x01, 0x293F ); // driver output control 00076 wait_ms( 1 ); 00077 WriteCmdData( 0x11, 0x6078 ); // entry mode 00078 break; 00079 00080 case PORTRAIT_REV: // works 00081 WriteCmdData( 0x01, 0x693F ); // driver output control 00082 wait_ms( 1 ); 00083 WriteCmdData( 0x11, 0x6070 ); // entry mode 00084 break; 00085 00086 case LANDSCAPE_REV: // works 00087 WriteCmdData( 0x01, 0x6B3F ); // driver output control 00088 wait_ms( 1 ); 00089 WriteCmdData( 0x11, 0x6078 ); // entry mode 00090 break; 00091 00092 case PORTRAIT: // works 00093 default: 00094 WriteCmdData( 0x01, 0x2B3F ); // driver output control 00095 wait_ms( 1 ); 00096 WriteCmdData( 0x11, 0x6070 ); // entry mode 00097 break; 00098 } 00099 } 00100 else if ( _colorDepth == RGB18 ) 00101 { 00102 switch ( _orientation ) 00103 { 00104 case LANDSCAPE: // works 00105 WriteCmdData( 0x01, 0x293F ); // driver output control 00106 wait_ms( 1 ); 00107 WriteCmdData( 0x11, 0x4078 ); // entry mode 00108 break; 00109 00110 case PORTRAIT_REV: // works 00111 WriteCmdData( 0x01, 0x693F ); // driver output control 00112 wait_ms( 1 ); 00113 WriteCmdData( 0x11, 0x4070 ); // entry mode 00114 break; 00115 00116 case LANDSCAPE_REV: // works 00117 WriteCmdData( 0x01, 0x6B3F ); // driver output control 00118 wait_ms( 1 ); 00119 WriteCmdData( 0x11, 0x4078 ); // entry mode 00120 break; 00121 00122 case PORTRAIT: // works 00123 default: 00124 WriteCmdData( 0x01, 0x2B3F ); // driver output control 00125 wait_ms( 1 ); 00126 WriteCmdData( 0x11, 0x4070 ); // entry mode 00127 break; 00128 } 00129 } 00130 wait_ms( 1 ); 00131 WriteCmdData( 0x05, 0x0000 ); // compare register 00132 wait_ms( 1 ); 00133 WriteCmdData( 0x06, 0x0000 ); // compare register 00134 wait_ms( 1 ); 00135 WriteCmdData( 0x16, 0xEF1C ); // horizontal porch 00136 wait_ms( 1 ); 00137 WriteCmdData( 0x17, 0x0003 ); // vertical porch 00138 wait_ms( 1 ); 00139 WriteCmdData( 0x07, 0x0233 ); // display control 00140 wait_ms( 1 ); 00141 WriteCmdData( 0x0B, 0x0000 ); // frame cycle control 00142 wait_ms( 1 ); 00143 WriteCmdData( 0x0F, 0x0000 ); // gate scan position 00144 wait_ms( 1 ); 00145 WriteCmdData( 0x41, 0x0000 ); // vertical scroll control 00146 wait_ms( 1 ); 00147 WriteCmdData( 0x42, 0x0000 ); // vertical scroll control 00148 wait_ms( 1 ); 00149 WriteCmdData( 0x48, 0x0000 ); // 1st screen driving position 00150 wait_ms( 1 ); 00151 WriteCmdData( 0x49, 0x013F ); // 1st screen driving position 00152 wait_ms( 1 ); 00153 WriteCmdData( 0x4A, 0x0000 ); // 2nd screen driving position 00154 wait_ms( 1 ); 00155 WriteCmdData( 0x4B, 0x0000 ); // 2nd screen driving position 00156 wait_ms( 1 ); 00157 WriteCmdData( 0x44, 0xEF00 ); // horizontal ram address position 00158 wait_ms( 1 ); 00159 WriteCmdData( 0x45, 0x0000 ); // vertical ram address position 00160 wait_ms( 1 ); 00161 WriteCmdData( 0x46, 0x013F ); // vertical ram address position 00162 wait_ms( 1 ); 00163 WriteCmdData( 0x30, 0x0707 ); // gamma control 00164 wait_ms( 1 ); 00165 WriteCmdData( 0x31, 0x0204 ); // gamma control 00166 wait_ms( 1 ); 00167 WriteCmdData( 0x32, 0x0204 ); // gamma control 00168 wait_ms( 1 ); 00169 WriteCmdData( 0x33, 0x0502 ); // gamma control 00170 wait_ms( 1 ); 00171 WriteCmdData( 0x34, 0x0507 ); // gamma control 00172 wait_ms( 1 ); 00173 WriteCmdData( 0x35, 0x0204 ); // gamma control 00174 wait_ms( 1 ); 00175 WriteCmdData( 0x36, 0x0204 ); // gamma control 00176 wait_ms( 1 ); 00177 WriteCmdData( 0x37, 0x0502 ); // gamma control 00178 wait_ms( 1 ); 00179 WriteCmdData( 0x3A, 0x0302 ); // gamma control 00180 wait_ms( 1 ); 00181 WriteCmdData( 0x3B, 0x0302 ); // gamma control 00182 wait_ms( 1 ); 00183 WriteCmdData( 0x23, 0x0000 ); // GRAM write mask for red and green pins 00184 wait_ms( 1 ); 00185 WriteCmdData( 0x24, 0x0000 ); // GRAM write mask for blue pins 00186 wait_ms( 1 ); 00187 WriteCmdData( 0x25, 0x8000 ); // frame frequency control 00188 wait_ms( 1 ); 00189 WriteCmdData( 0x4e, 0x0000 ); // ram address set 00190 wait_ms( 1 ); 00191 WriteCmdData( 0x4f, 0x0000 ); // ram address set 00192 wait_ms( 1 ); 00193 WriteCmd( 0x22 ); // write GRAM 00194 Deactivate(); 00195 } 00196 00197 void SSD1289_LCD::Sleep( void ) 00198 { 00199 WriteCmdData( 0x10, 0x0001 ); // sleep mode: 0 = exit, 1 = enter 00200 LCD::Sleep(); 00201 } 00202 00203 void SSD1289_LCD::WakeUp( void ) 00204 { 00205 WriteCmdData( 0x10, 0x0000 ); // sleep mode: 0 = exit, 1 = enter 00206 LCD::WakeUp(); 00207 } 00208 00209 void SSD1289_LCD::WriteCmd( unsigned short cmd ) 00210 { 00211 _lcd_pin_rs = LOW; 00212 _lcd_port->write( cmd ); 00213 pulseLow( _lcd_pin_wr ); 00214 } 00215 00216 void SSD1289_LCD::WriteData( unsigned short data ) 00217 { 00218 _lcd_pin_rs = HIGH; 00219 _lcd_port->write( data ); 00220 pulseLow( _lcd_pin_wr ); 00221 } 00222 00223 void SSD1289_LCD::SetXY( unsigned short x1, unsigned short y1, unsigned short x2, unsigned short y2 ) 00224 { 00225 if ( _orientation == PORTRAIT || _orientation == PORTRAIT_REV ) 00226 { 00227 WriteCmdData( 0x44, ( x2 << 8 ) + x1 ); 00228 WriteCmdData( 0x45, y1 ); 00229 WriteCmdData( 0x46, y2 ); 00230 WriteCmdData( 0x4e, x1 ); 00231 WriteCmdData( 0x4f, y1 ); 00232 } 00233 else 00234 { 00235 WriteCmdData( 0x44, ( y2 << 8 ) + y1 ); 00236 WriteCmdData( 0x45, x1 ); 00237 WriteCmdData( 0x46, x2 ); 00238 WriteCmdData( 0x4e, y1 ); 00239 WriteCmdData( 0x4f, x1 ); 00240 } 00241 WriteCmd( 0x22 ); 00242 } 00243 00244 void SSD1289_LCD::SetPixelColor( unsigned int color, colordepth_t mode ) 00245 { 00246 unsigned char r, g, b; 00247 unsigned short clr; 00248 if ( _colorDepth == RGB16 ) 00249 { 00250 switch ( mode ) 00251 { 00252 case RGB16: 00253 WriteData( color & 0xFFFF ); 00254 break; 00255 case RGB18: 00256 r = ( color >> 10 ) & 0xF8; 00257 g = ( color >> 4 ) & 0xFC; 00258 b = ( color >> 1 ) & 0x1F; 00259 clr = ( ( r | ( g >> 5 ) ) << 8 ) | ( ( g << 3 ) | b ); 00260 WriteData( clr ); 00261 break; 00262 case RGB24: 00263 r = ( color >> 16 ) & 0xF8; 00264 g = ( color >> 8 ) & 0xFC; 00265 b = color & 0xF8; 00266 clr = ( ( r | ( g >> 5 ) ) << 8 ) | ( ( g << 3 ) | ( b >> 3 ) ); 00267 WriteData( clr ); 00268 break; 00269 } 00270 } 00271 else if ( _colorDepth == RGB18 ) 00272 { 00273 switch ( mode ) 00274 { 00275 case RGB16: 00276 r = ( ( color >> 8 ) & 0xF8 ) | ( ( color & 0x8000 ) >> 13 ); 00277 g = ( color >> 3 ) & 0xFC; 00278 b = ( ( color << 3 ) & 0xFC ) | ( ( color >> 3 ) & 0x01 ); 00279 WriteData( ( r << 8 ) | g ); 00280 WriteData( b ); 00281 break; 00282 case RGB18: 00283 b = ( color << 2 ) & 0xFC; 00284 g = ( color >> 4 ) & 0xFC; 00285 r = ( color >> 10 ) & 0xFC; 00286 WriteData( ( r << 8 ) | g ); 00287 WriteData( b ); 00288 break; 00289 case RGB24: 00290 r = ( color >> 16 ) & 0xFC; 00291 g = ( color >> 8 ) & 0xFC; 00292 b = color & 0xFC; 00293 WriteData( ( r << 8 ) | g ); 00294 WriteData( b ); 00295 break; 00296 } 00297 } 00298 }
Generated on Wed Jul 13 2022 02:32:27 by
1.7.2
