Fork of TFTLCD with new support for SSD1963 ad HX8352-A controller.
Fork of TFTLCD by
hx8340bs.cpp@22:4c169297f374, 2013-01-26 (annotated)
- Committer:
- ttodorov
- Date:
- Sat Jan 26 04:36:46 2013 +0000
- Revision:
- 22:4c169297f374
- Parent:
- 20:4bdca8d8dadc
- added PWM backlight control
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
ttodorov | 4:3ac4239f6c9c | 1 | /* |
ttodorov | 4:3ac4239f6c9c | 2 | * Copyright (C)2010-2012 Henning Karlsen. All right reserved. |
ttodorov | 4:3ac4239f6c9c | 3 | * Copyright (C)2012 Todor Todorov. |
ttodorov | 4:3ac4239f6c9c | 4 | * |
ttodorov | 4:3ac4239f6c9c | 5 | * This library is free software; you can redistribute it and/or |
ttodorov | 4:3ac4239f6c9c | 6 | * modify it under the terms of the GNU Lesser General Public |
ttodorov | 4:3ac4239f6c9c | 7 | * License as published by the Free Software Foundation; either |
ttodorov | 4:3ac4239f6c9c | 8 | * version 2.1 of the License, or (at your option) any later version. |
ttodorov | 4:3ac4239f6c9c | 9 | * |
ttodorov | 4:3ac4239f6c9c | 10 | * This library is distributed in the hope that it will be useful, |
ttodorov | 4:3ac4239f6c9c | 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
ttodorov | 4:3ac4239f6c9c | 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
ttodorov | 4:3ac4239f6c9c | 13 | * Lesser General Public License for more details. |
ttodorov | 4:3ac4239f6c9c | 14 | * |
ttodorov | 4:3ac4239f6c9c | 15 | * You should have received a copy of the GNU Lesser General Public |
ttodorov | 4:3ac4239f6c9c | 16 | * License along with this library; if not, write to: |
ttodorov | 4:3ac4239f6c9c | 17 | * |
ttodorov | 4:3ac4239f6c9c | 18 | * Free Software Foundation, Inc. |
ttodorov | 4:3ac4239f6c9c | 19 | * 51 Franklin St, 5th Floor, Boston, MA 02110-1301, USA |
ttodorov | 4:3ac4239f6c9c | 20 | * |
ttodorov | 4:3ac4239f6c9c | 21 | *********************************************************************/ |
ttodorov | 4:3ac4239f6c9c | 22 | #include "hx8340bs.h" |
ttodorov | 4:3ac4239f6c9c | 23 | #include "helpers.h" |
ttodorov | 4:3ac4239f6c9c | 24 | |
ttodorov | 22:4c169297f374 | 25 | HX8340S_LCD::HX8340S_LCD( PinName CS, PinName RESET, PinName SCL, PinName SDI, PinName BL, backlight_t blType, float defaultBackLightLevel ) |
ttodorov | 22:4c169297f374 | 26 | : LCD( 176, 220, CS, NC, RESET, BL, blType, defaultBackLightLevel ), _lcd_pin_scl( SCL ), _lcd_pin_sdi( SDI ) |
ttodorov | 4:3ac4239f6c9c | 27 | { |
ttodorov | 4:3ac4239f6c9c | 28 | } |
ttodorov | 9:58b328831d0a | 29 | |
ttodorov | 12:d0978272a340 | 30 | void HX8340S_LCD::Initialize( orientation_t orientation, colordepth_t colors ) |
ttodorov | 4:3ac4239f6c9c | 31 | { |
ttodorov | 4:3ac4239f6c9c | 32 | _orientation = orientation; |
ttodorov | 12:d0978272a340 | 33 | _colorDepth = colors; |
ttodorov | 4:3ac4239f6c9c | 34 | |
ttodorov | 4:3ac4239f6c9c | 35 | wait_ms( 100 ); |
ttodorov | 4:3ac4239f6c9c | 36 | _lcd_pin_reset = HIGH; |
ttodorov | 4:3ac4239f6c9c | 37 | wait_ms( 5 ); |
ttodorov | 4:3ac4239f6c9c | 38 | _lcd_pin_reset = LOW; |
ttodorov | 4:3ac4239f6c9c | 39 | wait_ms( 15 ); |
ttodorov | 4:3ac4239f6c9c | 40 | _lcd_pin_reset = HIGH; |
ttodorov | 4:3ac4239f6c9c | 41 | _lcd_pin_cs = HIGH; |
ttodorov | 4:3ac4239f6c9c | 42 | _lcd_pin_scl = HIGH; |
ttodorov | 4:3ac4239f6c9c | 43 | _lcd_pin_sdi = HIGH; |
ttodorov | 4:3ac4239f6c9c | 44 | if ( _lcd_pin_bl != 0 ) |
ttodorov | 4:3ac4239f6c9c | 45 | *_lcd_pin_bl = HIGH; |
ttodorov | 22:4c169297f374 | 46 | else if ( _bl_pwm != 0 ) |
ttodorov | 22:4c169297f374 | 47 | *_bl_pwm = _bl_pwm_default; |
ttodorov | 4:3ac4239f6c9c | 48 | wait_ms( 55 ); |
ttodorov | 4:3ac4239f6c9c | 49 | |
ttodorov | 4:3ac4239f6c9c | 50 | Activate(); |
ttodorov | 12:d0978272a340 | 51 | WriteCmd( 0xC1 ); // SETEXTCMD |
ttodorov | 4:3ac4239f6c9c | 52 | WriteByteData( 0xFF ); |
ttodorov | 4:3ac4239f6c9c | 53 | WriteByteData( 0x83 ); |
ttodorov | 4:3ac4239f6c9c | 54 | WriteByteData( 0x40 ); |
ttodorov | 12:d0978272a340 | 55 | |
ttodorov | 12:d0978272a340 | 56 | WriteCmd( 0x11 ); // SLPOUT |
ttodorov | 4:3ac4239f6c9c | 57 | wait_ms( 160 ); |
ttodorov | 12:d0978272a340 | 58 | |
ttodorov | 4:3ac4239f6c9c | 59 | WriteCmd( 0xCA ); |
ttodorov | 4:3ac4239f6c9c | 60 | WriteByteData( 0x70 ); |
ttodorov | 4:3ac4239f6c9c | 61 | WriteByteData( 0x00 ); |
ttodorov | 4:3ac4239f6c9c | 62 | WriteByteData( 0xD9 ); |
ttodorov | 12:d0978272a340 | 63 | |
ttodorov | 12:d0978272a340 | 64 | WriteCmd( 0xB0 ); // SETOSC |
ttodorov | 4:3ac4239f6c9c | 65 | WriteByteData( 0x01 ); |
ttodorov | 4:3ac4239f6c9c | 66 | WriteByteData( 0x11 ); |
ttodorov | 4:3ac4239f6c9c | 67 | |
ttodorov | 4:3ac4239f6c9c | 68 | WriteCmd( 0xC9 ); |
ttodorov | 4:3ac4239f6c9c | 69 | WriteByteData( 0x90 ); |
ttodorov | 4:3ac4239f6c9c | 70 | WriteByteData( 0x49 ); |
ttodorov | 4:3ac4239f6c9c | 71 | WriteByteData( 0x10 ); |
ttodorov | 4:3ac4239f6c9c | 72 | WriteByteData( 0x28 ); |
ttodorov | 4:3ac4239f6c9c | 73 | WriteByteData( 0x28 ); |
ttodorov | 4:3ac4239f6c9c | 74 | WriteByteData( 0x10 ); |
ttodorov | 4:3ac4239f6c9c | 75 | WriteByteData( 0x00 ); |
ttodorov | 4:3ac4239f6c9c | 76 | WriteByteData( 0x06 ); |
ttodorov | 4:3ac4239f6c9c | 77 | wait_ms( 20 ); |
ttodorov | 12:d0978272a340 | 78 | |
ttodorov | 12:d0978272a340 | 79 | WriteCmd( 0xC2 ); // SETGAMMAP |
ttodorov | 4:3ac4239f6c9c | 80 | WriteByteData( 0x60 ); |
ttodorov | 4:3ac4239f6c9c | 81 | WriteByteData( 0x71 ); |
ttodorov | 4:3ac4239f6c9c | 82 | WriteByteData( 0x01 ); |
ttodorov | 4:3ac4239f6c9c | 83 | WriteByteData( 0x0E ); |
ttodorov | 4:3ac4239f6c9c | 84 | WriteByteData( 0x05 ); |
ttodorov | 4:3ac4239f6c9c | 85 | WriteByteData( 0x02 ); |
ttodorov | 4:3ac4239f6c9c | 86 | WriteByteData( 0x09 ); |
ttodorov | 4:3ac4239f6c9c | 87 | WriteByteData( 0x31 ); |
ttodorov | 4:3ac4239f6c9c | 88 | WriteByteData( 0x0A ); |
ttodorov | 4:3ac4239f6c9c | 89 | |
ttodorov | 12:d0978272a340 | 90 | WriteCmd( 0xc3 ); // SETGAMMAN |
ttodorov | 4:3ac4239f6c9c | 91 | WriteByteData( 0x67 ); |
ttodorov | 4:3ac4239f6c9c | 92 | WriteByteData( 0x30 ); |
ttodorov | 4:3ac4239f6c9c | 93 | WriteByteData( 0x61 ); |
ttodorov | 4:3ac4239f6c9c | 94 | WriteByteData( 0x17 ); |
ttodorov | 4:3ac4239f6c9c | 95 | WriteByteData( 0x48 ); |
ttodorov | 4:3ac4239f6c9c | 96 | WriteByteData( 0x07 ); |
ttodorov | 4:3ac4239f6c9c | 97 | WriteByteData( 0x05 ); |
ttodorov | 4:3ac4239f6c9c | 98 | WriteByteData( 0x33 ); |
ttodorov | 4:3ac4239f6c9c | 99 | wait_ms( 10 ); |
ttodorov | 12:d0978272a340 | 100 | |
ttodorov | 12:d0978272a340 | 101 | WriteCmd( 0xB5 ); // SETPWCTR5 |
ttodorov | 4:3ac4239f6c9c | 102 | WriteByteData( 0x35 ); |
ttodorov | 4:3ac4239f6c9c | 103 | WriteByteData( 0x20 ); |
ttodorov | 4:3ac4239f6c9c | 104 | WriteByteData( 0x45 ); |
ttodorov | 4:3ac4239f6c9c | 105 | |
ttodorov | 12:d0978272a340 | 106 | WriteCmd( 0xB4 ); // SETPWCTR4 |
ttodorov | 4:3ac4239f6c9c | 107 | WriteByteData( 0x33 ); |
ttodorov | 4:3ac4239f6c9c | 108 | WriteByteData( 0x25 ); |
ttodorov | 4:3ac4239f6c9c | 109 | WriteByteData( 0x4c ); |
ttodorov | 4:3ac4239f6c9c | 110 | wait_ms( 10 ); |
ttodorov | 12:d0978272a340 | 111 | |
ttodorov | 12:d0978272a340 | 112 | WriteCmd( 0x3A ); // COLMOD == color depth: 0x05 => 16bit, 0x06 => 18bit |
ttodorov | 12:d0978272a340 | 113 | WriteByteData( _colorDepth == RGB16 ? 0x05 : 0x06 ); |
ttodorov | 12:d0978272a340 | 114 | |
ttodorov | 12:d0978272a340 | 115 | WriteCmd( 0x36 ); // MADCTL |
ttodorov | 12:d0978272a340 | 116 | switch ( _orientation ) |
ttodorov | 12:d0978272a340 | 117 | { |
ttodorov | 12:d0978272a340 | 118 | case LANDSCAPE: WriteByteData( 0xB8 ); break; |
ttodorov | 12:d0978272a340 | 119 | case PORTRAIT_REV: WriteByteData( 0xDC ); break; |
ttodorov | 12:d0978272a340 | 120 | case LANDSCAPE_REV: WriteByteData( 0x6C ); break; |
ttodorov | 12:d0978272a340 | 121 | case PORTRAIT: |
ttodorov | 12:d0978272a340 | 122 | default: WriteByteData( 0x08 ); break; |
ttodorov | 12:d0978272a340 | 123 | } |
ttodorov | 12:d0978272a340 | 124 | |
ttodorov | 12:d0978272a340 | 125 | WriteCmd( 0x29 ); // DISPON |
ttodorov | 4:3ac4239f6c9c | 126 | wait_ms( 10 ); |
ttodorov | 12:d0978272a340 | 127 | |
ttodorov | 12:d0978272a340 | 128 | ClearXY(); |
ttodorov | 4:3ac4239f6c9c | 129 | Deactivate(); |
ttodorov | 4:3ac4239f6c9c | 130 | } |
ttodorov | 4:3ac4239f6c9c | 131 | |
ttodorov | 4:3ac4239f6c9c | 132 | void HX8340S_LCD::Sleep( void ) |
ttodorov | 4:3ac4239f6c9c | 133 | { |
ttodorov | 4:3ac4239f6c9c | 134 | Activate(); |
ttodorov | 4:3ac4239f6c9c | 135 | WriteCmd( 0x28 ); |
ttodorov | 4:3ac4239f6c9c | 136 | wait_ms( 10 ); |
ttodorov | 4:3ac4239f6c9c | 137 | WriteCmd( 0x10 ); |
ttodorov | 4:3ac4239f6c9c | 138 | wait_ms( 125 ); |
ttodorov | 22:4c169297f374 | 139 | LCD::Sleep(); |
ttodorov | 4:3ac4239f6c9c | 140 | Deactivate(); |
ttodorov | 4:3ac4239f6c9c | 141 | } |
ttodorov | 4:3ac4239f6c9c | 142 | |
ttodorov | 4:3ac4239f6c9c | 143 | void HX8340S_LCD::WakeUp( void ) |
ttodorov | 4:3ac4239f6c9c | 144 | { |
ttodorov | 4:3ac4239f6c9c | 145 | Activate(); |
ttodorov | 4:3ac4239f6c9c | 146 | WriteCmd( 0x29 ); |
ttodorov | 4:3ac4239f6c9c | 147 | wait_ms( 10 ); |
ttodorov | 4:3ac4239f6c9c | 148 | WriteCmd( 0x11 ); |
ttodorov | 4:3ac4239f6c9c | 149 | wait_ms( 125 ); |
ttodorov | 22:4c169297f374 | 150 | LCD::WakeUp(); |
ttodorov | 4:3ac4239f6c9c | 151 | Deactivate(); |
ttodorov | 4:3ac4239f6c9c | 152 | } |
ttodorov | 4:3ac4239f6c9c | 153 | |
ttodorov | 4:3ac4239f6c9c | 154 | void HX8340S_LCD::WriteCmd( unsigned short cmd ) |
ttodorov | 4:3ac4239f6c9c | 155 | { |
ttodorov | 4:3ac4239f6c9c | 156 | _lcd_pin_sdi = LOW; |
ttodorov | 4:3ac4239f6c9c | 157 | pulseLow( _lcd_pin_scl ); |
ttodorov | 4:3ac4239f6c9c | 158 | serializeByte( cmd & 0xFF ); |
ttodorov | 4:3ac4239f6c9c | 159 | } |
ttodorov | 4:3ac4239f6c9c | 160 | |
ttodorov | 4:3ac4239f6c9c | 161 | void HX8340S_LCD::WriteData( unsigned short data ) |
ttodorov | 4:3ac4239f6c9c | 162 | { |
ttodorov | 4:3ac4239f6c9c | 163 | _lcd_pin_sdi = HIGH; |
ttodorov | 4:3ac4239f6c9c | 164 | pulseLow( _lcd_pin_scl ); |
ttodorov | 4:3ac4239f6c9c | 165 | serializeByte( ( data >> 8 ) & 0xFF ); |
ttodorov | 4:3ac4239f6c9c | 166 | _lcd_pin_sdi = HIGH; |
ttodorov | 4:3ac4239f6c9c | 167 | pulseLow( _lcd_pin_scl ); |
ttodorov | 4:3ac4239f6c9c | 168 | serializeByte( data & 0xFF ); |
ttodorov | 4:3ac4239f6c9c | 169 | } |
ttodorov | 4:3ac4239f6c9c | 170 | |
ttodorov | 4:3ac4239f6c9c | 171 | void HX8340S_LCD::WriteByteData( unsigned char data ) |
ttodorov | 4:3ac4239f6c9c | 172 | { |
ttodorov | 4:3ac4239f6c9c | 173 | _lcd_pin_sdi = HIGH; |
ttodorov | 4:3ac4239f6c9c | 174 | pulseLow( _lcd_pin_scl ); |
ttodorov | 4:3ac4239f6c9c | 175 | serializeByte( data ); |
ttodorov | 4:3ac4239f6c9c | 176 | } |
ttodorov | 4:3ac4239f6c9c | 177 | |
ttodorov | 20:4bdca8d8dadc | 178 | void HX8340S_LCD::SetXY( unsigned short x1, unsigned short y1, unsigned short x2, unsigned short y2 ) |
ttodorov | 4:3ac4239f6c9c | 179 | { |
ttodorov | 12:d0978272a340 | 180 | WriteCmdData( 0x2A, x1 ); // CASET |
ttodorov | 4:3ac4239f6c9c | 181 | WriteData( x2 ); |
ttodorov | 12:d0978272a340 | 182 | WriteCmdData( 0x2B, y1 ); // PASET |
ttodorov | 4:3ac4239f6c9c | 183 | WriteData( y2 ); |
ttodorov | 12:d0978272a340 | 184 | WriteCmd( 0x2C ); // RAMWR |
ttodorov | 4:3ac4239f6c9c | 185 | } |
ttodorov | 4:3ac4239f6c9c | 186 | |
ttodorov | 20:4bdca8d8dadc | 187 | void HX8340S_LCD::SetPixelColor( unsigned int color, colordepth_t mode ) |
ttodorov | 10:69571adcfad5 | 188 | { |
ttodorov | 20:4bdca8d8dadc | 189 | unsigned char r = 0, g = 0, b = 0; |
ttodorov | 20:4bdca8d8dadc | 190 | unsigned short clr; |
ttodorov | 12:d0978272a340 | 191 | if ( _colorDepth == RGB16 ) |
ttodorov | 12:d0978272a340 | 192 | { |
ttodorov | 20:4bdca8d8dadc | 193 | switch ( mode ) |
ttodorov | 20:4bdca8d8dadc | 194 | { |
ttodorov | 20:4bdca8d8dadc | 195 | case RGB16: |
ttodorov | 20:4bdca8d8dadc | 196 | WriteData( color & 0xFFFF ); |
ttodorov | 20:4bdca8d8dadc | 197 | break; |
ttodorov | 20:4bdca8d8dadc | 198 | case RGB18: |
ttodorov | 20:4bdca8d8dadc | 199 | r = ( color >> 10 ) & 0xF8; |
ttodorov | 20:4bdca8d8dadc | 200 | g = ( color >> 4 ) & 0xFC; |
ttodorov | 20:4bdca8d8dadc | 201 | b = ( color >> 1 ) & 0x1F; |
ttodorov | 20:4bdca8d8dadc | 202 | clr = ( ( r | ( g >> 5 ) ) << 8 ) | ( ( g << 3 ) | b ); |
ttodorov | 20:4bdca8d8dadc | 203 | WriteData( clr ); |
ttodorov | 20:4bdca8d8dadc | 204 | break; |
ttodorov | 20:4bdca8d8dadc | 205 | case RGB24: |
ttodorov | 20:4bdca8d8dadc | 206 | r = ( color >> 16 ) & 0xF8; |
ttodorov | 20:4bdca8d8dadc | 207 | g = ( color >> 8 ) & 0xFC; |
ttodorov | 20:4bdca8d8dadc | 208 | b = color & 0xF8; |
ttodorov | 20:4bdca8d8dadc | 209 | clr = ( ( r | ( g >> 5 ) ) << 8 ) | ( ( g << 3 ) | ( b >> 3 ) ); |
ttodorov | 20:4bdca8d8dadc | 210 | WriteData( clr ); |
ttodorov | 20:4bdca8d8dadc | 211 | break; |
ttodorov | 20:4bdca8d8dadc | 212 | } |
ttodorov | 12:d0978272a340 | 213 | } |
ttodorov | 15:af3cd35886fb | 214 | else if ( _colorDepth == RGB18 ) |
ttodorov | 12:d0978272a340 | 215 | { |
ttodorov | 20:4bdca8d8dadc | 216 | switch ( mode ) |
ttodorov | 20:4bdca8d8dadc | 217 | { |
ttodorov | 20:4bdca8d8dadc | 218 | case RGB16: |
ttodorov | 20:4bdca8d8dadc | 219 | r = ( ( color >> 8 ) & 0xF8 ) | ( ( color & 0x8000 ) >> 13 ); |
ttodorov | 20:4bdca8d8dadc | 220 | g = ( color >> 3 ) & 0xFC; |
ttodorov | 20:4bdca8d8dadc | 221 | b = ( ( color << 3 ) & 0xFC ) | ( ( color >> 3 ) & 0x01 ); |
ttodorov | 20:4bdca8d8dadc | 222 | break; |
ttodorov | 20:4bdca8d8dadc | 223 | case RGB18: |
ttodorov | 20:4bdca8d8dadc | 224 | b = ( color << 2 ) & 0xFC; |
ttodorov | 20:4bdca8d8dadc | 225 | g = ( color >> 4 ) & 0xFC; |
ttodorov | 20:4bdca8d8dadc | 226 | r = ( color >> 10 ) & 0xFC; |
ttodorov | 20:4bdca8d8dadc | 227 | break; |
ttodorov | 20:4bdca8d8dadc | 228 | case RGB24: |
ttodorov | 20:4bdca8d8dadc | 229 | r = ( color >> 16 ) & 0xFC; |
ttodorov | 20:4bdca8d8dadc | 230 | g = ( color >> 8 ) & 0xFC; |
ttodorov | 20:4bdca8d8dadc | 231 | b = color & 0xFC; |
ttodorov | 20:4bdca8d8dadc | 232 | break; |
ttodorov | 20:4bdca8d8dadc | 233 | } |
ttodorov | 20:4bdca8d8dadc | 234 | WriteByteData( r ); |
ttodorov | 20:4bdca8d8dadc | 235 | WriteByteData( g ); |
ttodorov | 20:4bdca8d8dadc | 236 | WriteByteData( b ); |
ttodorov | 12:d0978272a340 | 237 | } |
ttodorov | 10:69571adcfad5 | 238 | } |
ttodorov | 10:69571adcfad5 | 239 | |
ttodorov | 4:3ac4239f6c9c | 240 | void HX8340S_LCD::serializeByte( unsigned char data ) |
ttodorov | 4:3ac4239f6c9c | 241 | { |
ttodorov | 4:3ac4239f6c9c | 242 | for ( int i = 0; i < 8; i++ ) |
ttodorov | 4:3ac4239f6c9c | 243 | { |
ttodorov | 4:3ac4239f6c9c | 244 | if ( data & 0x80 ) _lcd_pin_sdi = HIGH; |
ttodorov | 4:3ac4239f6c9c | 245 | else _lcd_pin_sdi = LOW; |
ttodorov | 4:3ac4239f6c9c | 246 | pulseLow( _lcd_pin_scl ); |
ttodorov | 4:3ac4239f6c9c | 247 | data = data << 1; |
ttodorov | 4:3ac4239f6c9c | 248 | } |
ttodorov | 4:3ac4239f6c9c | 249 | } |