Fork of TFTLCD with new support for SSD1963 ad HX8352-A controller.
Fork of TFTLCD by
ssd1963.cpp@28:fe9a2e0ce659, 2014-05-30 (annotated)
- 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?
User | Revision | Line number | New 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 | } |