Fork of TFTLCD with new support for SSD1963 ad HX8352-A controller.

Dependents:   TFTLCD_Fork_Test

Fork of TFTLCD by Todor Todorov

Committer:
RobertFischer
Date:
Fri May 30 08:39:59 2014 +0000
Revision:
28:fe9a2e0ce659
First test of TFTLCD with new support for SSD1963 and HX8352-A display controller. Still some scrambled output

Who changed what in which revision?

UserRevisionLine numberNew contents of line
RobertFischer 28:fe9a2e0ce659 1 /*
RobertFischer 28:fe9a2e0ce659 2 * Copyright (C)2010-2012 Henning Karlsen. All right reserved.
RobertFischer 28:fe9a2e0ce659 3 * Copyright (C)2012 Todor Todorov.
RobertFischer 28:fe9a2e0ce659 4 *
RobertFischer 28:fe9a2e0ce659 5 * This library is free software; you can redistribute it and/or
RobertFischer 28:fe9a2e0ce659 6 * modify it under the terms of the GNU Lesser General Public
RobertFischer 28:fe9a2e0ce659 7 * License as published by the Free Software Foundation; either
RobertFischer 28:fe9a2e0ce659 8 * version 2.1 of the License, or (at your option) any later version.
RobertFischer 28:fe9a2e0ce659 9 *
RobertFischer 28:fe9a2e0ce659 10 * This library is distributed in the hope that it will be useful,
RobertFischer 28:fe9a2e0ce659 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
RobertFischer 28:fe9a2e0ce659 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
RobertFischer 28:fe9a2e0ce659 13 * Lesser General Public License for more details.
RobertFischer 28:fe9a2e0ce659 14 *
RobertFischer 28:fe9a2e0ce659 15 * You should have received a copy of the GNU Lesser General Public
RobertFischer 28:fe9a2e0ce659 16 * License along with this library; if not, write to:
RobertFischer 28:fe9a2e0ce659 17 *
RobertFischer 28:fe9a2e0ce659 18 * Free Software Foundation, Inc.
RobertFischer 28:fe9a2e0ce659 19 * 51 Franklin St, 5th Floor, Boston, MA 02110-1301, USA
RobertFischer 28:fe9a2e0ce659 20 *
RobertFischer 28:fe9a2e0ce659 21 *********************************************************************/
RobertFischer 28:fe9a2e0ce659 22 #include "ssd1963.h"
RobertFischer 28:fe9a2e0ce659 23 #include "helpers.h"
RobertFischer 28:fe9a2e0ce659 24
RobertFischer 28:fe9a2e0ce659 25 SSD1963_LCD::SSD1963_LCD( PinName CS, PinName RESET, PinName RS, PinName WR, BusOut* DATA_PORT, PinName BL, PinName RD, backlight_t blType, float defaultBackLightLevel )
RobertFischer 28:fe9a2e0ce659 26 : LCD( 272, 480, CS, RS, RESET, BL, blType, defaultBackLightLevel ), _lcd_pin_wr( WR )
RobertFischer 28:fe9a2e0ce659 27 {
RobertFischer 28:fe9a2e0ce659 28 _lcd_port = DATA_PORT;
RobertFischer 28:fe9a2e0ce659 29 if ( RD != NC ) _lcd_pin_rd = new DigitalOut( RD );
RobertFischer 28:fe9a2e0ce659 30 else _lcd_pin_rd = 0;
RobertFischer 28:fe9a2e0ce659 31 }
RobertFischer 28:fe9a2e0ce659 32
RobertFischer 28:fe9a2e0ce659 33 void SSD1963_LCD::Initialize( orientation_t orientation, colordepth_t colors )
RobertFischer 28:fe9a2e0ce659 34 {
RobertFischer 28:fe9a2e0ce659 35 _orientation = orientation;
RobertFischer 28:fe9a2e0ce659 36 _colorDepth = colors;
RobertFischer 28:fe9a2e0ce659 37
RobertFischer 28:fe9a2e0ce659 38 _lcd_pin_reset = HIGH;
RobertFischer 28:fe9a2e0ce659 39 wait_ms( 5 );
RobertFischer 28:fe9a2e0ce659 40 _lcd_pin_reset = LOW;
RobertFischer 28:fe9a2e0ce659 41 wait_ms( 15 );
RobertFischer 28:fe9a2e0ce659 42 _lcd_pin_reset = HIGH;
RobertFischer 28:fe9a2e0ce659 43 _lcd_pin_cs = HIGH;
RobertFischer 28:fe9a2e0ce659 44 if ( _lcd_pin_bl != 0 )
RobertFischer 28:fe9a2e0ce659 45 *_lcd_pin_bl = HIGH;
RobertFischer 28:fe9a2e0ce659 46 else if ( _bl_pwm != 0 )
RobertFischer 28:fe9a2e0ce659 47 *_bl_pwm = _bl_pwm_default;
RobertFischer 28:fe9a2e0ce659 48 if ( _lcd_pin_rd != 0 )
RobertFischer 28:fe9a2e0ce659 49 *_lcd_pin_rd = HIGH;
RobertFischer 28:fe9a2e0ce659 50 _lcd_pin_wr = HIGH;
RobertFischer 28:fe9a2e0ce659 51 wait_ms( 15 );
RobertFischer 28:fe9a2e0ce659 52
RobertFischer 28:fe9a2e0ce659 53 Activate();
RobertFischer 28:fe9a2e0ce659 54 // Set PLL MN -------------------------------------------------------------
RobertFischer 28:fe9a2e0ce659 55 // @Parameters : 3
RobertFischer 28:fe9a2e0ce659 56 WriteCmd(0xE2);
RobertFischer 28:fe9a2e0ce659 57 WriteData(0x23); // N[7:0] : Multiplier (N) of PLL. (POR = 00101101) b00100011
RobertFischer 28:fe9a2e0ce659 58 WriteData(0x02); // M[3:0] : Divider (M) of PLL. (POR = 0011)
RobertFischer 28:fe9a2e0ce659 59 WriteData(0x04); // C[2] : Effectuate MN value (POR = 100) - Effectuate the multiplier and divider value
RobertFischer 28:fe9a2e0ce659 60 //WriteData(0x54);
RobertFischer 28:fe9a2e0ce659 61
RobertFischer 28:fe9a2e0ce659 62 // Set PLL
RobertFischer 28:fe9a2e0ce659 63 // @Parameters : 1
RobertFischer 28:fe9a2e0ce659 64 WriteCmd(0xE0);
RobertFischer 28:fe9a2e0ce659 65 WriteData(0x01); // Use reference clock as system clock & Enable PLL
RobertFischer 28:fe9a2e0ce659 66 wait_ms(1); // Wait 100us to let the PLL stable
RobertFischer 28:fe9a2e0ce659 67 WriteCmd(0xE0); // Set PLL
RobertFischer 28:fe9a2e0ce659 68 WriteData(0x03); // Use PLL output as system clock & Enable PLL
RobertFischer 28:fe9a2e0ce659 69 wait_ms(1);
RobertFischer 28:fe9a2e0ce659 70
RobertFischer 28:fe9a2e0ce659 71 // Software Reset ---------------------------------------------------------
RobertFischer 28:fe9a2e0ce659 72 WriteCmd(0x01);
RobertFischer 28:fe9a2e0ce659 73 wait_ms(1);
RobertFischer 28:fe9a2e0ce659 74
RobertFischer 28:fe9a2e0ce659 75 // Set LSHIFT Frequency ---------------------------------------------------
RobertFischer 28:fe9a2e0ce659 76 // @Parameters : 3
RobertFischer 28:fe9a2e0ce659 77 WriteCmd(0xE6); // Set LSHIFT Frequency
RobertFischer 28:fe9a2e0ce659 78 WriteData(0x03); // LCDC_FPR[19:16] : The highest 4 bits for the pixel clock frequency settings
RobertFischer 28:fe9a2e0ce659 79 WriteData(0xFF); // LCDC_FPR[15:8] : The higher byte for the pixel clock frequency settings
RobertFischer 28:fe9a2e0ce659 80 WriteData(0xFF); // LCDC_FPR[7:0] : The low byte for the pixel clock frequency settings
RobertFischer 28:fe9a2e0ce659 81
RobertFischer 28:fe9a2e0ce659 82 // Set LCD Mode
RobertFischer 28:fe9a2e0ce659 83 // @Parameters : 7
RobertFischer 28:fe9a2e0ce659 84 WriteCmd(0xB0);
RobertFischer 28:fe9a2e0ce659 85 /*
RobertFischer 28:fe9a2e0ce659 86 WriteData(0x00); // A[5..0] TFT
RobertFischer 28:fe9a2e0ce659 87 //WriteData(0x10);
RobertFischer 28:fe9a2e0ce659 88 WriteData(0x00); // B[7..5] : Hsync+Vsync +DE mode & TFT mode
RobertFischer 28:fe9a2e0ce659 89 //WriteData(0x80);
RobertFischer 28:fe9a2e0ce659 90 WriteData((HDP>>8)&0xFF); // HPS[10:8] : Set the horizontal panel size (POR = 010)
RobertFischer 28:fe9a2e0ce659 91 WriteData(HDP&0xFF); // HPS[7:0] : Set the horizontal panel size (POR = 01111111)
RobertFischer 28:fe9a2e0ce659 92 WriteData((VDP>>8)&0xFF); // VPS[10:8] : Set the vertical panel size (POR = 001)
RobertFischer 28:fe9a2e0ce659 93 WriteData(VDP&0xFF); // VPS[7:0] : Set the vertical panel size (POR = 11011111)
RobertFischer 28:fe9a2e0ce659 94 WriteData(0x00); // G[5..0] : Even line RGB sequence & Odd line RGB sequence
RobertFischer 28:fe9a2e0ce659 95 */
RobertFischer 28:fe9a2e0ce659 96 //WriteData(0x10); // set 18-bit for 7" panel TY700TFT800480
RobertFischer 28:fe9a2e0ce659 97 WriteData(0x20); // set 18-bit for 7" panel TY700TFT800480
RobertFischer 28:fe9a2e0ce659 98 //WriteData(0x80); // set TTL mode
RobertFischer 28:fe9a2e0ce659 99 WriteData(0x00); // set TTL mode
RobertFischer 28:fe9a2e0ce659 100 WriteData((DISP_HOR_RESOLUTION-1)>>8); //Set panel size
RobertFischer 28:fe9a2e0ce659 101 WriteData(DISP_HOR_RESOLUTION-1);
RobertFischer 28:fe9a2e0ce659 102 WriteData((DISP_VER_RESOLUTION-1)>>8);
RobertFischer 28:fe9a2e0ce659 103 WriteData(DISP_VER_RESOLUTION-1);
RobertFischer 28:fe9a2e0ce659 104 WriteData(0x00);
RobertFischer 28:fe9a2e0ce659 105
RobertFischer 28:fe9a2e0ce659 106
RobertFischer 28:fe9a2e0ce659 107 // Set Horizontal Period --------------------------------------------------
RobertFischer 28:fe9a2e0ce659 108 // @Parameters : 8
RobertFischer 28:fe9a2e0ce659 109 WriteCmd(0xB4);
RobertFischer 28:fe9a2e0ce659 110 /*
RobertFischer 28:fe9a2e0ce659 111 WriteData((HT>>8)&0xFF); // HT[10:8] : High byte of horizontal total period (display + non-display) in pixel clock
RobertFischer 28:fe9a2e0ce659 112 WriteData(HT&0xFF); // HT[7:0] : Low byte of the horizontal total period (display + non-display) in pixel clock
RobertFischer 28:fe9a2e0ce659 113 WriteData((HPS>>8)&0xFF); // HPS[10:8] : High byte of the non-display period between the start of the horizontal sync (LLINE) signal
RobertFischer 28:fe9a2e0ce659 114 WriteData(HPS&0xFF); // HPS[7:0] : Low byte of the non-display period between the start of the horizontal sync (LLINE) signal
RobertFischer 28:fe9a2e0ce659 115 WriteData(HPW&0xFF); // HPW[6:0] : Set the horizontal sync pulse width (LLINE) in pixel clock
RobertFischer 28:fe9a2e0ce659 116 WriteData((LPS>>8)&0xFF); // LPS[10:8] : Set the horizontal sync pulse (LLINE) start location in pixel clock
RobertFischer 28:fe9a2e0ce659 117 WriteData(LPS&0xFF); // LPS[7:0] : Set the horizontal sync pulse width (LLINE) in start.
RobertFischer 28:fe9a2e0ce659 118 WriteData(0x00); // LPSPP[1:0] : Set the horizontal sync pulse subpixel start position
RobertFischer 28:fe9a2e0ce659 119 */
RobertFischer 28:fe9a2e0ce659 120 #define HT (DISP_HOR_RESOLUTION+DISP_HOR_PULSE_WIDTH+DISP_HOR_BACK_PORCH+DISP_HOR_FRONT_PORCH)
RobertFischer 28:fe9a2e0ce659 121 WriteData((HT-1)>>8);
RobertFischer 28:fe9a2e0ce659 122 WriteData(HT-1);
RobertFischer 28:fe9a2e0ce659 123 #define HPS (DISP_HOR_PULSE_WIDTH+DISP_HOR_BACK_PORCH)
RobertFischer 28:fe9a2e0ce659 124 WriteData((HPS-1)>>8);
RobertFischer 28:fe9a2e0ce659 125 WriteData(HPS-1);
RobertFischer 28:fe9a2e0ce659 126 WriteData(DISP_HOR_PULSE_WIDTH-1);
RobertFischer 28:fe9a2e0ce659 127 WriteData(0x00);
RobertFischer 28:fe9a2e0ce659 128 WriteData(0x00);
RobertFischer 28:fe9a2e0ce659 129 WriteData(0x00);
RobertFischer 28:fe9a2e0ce659 130
RobertFischer 28:fe9a2e0ce659 131 // Set Vertical Period ----------------------------------------------------
RobertFischer 28:fe9a2e0ce659 132 // @Parameters : 7
RobertFischer 28:fe9a2e0ce659 133 WriteCmd(0xB6);
RobertFischer 28:fe9a2e0ce659 134 /*
RobertFischer 28:fe9a2e0ce659 135 WriteData((VT>>8)&0xFF); // VT[10:8] : High byte of the vertical total (display + non-display) period in lines
RobertFischer 28:fe9a2e0ce659 136 WriteData(VT&0xFF); // VT[7:0] : Low byte of the vertical total (display + non-display) period in lines
RobertFischer 28:fe9a2e0ce659 137 WriteData((VPS>>8)&0xFF); // VPS[10:8] : High byte the non-display period in lines between the start of the frame and the first display data in line
RobertFischer 28:fe9a2e0ce659 138 WriteData(VPS&0xFF); // VPS[7:0] : The non-display period in lines between the start of the frame and the first display data in line
RobertFischer 28:fe9a2e0ce659 139 WriteData(VPW&0xFF); // VPW[6:0] : Set the vertical sync pulse width (LFRAME) in lines
RobertFischer 28:fe9a2e0ce659 140 WriteData((FPS>>8)&0xFF); // FPS[10:8] : High byte of the vertical sync pulse (LFRAME) start location in lines
RobertFischer 28:fe9a2e0ce659 141 WriteData(FPS&0xFF); // FPS[7:0] : Low byte of the vertical sync pulse (LFRAME) start location in lines
RobertFischer 28:fe9a2e0ce659 142 */
RobertFischer 28:fe9a2e0ce659 143 #define VT (DISP_VER_PULSE_WIDTH+DISP_VER_BACK_PORCH+DISP_VER_FRONT_PORCH+DISP_VER_RESOLUTION)
RobertFischer 28:fe9a2e0ce659 144 WriteData((VT-1)>>8);
RobertFischer 28:fe9a2e0ce659 145 WriteData(VT-1);
RobertFischer 28:fe9a2e0ce659 146 #define VSP (DISP_VER_PULSE_WIDTH+DISP_VER_BACK_PORCH)
RobertFischer 28:fe9a2e0ce659 147 WriteData((VSP-1)>>8);
RobertFischer 28:fe9a2e0ce659 148 WriteData(VSP-1);
RobertFischer 28:fe9a2e0ce659 149 WriteData(DISP_VER_PULSE_WIDTH-1);
RobertFischer 28:fe9a2e0ce659 150 WriteData(0x00);
RobertFischer 28:fe9a2e0ce659 151 WriteData(0x00);
RobertFischer 28:fe9a2e0ce659 152
RobertFischer 28:fe9a2e0ce659 153 // Set GPIO Value ---------------------------------------------------------
RobertFischer 28:fe9a2e0ce659 154 // @Parameters : 1
RobertFischer 28:fe9a2e0ce659 155 WriteCmd(0xBA);
RobertFischer 28:fe9a2e0ce659 156 WriteData(0x05); // A[3..0] : GPIO[2:0] Output 1
RobertFischer 28:fe9a2e0ce659 157
RobertFischer 28:fe9a2e0ce659 158 // Set GPIO Configuration
RobertFischer 28:fe9a2e0ce659 159 // @Parameters : 2
RobertFischer 28:fe9a2e0ce659 160 WriteCmd(0xB8);
RobertFischer 28:fe9a2e0ce659 161 WriteData(0x07); // A[7..0] : GPIO3 = Input, GPIO[2:0] = Output
RobertFischer 28:fe9a2e0ce659 162 WriteData(0x01); // B[0] : GPIO0 Normal
RobertFischer 28:fe9a2e0ce659 163
RobertFischer 28:fe9a2e0ce659 164 //Set pixel format, i.e. the bpp
RobertFischer 28:fe9a2e0ce659 165 WriteCmd(0x3A);
RobertFischer 28:fe9a2e0ce659 166 WriteData(0x55); // set 16bpp
RobertFischer 28:fe9a2e0ce659 167
RobertFischer 28:fe9a2e0ce659 168 // Set Address Mode -------------------------------------------------------
RobertFischer 28:fe9a2e0ce659 169 // @Parameters : 1
RobertFischer 28:fe9a2e0ce659 170 //WriteCmd(0x36); // Set Rotation
RobertFischer 28:fe9a2e0ce659 171 //WriteData(0x00); // A[7..0] : Set the read order from host processor to frame buffer by A[7:5] and A[3] and
RobertFischer 28:fe9a2e0ce659 172 // from frame buffer to the display panel by A[2:0] and A[4].
RobertFischer 28:fe9a2e0ce659 173 // A[7] : Page address order
RobertFischer 28:fe9a2e0ce659 174 // Set Pixel Data Interface -----------------------------------------------
RobertFischer 28:fe9a2e0ce659 175 // @Parameters : 1
RobertFischer 28:fe9a2e0ce659 176 WriteCmd(0xF0); // A[2:0] : Pixel Data Interface Format
RobertFischer 28:fe9a2e0ce659 177 WriteData(0x03); // 16-bit (565 format)
RobertFischer 28:fe9a2e0ce659 178 wait_ms(1);
RobertFischer 28:fe9a2e0ce659 179
RobertFischer 28:fe9a2e0ce659 180 // enter_partial_mode
RobertFischer 28:fe9a2e0ce659 181 //WriteCmd(0x12); // Part of the display area is used for image display
RobertFischer 28:fe9a2e0ce659 182 // set_display_on
RobertFischer 28:fe9a2e0ce659 183 WriteCmd(0x29); // Show the image on the display device
RobertFischer 28:fe9a2e0ce659 184
RobertFischer 28:fe9a2e0ce659 185 Deactivate();
RobertFischer 28:fe9a2e0ce659 186 }
RobertFischer 28:fe9a2e0ce659 187
RobertFischer 28:fe9a2e0ce659 188 void SSD1963_LCD::Sleep( void )
RobertFischer 28:fe9a2e0ce659 189 {
RobertFischer 28:fe9a2e0ce659 190 WriteCmdData( 0x10, 0x0001 ); // sleep mode: 0 = exit, 1 = enter
RobertFischer 28:fe9a2e0ce659 191 LCD::Sleep();
RobertFischer 28:fe9a2e0ce659 192 }
RobertFischer 28:fe9a2e0ce659 193
RobertFischer 28:fe9a2e0ce659 194 void SSD1963_LCD::WakeUp( void )
RobertFischer 28:fe9a2e0ce659 195 {
RobertFischer 28:fe9a2e0ce659 196 WriteCmdData( 0x10, 0x0000 ); // sleep mode: 0 = exit, 1 = enter
RobertFischer 28:fe9a2e0ce659 197 LCD::WakeUp();
RobertFischer 28:fe9a2e0ce659 198 }
RobertFischer 28:fe9a2e0ce659 199
RobertFischer 28:fe9a2e0ce659 200 void SSD1963_LCD::WriteCmd( unsigned short cmd )
RobertFischer 28:fe9a2e0ce659 201 {
RobertFischer 28:fe9a2e0ce659 202 _lcd_pin_rs = LOW;
RobertFischer 28:fe9a2e0ce659 203 _lcd_port->write( cmd );
RobertFischer 28:fe9a2e0ce659 204 _lcd_pin_wr = LOW;
RobertFischer 28:fe9a2e0ce659 205 wait_us(1);
RobertFischer 28:fe9a2e0ce659 206 _lcd_pin_wr = HIGH;
RobertFischer 28:fe9a2e0ce659 207 //pulseLow( _lcd_pin_wr );
RobertFischer 28:fe9a2e0ce659 208 }
RobertFischer 28:fe9a2e0ce659 209
RobertFischer 28:fe9a2e0ce659 210 void SSD1963_LCD::WriteData( unsigned short data )
RobertFischer 28:fe9a2e0ce659 211 {
RobertFischer 28:fe9a2e0ce659 212 _lcd_pin_rs = HIGH;
RobertFischer 28:fe9a2e0ce659 213 _lcd_port->write( data );
RobertFischer 28:fe9a2e0ce659 214 _lcd_pin_wr = LOW;
RobertFischer 28:fe9a2e0ce659 215 wait_us(1);
RobertFischer 28:fe9a2e0ce659 216 _lcd_pin_wr = HIGH;
RobertFischer 28:fe9a2e0ce659 217
RobertFischer 28:fe9a2e0ce659 218 //pulseLow( _lcd_pin_wr );
RobertFischer 28:fe9a2e0ce659 219 }
RobertFischer 28:fe9a2e0ce659 220
RobertFischer 28:fe9a2e0ce659 221 void SSD1963_LCD::SetXY( unsigned short x1, unsigned short y1, unsigned short x2, unsigned short y2 )
RobertFischer 28:fe9a2e0ce659 222 {
RobertFischer 28:fe9a2e0ce659 223 //if ( _orientation == PORTRAIT || _orientation == PORTRAIT_REV )
RobertFischer 28:fe9a2e0ce659 224 //{
RobertFischer 28:fe9a2e0ce659 225 WriteCmd( 0x2A);
RobertFischer 28:fe9a2e0ce659 226 WriteData( x1>>8 );
RobertFischer 28:fe9a2e0ce659 227 WriteData( x1 );
RobertFischer 28:fe9a2e0ce659 228 WriteData( x2>>8 );
RobertFischer 28:fe9a2e0ce659 229 WriteData( x2 );
RobertFischer 28:fe9a2e0ce659 230 WriteCmd( 0x2B);
RobertFischer 28:fe9a2e0ce659 231 WriteData( y1>>8 );
RobertFischer 28:fe9a2e0ce659 232 WriteData( y1 );
RobertFischer 28:fe9a2e0ce659 233 WriteData( y2>>8 );
RobertFischer 28:fe9a2e0ce659 234 WriteData( y2 );
RobertFischer 28:fe9a2e0ce659 235 WriteCmd( 0x2B);
RobertFischer 28:fe9a2e0ce659 236 /*}
RobertFischer 28:fe9a2e0ce659 237 else
RobertFischer 28:fe9a2e0ce659 238 {
RobertFischer 28:fe9a2e0ce659 239 WriteCmd( 0x2A);
RobertFischer 28:fe9a2e0ce659 240 WriteData( y1>>8 );
RobertFischer 28:fe9a2e0ce659 241 WriteData( y1 );
RobertFischer 28:fe9a2e0ce659 242 WriteData( y2>>8 );
RobertFischer 28:fe9a2e0ce659 243 WriteData( y2 );
RobertFischer 28:fe9a2e0ce659 244 WriteCmd( 0x2B);
RobertFischer 28:fe9a2e0ce659 245 WriteData( x1>>8 );
RobertFischer 28:fe9a2e0ce659 246 WriteData( x1 );
RobertFischer 28:fe9a2e0ce659 247 WriteData( x2>>8 );
RobertFischer 28:fe9a2e0ce659 248 WriteData( x2 );
RobertFischer 28:fe9a2e0ce659 249 WriteCmd( 0x2B);
RobertFischer 28:fe9a2e0ce659 250 }*/
RobertFischer 28:fe9a2e0ce659 251 WriteCmd( 0x2C );
RobertFischer 28:fe9a2e0ce659 252 }
RobertFischer 28:fe9a2e0ce659 253
RobertFischer 28:fe9a2e0ce659 254 void SSD1963_LCD::SetPixelColor( unsigned int color, colordepth_t mode )
RobertFischer 28:fe9a2e0ce659 255 {
RobertFischer 28:fe9a2e0ce659 256 unsigned char r, g, b;
RobertFischer 28:fe9a2e0ce659 257 unsigned short clr;
RobertFischer 28:fe9a2e0ce659 258 if ( _colorDepth == RGB16 )
RobertFischer 28:fe9a2e0ce659 259 {
RobertFischer 28:fe9a2e0ce659 260 switch ( mode )
RobertFischer 28:fe9a2e0ce659 261 {
RobertFischer 28:fe9a2e0ce659 262 case RGB16:
RobertFischer 28:fe9a2e0ce659 263 WriteData( color & 0xFFFF );
RobertFischer 28:fe9a2e0ce659 264 break;
RobertFischer 28:fe9a2e0ce659 265 case RGB18:
RobertFischer 28:fe9a2e0ce659 266 r = ( color >> 10 ) & 0xF8;
RobertFischer 28:fe9a2e0ce659 267 g = ( color >> 4 ) & 0xFC;
RobertFischer 28:fe9a2e0ce659 268 b = ( color >> 1 ) & 0x1F;
RobertFischer 28:fe9a2e0ce659 269 clr = ( ( r | ( g >> 5 ) ) << 8 ) | ( ( g << 3 ) | b );
RobertFischer 28:fe9a2e0ce659 270 WriteData( clr );
RobertFischer 28:fe9a2e0ce659 271 break;
RobertFischer 28:fe9a2e0ce659 272 case RGB24:
RobertFischer 28:fe9a2e0ce659 273 r = ( color >> 16 ) & 0xF8;
RobertFischer 28:fe9a2e0ce659 274 g = ( color >> 8 ) & 0xFC;
RobertFischer 28:fe9a2e0ce659 275 b = color & 0xF8;
RobertFischer 28:fe9a2e0ce659 276 clr = ( ( r | ( g >> 5 ) ) << 8 ) | ( ( g << 3 ) | ( b >> 3 ) );
RobertFischer 28:fe9a2e0ce659 277 WriteData( clr );
RobertFischer 28:fe9a2e0ce659 278 break;
RobertFischer 28:fe9a2e0ce659 279 }
RobertFischer 28:fe9a2e0ce659 280 }
RobertFischer 28:fe9a2e0ce659 281 else if ( _colorDepth == RGB18 )
RobertFischer 28:fe9a2e0ce659 282 {
RobertFischer 28:fe9a2e0ce659 283 switch ( mode )
RobertFischer 28:fe9a2e0ce659 284 {
RobertFischer 28:fe9a2e0ce659 285 case RGB16:
RobertFischer 28:fe9a2e0ce659 286 r = ( ( color >> 8 ) & 0xF8 ) | ( ( color & 0x8000 ) >> 13 );
RobertFischer 28:fe9a2e0ce659 287 g = ( color >> 3 ) & 0xFC;
RobertFischer 28:fe9a2e0ce659 288 b = ( ( color << 3 ) & 0xFC ) | ( ( color >> 3 ) & 0x01 );
RobertFischer 28:fe9a2e0ce659 289 WriteData( ( r << 8 ) | g );
RobertFischer 28:fe9a2e0ce659 290 WriteData( b );
RobertFischer 28:fe9a2e0ce659 291 break;
RobertFischer 28:fe9a2e0ce659 292 case RGB18:
RobertFischer 28:fe9a2e0ce659 293 b = ( color << 2 ) & 0xFC;
RobertFischer 28:fe9a2e0ce659 294 g = ( color >> 4 ) & 0xFC;
RobertFischer 28:fe9a2e0ce659 295 r = ( color >> 10 ) & 0xFC;
RobertFischer 28:fe9a2e0ce659 296 WriteData( ( r << 8 ) | g );
RobertFischer 28:fe9a2e0ce659 297 WriteData( b );
RobertFischer 28:fe9a2e0ce659 298 break;
RobertFischer 28:fe9a2e0ce659 299 case RGB24:
RobertFischer 28:fe9a2e0ce659 300 r = ( color >> 16 ) & 0xFC;
RobertFischer 28:fe9a2e0ce659 301 g = ( color >> 8 ) & 0xFC;
RobertFischer 28:fe9a2e0ce659 302 b = color & 0xFC;
RobertFischer 28:fe9a2e0ce659 303 WriteData( ( r << 8 ) | g );
RobertFischer 28:fe9a2e0ce659 304 WriteData( b );
RobertFischer 28:fe9a2e0ce659 305 break;
RobertFischer 28:fe9a2e0ce659 306 }
RobertFischer 28:fe9a2e0ce659 307 }
RobertFischer 28:fe9a2e0ce659 308 }