1.44 tft lcd display
Dependencies: TFT_fonts mbed-os
Fork of newTFTLCD by
hx8340bs.cpp@12:d0978272a340, 2012-12-11 (annotated)
- Committer:
- ttodorov
- Date:
- Tue Dec 11 18:11:14 2012 +0000
- Revision:
- 12:d0978272a340
- Parent:
- 10:69571adcfad5
- Child:
- 15:af3cd35886fb
- integrated RGB16 and RGB18 color depth configuration/selection; - integrated HW rotation for the HX8340-B driver; - changed the bitmap drawing API; - TODO: no drawing of rotated or scaled bitmaps yet
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 | 4:3ac4239f6c9c | 25 | HX8340S_LCD::HX8340S_LCD( PinName CS, PinName RESET, PinName SCL, PinName SDI, PinName BL ) |
ttodorov | 4:3ac4239f6c9c | 26 | : LCD( 176, 220, CS, NC, RESET ), _lcd_pin_scl( SCL ), _lcd_pin_sdi( SDI ) |
ttodorov | 4:3ac4239f6c9c | 27 | { |
ttodorov | 4:3ac4239f6c9c | 28 | if ( BL != NC ) _lcd_pin_bl = new DigitalOut( BL ); |
ttodorov | 4:3ac4239f6c9c | 29 | else _lcd_pin_bl = 0; |
ttodorov | 4:3ac4239f6c9c | 30 | } |
ttodorov | 9:58b328831d0a | 31 | |
ttodorov | 12:d0978272a340 | 32 | void HX8340S_LCD::Initialize( orientation_t orientation, colordepth_t colors ) |
ttodorov | 4:3ac4239f6c9c | 33 | { |
ttodorov | 4:3ac4239f6c9c | 34 | _orientation = orientation; |
ttodorov | 12:d0978272a340 | 35 | _colorDepth = colors; |
ttodorov | 4:3ac4239f6c9c | 36 | |
ttodorov | 4:3ac4239f6c9c | 37 | wait_ms( 100 ); |
ttodorov | 4:3ac4239f6c9c | 38 | _lcd_pin_reset = HIGH; |
ttodorov | 4:3ac4239f6c9c | 39 | wait_ms( 5 ); |
ttodorov | 4:3ac4239f6c9c | 40 | _lcd_pin_reset = LOW; |
ttodorov | 4:3ac4239f6c9c | 41 | wait_ms( 15 ); |
ttodorov | 4:3ac4239f6c9c | 42 | _lcd_pin_reset = HIGH; |
ttodorov | 4:3ac4239f6c9c | 43 | _lcd_pin_cs = HIGH; |
ttodorov | 4:3ac4239f6c9c | 44 | _lcd_pin_scl = HIGH; |
ttodorov | 4:3ac4239f6c9c | 45 | _lcd_pin_sdi = HIGH; |
ttodorov | 4:3ac4239f6c9c | 46 | if ( _lcd_pin_bl != 0 ) |
ttodorov | 4:3ac4239f6c9c | 47 | *_lcd_pin_bl = HIGH; |
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 | 4:3ac4239f6c9c | 139 | if ( _lcd_pin_bl != 0 ) |
ttodorov | 4:3ac4239f6c9c | 140 | *_lcd_pin_bl = LOW; |
ttodorov | 4:3ac4239f6c9c | 141 | Deactivate(); |
ttodorov | 4:3ac4239f6c9c | 142 | } |
ttodorov | 4:3ac4239f6c9c | 143 | |
ttodorov | 4:3ac4239f6c9c | 144 | void HX8340S_LCD::WakeUp( void ) |
ttodorov | 4:3ac4239f6c9c | 145 | { |
ttodorov | 4:3ac4239f6c9c | 146 | Activate(); |
ttodorov | 4:3ac4239f6c9c | 147 | WriteCmd( 0x29 ); |
ttodorov | 4:3ac4239f6c9c | 148 | wait_ms( 10 ); |
ttodorov | 4:3ac4239f6c9c | 149 | WriteCmd( 0x11 ); |
ttodorov | 4:3ac4239f6c9c | 150 | wait_ms( 125 ); |
ttodorov | 4:3ac4239f6c9c | 151 | if ( _lcd_pin_bl != 0 ) |
ttodorov | 4:3ac4239f6c9c | 152 | *_lcd_pin_bl = HIGH; |
ttodorov | 4:3ac4239f6c9c | 153 | Deactivate(); |
ttodorov | 4:3ac4239f6c9c | 154 | } |
ttodorov | 4:3ac4239f6c9c | 155 | |
ttodorov | 4:3ac4239f6c9c | 156 | void HX8340S_LCD::WriteCmd( unsigned short cmd ) |
ttodorov | 4:3ac4239f6c9c | 157 | { |
ttodorov | 4:3ac4239f6c9c | 158 | _lcd_pin_sdi = LOW; |
ttodorov | 4:3ac4239f6c9c | 159 | pulseLow( _lcd_pin_scl ); |
ttodorov | 4:3ac4239f6c9c | 160 | serializeByte( cmd & 0xFF ); |
ttodorov | 4:3ac4239f6c9c | 161 | } |
ttodorov | 4:3ac4239f6c9c | 162 | |
ttodorov | 4:3ac4239f6c9c | 163 | void HX8340S_LCD::WriteData( unsigned short data ) |
ttodorov | 4:3ac4239f6c9c | 164 | { |
ttodorov | 4:3ac4239f6c9c | 165 | _lcd_pin_sdi = HIGH; |
ttodorov | 4:3ac4239f6c9c | 166 | pulseLow( _lcd_pin_scl ); |
ttodorov | 4:3ac4239f6c9c | 167 | serializeByte( ( data >> 8 ) & 0xFF ); |
ttodorov | 4:3ac4239f6c9c | 168 | _lcd_pin_sdi = HIGH; |
ttodorov | 4:3ac4239f6c9c | 169 | pulseLow( _lcd_pin_scl ); |
ttodorov | 4:3ac4239f6c9c | 170 | serializeByte( data & 0xFF ); |
ttodorov | 4:3ac4239f6c9c | 171 | } |
ttodorov | 4:3ac4239f6c9c | 172 | |
ttodorov | 4:3ac4239f6c9c | 173 | void HX8340S_LCD::WriteByteData( unsigned char data ) |
ttodorov | 4:3ac4239f6c9c | 174 | { |
ttodorov | 4:3ac4239f6c9c | 175 | _lcd_pin_sdi = HIGH; |
ttodorov | 4:3ac4239f6c9c | 176 | pulseLow( _lcd_pin_scl ); |
ttodorov | 4:3ac4239f6c9c | 177 | serializeByte( data ); |
ttodorov | 4:3ac4239f6c9c | 178 | } |
ttodorov | 4:3ac4239f6c9c | 179 | |
ttodorov | 4:3ac4239f6c9c | 180 | void HX8340S_LCD::SetXY( uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2 ) |
ttodorov | 4:3ac4239f6c9c | 181 | { |
ttodorov | 12:d0978272a340 | 182 | WriteCmdData( 0x2A, x1 ); // CASET |
ttodorov | 4:3ac4239f6c9c | 183 | WriteData( x2 ); |
ttodorov | 12:d0978272a340 | 184 | WriteCmdData( 0x2B, y1 ); // PASET |
ttodorov | 4:3ac4239f6c9c | 185 | WriteData( y2 ); |
ttodorov | 12:d0978272a340 | 186 | WriteCmd( 0x2C ); // RAMWR |
ttodorov | 4:3ac4239f6c9c | 187 | } |
ttodorov | 4:3ac4239f6c9c | 188 | |
ttodorov | 12:d0978272a340 | 189 | void HX8340S_LCD::SetPixelColor( unsigned int color ) |
ttodorov | 10:69571adcfad5 | 190 | { |
ttodorov | 12:d0978272a340 | 191 | unsigned char r, g, b; |
ttodorov | 12:d0978272a340 | 192 | r = ( color >> 16 ) & 0xFF; |
ttodorov | 12:d0978272a340 | 193 | g = ( color >> 8 ) & 0xFF; |
ttodorov | 12:d0978272a340 | 194 | b = color & 0xFF; |
ttodorov | 12:d0978272a340 | 195 | if ( _colorDepth == RGB16 ) |
ttodorov | 12:d0978272a340 | 196 | { |
ttodorov | 12:d0978272a340 | 197 | unsigned short clr = ( ( ( ( r ) & 0xF8 ) | ( ( g ) >> 5 ) ) << 8 ) | ( ( ( ( g ) & 0x1C ) << 3 ) | ( ( b ) >> 3 ) ); |
ttodorov | 12:d0978272a340 | 198 | WriteData( clr ); |
ttodorov | 12:d0978272a340 | 199 | } |
ttodorov | 12:d0978272a340 | 200 | else |
ttodorov | 12:d0978272a340 | 201 | { |
ttodorov | 12:d0978272a340 | 202 | WriteByteData( r & 0xFC ); |
ttodorov | 12:d0978272a340 | 203 | WriteByteData( g & 0xFC ); |
ttodorov | 12:d0978272a340 | 204 | WriteByteData( b & 0xFC ); |
ttodorov | 12:d0978272a340 | 205 | } |
ttodorov | 10:69571adcfad5 | 206 | } |
ttodorov | 10:69571adcfad5 | 207 | |
ttodorov | 4:3ac4239f6c9c | 208 | void HX8340S_LCD::serializeByte( unsigned char data ) |
ttodorov | 4:3ac4239f6c9c | 209 | { |
ttodorov | 4:3ac4239f6c9c | 210 | for ( int i = 0; i < 8; i++ ) |
ttodorov | 4:3ac4239f6c9c | 211 | { |
ttodorov | 4:3ac4239f6c9c | 212 | if ( data & 0x80 ) _lcd_pin_sdi = HIGH; |
ttodorov | 4:3ac4239f6c9c | 213 | else _lcd_pin_sdi = LOW; |
ttodorov | 4:3ac4239f6c9c | 214 | pulseLow( _lcd_pin_scl ); |
ttodorov | 4:3ac4239f6c9c | 215 | data = data << 1; |
ttodorov | 4:3ac4239f6c9c | 216 | } |
ttodorov | 4:3ac4239f6c9c | 217 | } |