NXP Rapid IoT prototyping kit verified port of the LCD library.
ColorMemLCD.cpp@2:6dc3f280499f, 2019-12-26 (annotated)
- Committer:
- batman52
- Date:
- Thu Dec 26 16:43:11 2019 +0000
- Revision:
- 2:6dc3f280499f
- Parent:
- 1:b035a997ec3f
increased LCD_DISP_HEIGHT_MAX_BUF to 176 instead of 44, to handle a full frame buffer.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
KURETA90 | 0:76a4e97c113f | 1 | /* |
KURETA90 | 0:76a4e97c113f | 2 | * mbed library for the JDI color memory LCD LPM013M126A |
KURETA90 | 0:76a4e97c113f | 3 | * derived from C12832_lcd |
KURETA90 | 0:76a4e97c113f | 4 | * Copyright (c) 2016 Tadayuki Okamoto |
KURETA90 | 0:76a4e97c113f | 5 | * Released under the MIT License: http://mbed.org/license/mit |
KURETA90 | 0:76a4e97c113f | 6 | * |
KURETA90 | 0:76a4e97c113f | 7 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
KURETA90 | 0:76a4e97c113f | 8 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
KURETA90 | 0:76a4e97c113f | 9 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
KURETA90 | 0:76a4e97c113f | 10 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
KURETA90 | 0:76a4e97c113f | 11 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
KURETA90 | 0:76a4e97c113f | 12 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
KURETA90 | 0:76a4e97c113f | 13 | * THE SOFTWARE. |
KURETA90 | 0:76a4e97c113f | 14 | */ |
KURETA90 | 0:76a4e97c113f | 15 | |
KURETA90 | 0:76a4e97c113f | 16 | |
KURETA90 | 0:76a4e97c113f | 17 | #include "ColorMemLCD.h" |
KURETA90 | 0:76a4e97c113f | 18 | #include "mbed.h" |
KURETA90 | 0:76a4e97c113f | 19 | |
KURETA90 | 0:76a4e97c113f | 20 | /** @def |
KURETA90 | 0:76a4e97c113f | 21 | * LCD_Color SPI commands |
KURETA90 | 0:76a4e97c113f | 22 | */ |
KURETA90 | 0:76a4e97c113f | 23 | #define LCD_COLOR_CMD_UPDATE (0x90) //!< Update Mode (4bit Data Mode) |
KURETA90 | 0:76a4e97c113f | 24 | #define LCD_COLOR_CMD_ALL_CLEAR (0x20) //!< All Clear Mode |
KURETA90 | 0:76a4e97c113f | 25 | #define LCD_COLOR_CMD_NO_UPDATE (0x00) //!< No Update Mode |
KURETA90 | 0:76a4e97c113f | 26 | #define LCD_COLOR_CMD_BLINKING_WHITE (0x18) //!< Display Blinking Color Mode (White) |
KURETA90 | 0:76a4e97c113f | 27 | #define LCD_COLOR_CMD_BLINKING_BLACK (0x10) //!< Display Blinking Color Mode (Black) |
KURETA90 | 0:76a4e97c113f | 28 | #define LCD_COLOR_CMD_INVERSION (0x14) //!< Display Inversion Mode |
KURETA90 | 0:76a4e97c113f | 29 | |
KURETA90 | 0:76a4e97c113f | 30 | /** Create a SPI_LCD object connected to SPI */ |
KURETA90 | 0:76a4e97c113f | 31 | ColorMemLCD::ColorMemLCD( PinName mosi, PinName miso, PinName sclk, PinName cs, PinName disp, PinName power, const char *name ) |
KURETA90 | 0:76a4e97c113f | 32 | : GraphicsDisplay( name ), _spi( mosi, miso, sclk ), _cs( cs ), _disp( disp ), _power( power ) |
KURETA90 | 0:76a4e97c113f | 33 | { |
KURETA90 | 0:76a4e97c113f | 34 | /* initialize signal level */ |
KURETA90 | 0:76a4e97c113f | 35 | _power = 0; |
KURETA90 | 0:76a4e97c113f | 36 | _disp = 0; |
KURETA90 | 0:76a4e97c113f | 37 | _cs = 0; |
KURETA90 | 0:76a4e97c113f | 38 | wait_us( 100 ); |
KURETA90 | 0:76a4e97c113f | 39 | |
KURETA90 | 0:76a4e97c113f | 40 | /* initialize lcd module */ |
KURETA90 | 0:76a4e97c113f | 41 | _power = 1; |
KURETA90 | 0:76a4e97c113f | 42 | _spi.format( 8,0 ); // 8bit mode3 |
KURETA90 | 0:76a4e97c113f | 43 | _spi.frequency( 2000000 ); // 2 Mhz SPI clock |
KURETA90 | 0:76a4e97c113f | 44 | _spi.write( 0x00 ); // dummy |
KURETA90 | 0:76a4e97c113f | 45 | polarity = 0; |
KURETA90 | 0:76a4e97c113f | 46 | blink_cmd = 0x00; |
KURETA90 | 0:76a4e97c113f | 47 | |
KURETA90 | 0:76a4e97c113f | 48 | /* initialize variables */ |
KURETA90 | 0:76a4e97c113f | 49 | char_x = 0; |
KURETA90 | 0:76a4e97c113f | 50 | char_y = 0; |
KURETA90 | 0:76a4e97c113f | 51 | trans_mode = LCD_TRANSMODE_OPAQUE; |
KURETA90 | 0:76a4e97c113f | 52 | window_x = 0; |
KURETA90 | 0:76a4e97c113f | 53 | window_y = 0; |
KURETA90 | 0:76a4e97c113f | 54 | window_w = LCD_DISP_WIDTH; |
KURETA90 | 0:76a4e97c113f | 55 | window_h = LCD_DISP_HEIGHT_MAX_BUF; |
KURETA90 | 0:76a4e97c113f | 56 | |
KURETA90 | 0:76a4e97c113f | 57 | /* set default color */ |
KURETA90 | 0:76a4e97c113f | 58 | foreground( LCD_COLOR_WHITE ); |
KURETA90 | 0:76a4e97c113f | 59 | background( LCD_COLOR_BLACK ); |
KURETA90 | 0:76a4e97c113f | 60 | |
KURETA90 | 0:76a4e97c113f | 61 | /* initialize temporary buffer */ |
KURETA90 | 0:76a4e97c113f | 62 | memset( &cmd_buf[0], 0, sizeof(cmd_buf) ); |
KURETA90 | 0:76a4e97c113f | 63 | memset( &disp_buf[0], (char)( (_background & 0x0F ) | ( (_background & 0x0F ) << 4 ) ), sizeof(disp_buf) ); |
KURETA90 | 0:76a4e97c113f | 64 | memset( &file_buf[0], 0, sizeof(file_buf) ); |
KURETA90 | 0:76a4e97c113f | 65 | |
KURETA90 | 0:76a4e97c113f | 66 | /* display turn ON */ |
KURETA90 | 0:76a4e97c113f | 67 | command_AllClear(); |
KURETA90 | 0:76a4e97c113f | 68 | _disp = 1; |
KURETA90 | 0:76a4e97c113f | 69 | } |
KURETA90 | 0:76a4e97c113f | 70 | |
KURETA90 | 0:76a4e97c113f | 71 | |
KURETA90 | 0:76a4e97c113f | 72 | /** Get the width of the screen in pixel */ |
KURETA90 | 0:76a4e97c113f | 73 | int ColorMemLCD::width() |
KURETA90 | 0:76a4e97c113f | 74 | { |
KURETA90 | 0:76a4e97c113f | 75 | return LCD_DISP_WIDTH; |
KURETA90 | 0:76a4e97c113f | 76 | } |
KURETA90 | 0:76a4e97c113f | 77 | |
KURETA90 | 0:76a4e97c113f | 78 | |
KURETA90 | 0:76a4e97c113f | 79 | /** Get the height of the screen in pixel */ |
KURETA90 | 0:76a4e97c113f | 80 | int ColorMemLCD::height() |
KURETA90 | 0:76a4e97c113f | 81 | { |
KURETA90 | 0:76a4e97c113f | 82 | return LCD_DISP_HEIGHT; |
KURETA90 | 0:76a4e97c113f | 83 | } |
KURETA90 | 0:76a4e97c113f | 84 | |
KURETA90 | 0:76a4e97c113f | 85 | |
KURETA90 | 0:76a4e97c113f | 86 | /** Set window region */ |
KURETA90 | 0:76a4e97c113f | 87 | void ColorMemLCD::window( int x, int y, int w, int h ) |
KURETA90 | 0:76a4e97c113f | 88 | { |
KURETA90 | 0:76a4e97c113f | 89 | #if ( LCD_DEVICE_HEIGHT != LCD_DISP_HEIGHT_MAX_BUF ) |
KURETA90 | 0:76a4e97c113f | 90 | if( ( ( x & 0x01 ) == 0x01 )|| |
KURETA90 | 0:76a4e97c113f | 91 | ( ( w & 0x01 ) == 0x01 ) ) { |
KURETA90 | 0:76a4e97c113f | 92 | /* Parameter Error */ |
KURETA90 | 0:76a4e97c113f | 93 | GraphicsDisplay::window( x, y, w, h ); |
KURETA90 | 0:76a4e97c113f | 94 | return; |
KURETA90 | 0:76a4e97c113f | 95 | } |
KURETA90 | 0:76a4e97c113f | 96 | |
KURETA90 | 0:76a4e97c113f | 97 | /* adjust region */ |
KURETA90 | 0:76a4e97c113f | 98 | if( x + w > LCD_DISP_WIDTH ) { |
KURETA90 | 0:76a4e97c113f | 99 | w = LCD_DISP_WIDTH - x; |
KURETA90 | 0:76a4e97c113f | 100 | } |
KURETA90 | 0:76a4e97c113f | 101 | |
KURETA90 | 0:76a4e97c113f | 102 | if( h > ( ( LCD_DISP_WIDTH / 2 ) * LCD_DISP_HEIGHT_MAX_BUF ) / ( w / 2 ) ) { |
KURETA90 | 0:76a4e97c113f | 103 | h = ( ( LCD_DISP_WIDTH / 2 ) * LCD_DISP_HEIGHT_MAX_BUF ) / ( w / 2 ); |
KURETA90 | 0:76a4e97c113f | 104 | } |
KURETA90 | 0:76a4e97c113f | 105 | |
KURETA90 | 0:76a4e97c113f | 106 | if( ( window_x == x )&& |
KURETA90 | 0:76a4e97c113f | 107 | ( window_y == y )&& |
KURETA90 | 0:76a4e97c113f | 108 | ( window_w == w )&& |
KURETA90 | 0:76a4e97c113f | 109 | ( window_h == h ) ) { |
KURETA90 | 0:76a4e97c113f | 110 | /* Same Area */ |
KURETA90 | 0:76a4e97c113f | 111 | return; |
KURETA90 | 0:76a4e97c113f | 112 | } |
KURETA90 | 0:76a4e97c113f | 113 | |
KURETA90 | 0:76a4e97c113f | 114 | window_x = x; |
KURETA90 | 0:76a4e97c113f | 115 | window_y = y; |
KURETA90 | 0:76a4e97c113f | 116 | window_w = w; |
KURETA90 | 0:76a4e97c113f | 117 | window_h = h; |
KURETA90 | 0:76a4e97c113f | 118 | |
KURETA90 | 0:76a4e97c113f | 119 | /* Initialize Buffer */ |
KURETA90 | 0:76a4e97c113f | 120 | memset( &disp_buf[0], (char)( (_background & 0x0F ) | ( (_background & 0x0F ) << 4 ) ), sizeof(disp_buf) ); |
KURETA90 | 0:76a4e97c113f | 121 | |
KURETA90 | 0:76a4e97c113f | 122 | #endif /* ( LCD_DEVICE_HEIGHT != LCD_DISP_HEIGHT_MAX_BUF ) */ |
KURETA90 | 0:76a4e97c113f | 123 | |
KURETA90 | 0:76a4e97c113f | 124 | GraphicsDisplay::window( x, y, w, h ); |
KURETA90 | 0:76a4e97c113f | 125 | } |
KURETA90 | 0:76a4e97c113f | 126 | |
KURETA90 | 0:76a4e97c113f | 127 | |
KURETA90 | 0:76a4e97c113f | 128 | /** Set a pixel on the window memory */ |
KURETA90 | 0:76a4e97c113f | 129 | void ColorMemLCD::pixel( int x, int y, int color ) |
KURETA90 | 0:76a4e97c113f | 130 | { |
KURETA90 | 0:76a4e97c113f | 131 | if( ( window_x > x )|| |
KURETA90 | 0:76a4e97c113f | 132 | ( ( window_x + window_w ) <= x )|| |
KURETA90 | 0:76a4e97c113f | 133 | ( window_y > y )|| |
KURETA90 | 0:76a4e97c113f | 134 | ( ( window_y + window_h ) <= y ) ) { |
KURETA90 | 0:76a4e97c113f | 135 | /* out of display buffer */ |
KURETA90 | 0:76a4e97c113f | 136 | return; |
KURETA90 | 0:76a4e97c113f | 137 | } |
KURETA90 | 0:76a4e97c113f | 138 | |
KURETA90 | 0:76a4e97c113f | 139 | if( ( x % 2 ) == 0 ) { |
KURETA90 | 0:76a4e97c113f | 140 | disp_buf[ ( (window_w / 2) * ( y - window_y ) ) + ( ( x - window_x ) / 2 ) ] &= 0x0F; |
KURETA90 | 0:76a4e97c113f | 141 | disp_buf[ ( (window_w / 2) * ( y - window_y ) ) + ( ( x - window_x ) / 2 ) ] |= ( ( color & 0x0F ) << 4 ); |
KURETA90 | 0:76a4e97c113f | 142 | } |
KURETA90 | 0:76a4e97c113f | 143 | else { |
KURETA90 | 0:76a4e97c113f | 144 | disp_buf[ ( (window_w / 2) * ( y - window_y ) ) + ( ( x - window_x ) / 2 ) ] &= 0xF0; |
KURETA90 | 0:76a4e97c113f | 145 | disp_buf[ ( (window_w / 2) * ( y - window_y ) ) + ( ( x - window_x ) / 2 ) ] |= ( ( color & 0x0F ) ); |
KURETA90 | 0:76a4e97c113f | 146 | } |
KURETA90 | 0:76a4e97c113f | 147 | } |
KURETA90 | 0:76a4e97c113f | 148 | |
KURETA90 | 0:76a4e97c113f | 149 | |
KURETA90 | 0:76a4e97c113f | 150 | /** Set a pixel - for transrucent mode */ |
KURETA90 | 0:76a4e97c113f | 151 | void ColorMemLCD::pixel_alpha( int x, int y, int color ) |
KURETA90 | 0:76a4e97c113f | 152 | { |
KURETA90 | 0:76a4e97c113f | 153 | if( ( window_x > x )|| |
KURETA90 | 0:76a4e97c113f | 154 | ( ( window_x + window_w ) <= x )|| |
KURETA90 | 0:76a4e97c113f | 155 | ( window_y > y )|| |
KURETA90 | 0:76a4e97c113f | 156 | ( ( window_y + window_h ) <= y ) ) { |
KURETA90 | 0:76a4e97c113f | 157 | /* out of display buffer */ |
KURETA90 | 0:76a4e97c113f | 158 | return; |
KURETA90 | 0:76a4e97c113f | 159 | } |
KURETA90 | 0:76a4e97c113f | 160 | |
KURETA90 | 0:76a4e97c113f | 161 | if( ( x % 2 ) == 0 ) { |
KURETA90 | 0:76a4e97c113f | 162 | disp_buf[ ( (window_w / 2) * ( y - window_y ) ) + ( ( x - window_x ) / 2 ) ] &= ( ( ( color & 0x0F ) << 4 ) | 0x0F ); |
KURETA90 | 0:76a4e97c113f | 163 | } |
KURETA90 | 0:76a4e97c113f | 164 | else { |
KURETA90 | 0:76a4e97c113f | 165 | disp_buf[ ( (window_w / 2) * ( y - window_y ) ) + ( ( x - window_x ) / 2 ) ] &= ( ( ( color & 0x0F ) ) | 0xF0 ); |
KURETA90 | 0:76a4e97c113f | 166 | } |
KURETA90 | 0:76a4e97c113f | 167 | } |
KURETA90 | 0:76a4e97c113f | 168 | |
KURETA90 | 0:76a4e97c113f | 169 | |
KURETA90 | 0:76a4e97c113f | 170 | /** Fill the window memory with background color */ |
KURETA90 | 0:76a4e97c113f | 171 | void ColorMemLCD::cls( void ) |
KURETA90 | 0:76a4e97c113f | 172 | { |
KURETA90 | 0:76a4e97c113f | 173 | memset( &disp_buf[0], (char)( (_background & 0x0F ) | ( (_background & 0x0F ) << 4 ) ), sizeof(disp_buf) ); |
KURETA90 | 0:76a4e97c113f | 174 | } |
KURETA90 | 0:76a4e97c113f | 175 | |
KURETA90 | 0:76a4e97c113f | 176 | |
KURETA90 | 0:76a4e97c113f | 177 | /** draw a circle */ |
KURETA90 | 0:76a4e97c113f | 178 | void ColorMemLCD::circle( int x0, int y0, int r, int color ) |
KURETA90 | 0:76a4e97c113f | 179 | { |
KURETA90 | 0:76a4e97c113f | 180 | int x = -r; |
KURETA90 | 0:76a4e97c113f | 181 | int y = 0; |
KURETA90 | 0:76a4e97c113f | 182 | int err = 2 - (2*r); |
KURETA90 | 0:76a4e97c113f | 183 | int e2 = err; |
KURETA90 | 0:76a4e97c113f | 184 | |
KURETA90 | 0:76a4e97c113f | 185 | do { |
KURETA90 | 0:76a4e97c113f | 186 | pixel( x0-x, y0+y, color ); |
KURETA90 | 0:76a4e97c113f | 187 | pixel( x0+x, y0+y, color ); |
KURETA90 | 0:76a4e97c113f | 188 | pixel( x0+x, y0-y, color ); |
KURETA90 | 0:76a4e97c113f | 189 | pixel( x0-x, y0-y, color ); |
KURETA90 | 0:76a4e97c113f | 190 | e2 = err; |
KURETA90 | 0:76a4e97c113f | 191 | if( e2 <= y ) { |
KURETA90 | 0:76a4e97c113f | 192 | err += ( ( ++y ) * 2 ) + 1; |
KURETA90 | 0:76a4e97c113f | 193 | if( ( -x == y )&&( e2 <= x ) ) { |
KURETA90 | 0:76a4e97c113f | 194 | e2 = 0; |
KURETA90 | 0:76a4e97c113f | 195 | } |
KURETA90 | 0:76a4e97c113f | 196 | } |
KURETA90 | 0:76a4e97c113f | 197 | if( e2 > x ) { |
KURETA90 | 0:76a4e97c113f | 198 | err += ( ( ++x ) * 2 ) + 1; |
KURETA90 | 0:76a4e97c113f | 199 | } |
KURETA90 | 0:76a4e97c113f | 200 | } while (x <= 0); |
KURETA90 | 0:76a4e97c113f | 201 | } |
KURETA90 | 0:76a4e97c113f | 202 | |
KURETA90 | 0:76a4e97c113f | 203 | |
KURETA90 | 0:76a4e97c113f | 204 | /** draw a filled circle */ |
KURETA90 | 0:76a4e97c113f | 205 | void ColorMemLCD::fillcircle( int x0, int y0, int r, int color ) |
KURETA90 | 0:76a4e97c113f | 206 | { |
KURETA90 | 0:76a4e97c113f | 207 | int x = -r; |
KURETA90 | 0:76a4e97c113f | 208 | int y = 0; |
KURETA90 | 0:76a4e97c113f | 209 | int err = 2 - (2*r); |
KURETA90 | 0:76a4e97c113f | 210 | int e2 = err; |
KURETA90 | 0:76a4e97c113f | 211 | |
KURETA90 | 0:76a4e97c113f | 212 | do { |
KURETA90 | 0:76a4e97c113f | 213 | vline( x0-x, y0-y, y0+y, color ); |
KURETA90 | 0:76a4e97c113f | 214 | vline( x0+x, y0-y, y0+y, color ); |
KURETA90 | 0:76a4e97c113f | 215 | e2 = err; |
KURETA90 | 0:76a4e97c113f | 216 | if( e2 <= y ) { |
KURETA90 | 0:76a4e97c113f | 217 | err += ( ( ++y ) * 2 ) + 1; |
KURETA90 | 0:76a4e97c113f | 218 | if( ( -x == y )&&( e2 <= x ) ) { |
KURETA90 | 0:76a4e97c113f | 219 | e2 = 0; |
KURETA90 | 0:76a4e97c113f | 220 | } |
KURETA90 | 0:76a4e97c113f | 221 | } |
KURETA90 | 0:76a4e97c113f | 222 | if( e2 > x ) { |
KURETA90 | 0:76a4e97c113f | 223 | err += ( ( ++x ) * 2 ) + 1; |
KURETA90 | 0:76a4e97c113f | 224 | } |
KURETA90 | 0:76a4e97c113f | 225 | } while (x <= 0); |
KURETA90 | 0:76a4e97c113f | 226 | } |
KURETA90 | 0:76a4e97c113f | 227 | |
KURETA90 | 0:76a4e97c113f | 228 | |
KURETA90 | 0:76a4e97c113f | 229 | /** draw a horizontal line */ |
KURETA90 | 0:76a4e97c113f | 230 | void ColorMemLCD::hline( int x0, int x1, int y, int color ) |
KURETA90 | 0:76a4e97c113f | 231 | { |
KURETA90 | 0:76a4e97c113f | 232 | int x; |
KURETA90 | 0:76a4e97c113f | 233 | int direction; |
KURETA90 | 0:76a4e97c113f | 234 | |
KURETA90 | 0:76a4e97c113f | 235 | if( x0 == x1 ) { |
KURETA90 | 0:76a4e97c113f | 236 | pixel( x0, y, color ); |
KURETA90 | 0:76a4e97c113f | 237 | return; |
KURETA90 | 0:76a4e97c113f | 238 | } |
KURETA90 | 0:76a4e97c113f | 239 | else if( x0 > x1 ) { |
KURETA90 | 0:76a4e97c113f | 240 | direction = -1; |
KURETA90 | 0:76a4e97c113f | 241 | } |
KURETA90 | 0:76a4e97c113f | 242 | else { |
KURETA90 | 0:76a4e97c113f | 243 | direction = 1; |
KURETA90 | 0:76a4e97c113f | 244 | } |
KURETA90 | 0:76a4e97c113f | 245 | |
KURETA90 | 0:76a4e97c113f | 246 | for( x = x0 ; x <= x1 ; x += direction ) { |
KURETA90 | 0:76a4e97c113f | 247 | pixel( x, y, color ); |
KURETA90 | 0:76a4e97c113f | 248 | } |
KURETA90 | 0:76a4e97c113f | 249 | } |
KURETA90 | 0:76a4e97c113f | 250 | |
KURETA90 | 0:76a4e97c113f | 251 | |
KURETA90 | 0:76a4e97c113f | 252 | /** draw a vertical line */ |
KURETA90 | 0:76a4e97c113f | 253 | void ColorMemLCD::vline( int x, int y0, int y1, int color ) |
KURETA90 | 0:76a4e97c113f | 254 | { |
KURETA90 | 0:76a4e97c113f | 255 | int y; |
KURETA90 | 0:76a4e97c113f | 256 | int direction; |
KURETA90 | 0:76a4e97c113f | 257 | |
KURETA90 | 0:76a4e97c113f | 258 | if( y0 == y1 ) { |
KURETA90 | 0:76a4e97c113f | 259 | pixel( x, y0, color ); |
KURETA90 | 0:76a4e97c113f | 260 | return; |
KURETA90 | 0:76a4e97c113f | 261 | } |
KURETA90 | 0:76a4e97c113f | 262 | else if( y0 > y1 ) { |
KURETA90 | 0:76a4e97c113f | 263 | direction = -1; |
KURETA90 | 0:76a4e97c113f | 264 | } |
KURETA90 | 0:76a4e97c113f | 265 | else { |
KURETA90 | 0:76a4e97c113f | 266 | direction = 1; |
KURETA90 | 0:76a4e97c113f | 267 | } |
KURETA90 | 0:76a4e97c113f | 268 | |
KURETA90 | 0:76a4e97c113f | 269 | for( y = y0 ; y <= y1 ; y += direction ) { |
KURETA90 | 0:76a4e97c113f | 270 | pixel( x, y, color ); |
KURETA90 | 0:76a4e97c113f | 271 | } |
KURETA90 | 0:76a4e97c113f | 272 | } |
KURETA90 | 0:76a4e97c113f | 273 | |
KURETA90 | 0:76a4e97c113f | 274 | |
KURETA90 | 0:76a4e97c113f | 275 | /** draw a 1 pixel line */ |
KURETA90 | 0:76a4e97c113f | 276 | void ColorMemLCD::line( int x0, int y0, int x1, int y1, int color ) |
KURETA90 | 0:76a4e97c113f | 277 | { |
KURETA90 | 0:76a4e97c113f | 278 | int dx = 0; |
KURETA90 | 0:76a4e97c113f | 279 | int dy = 0; |
KURETA90 | 0:76a4e97c113f | 280 | int dx_sym = 0; |
KURETA90 | 0:76a4e97c113f | 281 | int dy_sym = 0; |
KURETA90 | 0:76a4e97c113f | 282 | int dx_x2 = 0; |
KURETA90 | 0:76a4e97c113f | 283 | int dy_x2 = 0; |
KURETA90 | 0:76a4e97c113f | 284 | int di = 0; |
KURETA90 | 0:76a4e97c113f | 285 | |
KURETA90 | 0:76a4e97c113f | 286 | dx = x1 - x0; |
KURETA90 | 0:76a4e97c113f | 287 | dy = y1 - y0; |
KURETA90 | 0:76a4e97c113f | 288 | |
KURETA90 | 0:76a4e97c113f | 289 | if( dx == 0 ) { /* vertical line */ |
KURETA90 | 0:76a4e97c113f | 290 | vline( x0, y0, y1, color ); |
KURETA90 | 0:76a4e97c113f | 291 | return; |
KURETA90 | 0:76a4e97c113f | 292 | } |
KURETA90 | 0:76a4e97c113f | 293 | else if( dx > 0 ) { |
KURETA90 | 0:76a4e97c113f | 294 | dx_sym = 1; |
KURETA90 | 0:76a4e97c113f | 295 | } |
KURETA90 | 0:76a4e97c113f | 296 | else { |
KURETA90 | 0:76a4e97c113f | 297 | dx_sym = -1; |
KURETA90 | 0:76a4e97c113f | 298 | } |
KURETA90 | 0:76a4e97c113f | 299 | |
KURETA90 | 0:76a4e97c113f | 300 | if( dy == 0 ) { /* horizontal line */ |
KURETA90 | 0:76a4e97c113f | 301 | hline( x0, x1, y0, color ); |
KURETA90 | 0:76a4e97c113f | 302 | return; |
KURETA90 | 0:76a4e97c113f | 303 | } |
KURETA90 | 0:76a4e97c113f | 304 | else if( dy > 0 ) { |
KURETA90 | 0:76a4e97c113f | 305 | dy_sym = 1; |
KURETA90 | 0:76a4e97c113f | 306 | } |
KURETA90 | 0:76a4e97c113f | 307 | else { |
KURETA90 | 0:76a4e97c113f | 308 | dy_sym = -1; |
KURETA90 | 0:76a4e97c113f | 309 | } |
KURETA90 | 0:76a4e97c113f | 310 | |
KURETA90 | 0:76a4e97c113f | 311 | dx = dx_sym * dx; |
KURETA90 | 0:76a4e97c113f | 312 | dy = dy_sym * dy; |
KURETA90 | 0:76a4e97c113f | 313 | |
KURETA90 | 0:76a4e97c113f | 314 | dx_x2 = dx * 2; |
KURETA90 | 0:76a4e97c113f | 315 | dy_x2 = dy * 2; |
KURETA90 | 0:76a4e97c113f | 316 | |
KURETA90 | 0:76a4e97c113f | 317 | if( dx >= dy ) { |
KURETA90 | 0:76a4e97c113f | 318 | di = dy_x2 - dx; |
KURETA90 | 0:76a4e97c113f | 319 | while ( x0 != x1 ) { |
KURETA90 | 0:76a4e97c113f | 320 | |
KURETA90 | 0:76a4e97c113f | 321 | pixel( x0, y0, color ); |
KURETA90 | 0:76a4e97c113f | 322 | x0 += dx_sym; |
KURETA90 | 0:76a4e97c113f | 323 | if( di < 0 ) { |
KURETA90 | 0:76a4e97c113f | 324 | di += dy_x2; |
KURETA90 | 0:76a4e97c113f | 325 | } |
KURETA90 | 0:76a4e97c113f | 326 | else { |
KURETA90 | 0:76a4e97c113f | 327 | di += dy_x2 - dx_x2; |
KURETA90 | 0:76a4e97c113f | 328 | y0 += dy_sym; |
KURETA90 | 0:76a4e97c113f | 329 | } |
KURETA90 | 0:76a4e97c113f | 330 | } |
KURETA90 | 0:76a4e97c113f | 331 | pixel( x0, y0, color ); |
KURETA90 | 0:76a4e97c113f | 332 | } |
KURETA90 | 0:76a4e97c113f | 333 | else { |
KURETA90 | 0:76a4e97c113f | 334 | di = dx_x2 - dy; |
KURETA90 | 0:76a4e97c113f | 335 | while( y0 != y1 ) { |
KURETA90 | 0:76a4e97c113f | 336 | pixel( x0, y0, color ); |
KURETA90 | 0:76a4e97c113f | 337 | y0 += dy_sym; |
KURETA90 | 0:76a4e97c113f | 338 | if( di < 0 ) { |
KURETA90 | 0:76a4e97c113f | 339 | di += dx_x2; |
KURETA90 | 0:76a4e97c113f | 340 | } |
KURETA90 | 0:76a4e97c113f | 341 | else { |
KURETA90 | 0:76a4e97c113f | 342 | di += dx_x2 - dy_x2; |
KURETA90 | 0:76a4e97c113f | 343 | x0 += dx_sym; |
KURETA90 | 0:76a4e97c113f | 344 | } |
KURETA90 | 0:76a4e97c113f | 345 | } |
KURETA90 | 0:76a4e97c113f | 346 | pixel( x0, y0, color ); |
KURETA90 | 0:76a4e97c113f | 347 | } |
KURETA90 | 0:76a4e97c113f | 348 | return; |
KURETA90 | 0:76a4e97c113f | 349 | } |
KURETA90 | 0:76a4e97c113f | 350 | |
KURETA90 | 0:76a4e97c113f | 351 | |
KURETA90 | 0:76a4e97c113f | 352 | /** draw a rect */ |
KURETA90 | 0:76a4e97c113f | 353 | void ColorMemLCD::rect( int x0, int y0, int x1, int y1, int color ) |
KURETA90 | 0:76a4e97c113f | 354 | { |
KURETA90 | 0:76a4e97c113f | 355 | hline( x0, x1, y0, color ); |
KURETA90 | 0:76a4e97c113f | 356 | |
KURETA90 | 0:76a4e97c113f | 357 | vline( x0, y0, y1, color ); |
KURETA90 | 0:76a4e97c113f | 358 | |
KURETA90 | 0:76a4e97c113f | 359 | hline( x0, x1, y1, color ); |
KURETA90 | 0:76a4e97c113f | 360 | |
KURETA90 | 0:76a4e97c113f | 361 | vline( x1, y0, y1, color ); |
KURETA90 | 0:76a4e97c113f | 362 | } |
KURETA90 | 0:76a4e97c113f | 363 | |
KURETA90 | 0:76a4e97c113f | 364 | |
KURETA90 | 0:76a4e97c113f | 365 | /** draw a filled rect */ |
KURETA90 | 0:76a4e97c113f | 366 | void ColorMemLCD::fillrect(int x0, int y0, int x1, int y1, int color) |
KURETA90 | 0:76a4e97c113f | 367 | { |
KURETA90 | 0:76a4e97c113f | 368 | int y; |
KURETA90 | 0:76a4e97c113f | 369 | int direction; |
KURETA90 | 0:76a4e97c113f | 370 | |
KURETA90 | 0:76a4e97c113f | 371 | if( y0 == y1 ) { |
KURETA90 | 0:76a4e97c113f | 372 | hline( x0, x1, y0, color ); |
KURETA90 | 0:76a4e97c113f | 373 | return; |
KURETA90 | 0:76a4e97c113f | 374 | } |
KURETA90 | 0:76a4e97c113f | 375 | else if( y0 > y1 ) { |
KURETA90 | 0:76a4e97c113f | 376 | direction = -1; |
KURETA90 | 0:76a4e97c113f | 377 | } |
KURETA90 | 0:76a4e97c113f | 378 | else { |
KURETA90 | 0:76a4e97c113f | 379 | direction = 1; |
KURETA90 | 0:76a4e97c113f | 380 | } |
KURETA90 | 0:76a4e97c113f | 381 | |
KURETA90 | 0:76a4e97c113f | 382 | for( y = y0 ; y <= y1 ; y += direction ) { |
KURETA90 | 0:76a4e97c113f | 383 | hline( x0, x1, y, color ); |
KURETA90 | 0:76a4e97c113f | 384 | } |
KURETA90 | 0:76a4e97c113f | 385 | } |
KURETA90 | 0:76a4e97c113f | 386 | |
KURETA90 | 0:76a4e97c113f | 387 | |
KURETA90 | 0:76a4e97c113f | 388 | /** setup cursor position */ |
KURETA90 | 0:76a4e97c113f | 389 | void ColorMemLCD::locate( int x, int y ) |
KURETA90 | 0:76a4e97c113f | 390 | { |
KURETA90 | 0:76a4e97c113f | 391 | char_x = x; |
KURETA90 | 0:76a4e97c113f | 392 | char_y = y; |
KURETA90 | 0:76a4e97c113f | 393 | } |
KURETA90 | 0:76a4e97c113f | 394 | |
KURETA90 | 0:76a4e97c113f | 395 | |
KURETA90 | 0:76a4e97c113f | 396 | /** calculate the max number of char in a line */ |
KURETA90 | 0:76a4e97c113f | 397 | int ColorMemLCD::columns() |
KURETA90 | 0:76a4e97c113f | 398 | { |
KURETA90 | 0:76a4e97c113f | 399 | return width() / font[1]; |
KURETA90 | 0:76a4e97c113f | 400 | } |
KURETA90 | 0:76a4e97c113f | 401 | |
KURETA90 | 0:76a4e97c113f | 402 | |
KURETA90 | 0:76a4e97c113f | 403 | /** calculate the max number of columns */ |
KURETA90 | 0:76a4e97c113f | 404 | int ColorMemLCD::rows() |
KURETA90 | 0:76a4e97c113f | 405 | { |
KURETA90 | 0:76a4e97c113f | 406 | return height() / font[2]; |
KURETA90 | 0:76a4e97c113f | 407 | } |
KURETA90 | 0:76a4e97c113f | 408 | |
KURETA90 | 0:76a4e97c113f | 409 | |
KURETA90 | 0:76a4e97c113f | 410 | /** put a char on the screen */ |
KURETA90 | 0:76a4e97c113f | 411 | int ColorMemLCD::_putc( int value ) |
KURETA90 | 0:76a4e97c113f | 412 | { |
KURETA90 | 0:76a4e97c113f | 413 | if( value == '\n' ) { // new line |
KURETA90 | 0:76a4e97c113f | 414 | char_x = 0; |
KURETA90 | 0:76a4e97c113f | 415 | char_y = char_y + font[2]; |
KURETA90 | 0:76a4e97c113f | 416 | if( char_y >= ( height() - font[2] ) ) { |
KURETA90 | 0:76a4e97c113f | 417 | char_y = 0; |
KURETA90 | 0:76a4e97c113f | 418 | } |
KURETA90 | 0:76a4e97c113f | 419 | } else { |
KURETA90 | 0:76a4e97c113f | 420 | character( char_x, char_y, value ); |
KURETA90 | 0:76a4e97c113f | 421 | } |
KURETA90 | 0:76a4e97c113f | 422 | return value; |
KURETA90 | 0:76a4e97c113f | 423 | } |
KURETA90 | 0:76a4e97c113f | 424 | |
KURETA90 | 0:76a4e97c113f | 425 | |
KURETA90 | 0:76a4e97c113f | 426 | /** draw a character of selected font */ |
KURETA90 | 0:76a4e97c113f | 427 | void ColorMemLCD::character( int x, int y, int c ) |
KURETA90 | 0:76a4e97c113f | 428 | { |
KURETA90 | 0:76a4e97c113f | 429 | int hor, vert, offset, bpl, j, i, b; |
KURETA90 | 0:76a4e97c113f | 430 | unsigned char* zeichen; |
KURETA90 | 0:76a4e97c113f | 431 | unsigned char z,w; |
KURETA90 | 0:76a4e97c113f | 432 | |
KURETA90 | 0:76a4e97c113f | 433 | if( (c < 31) || (c > 127) ) { |
KURETA90 | 0:76a4e97c113f | 434 | return; // test char range |
KURETA90 | 0:76a4e97c113f | 435 | } |
KURETA90 | 0:76a4e97c113f | 436 | |
KURETA90 | 0:76a4e97c113f | 437 | // read font parameter from start of array |
KURETA90 | 0:76a4e97c113f | 438 | offset = font[0]; // bytes / char |
KURETA90 | 0:76a4e97c113f | 439 | hor = font[1]; // get hor size of font |
KURETA90 | 0:76a4e97c113f | 440 | vert = font[2]; // get vert size of font |
KURETA90 | 0:76a4e97c113f | 441 | bpl = font[3]; // bytes per line |
KURETA90 | 0:76a4e97c113f | 442 | |
KURETA90 | 0:76a4e97c113f | 443 | if( char_x + hor > width() ) { |
KURETA90 | 0:76a4e97c113f | 444 | char_x = 0; |
KURETA90 | 0:76a4e97c113f | 445 | char_y = char_y + vert; |
KURETA90 | 0:76a4e97c113f | 446 | if( char_y >= height() - vert ) { |
KURETA90 | 0:76a4e97c113f | 447 | char_y = 0; |
KURETA90 | 0:76a4e97c113f | 448 | } |
KURETA90 | 0:76a4e97c113f | 449 | } |
KURETA90 | 0:76a4e97c113f | 450 | zeichen = &font[ ( ( c - 32 ) * offset ) + 4 ]; // start of char bitmap |
KURETA90 | 0:76a4e97c113f | 451 | w = zeichen[0]; // width of actual char |
KURETA90 | 0:76a4e97c113f | 452 | for( j = 0; j < vert ; j++ ) { // vert line |
KURETA90 | 0:76a4e97c113f | 453 | for( i = 0 ; i < hor ; i++ ) { // horz line |
KURETA90 | 0:76a4e97c113f | 454 | z = zeichen[ bpl * i + ( ( j & 0xF8 ) >> 3 ) + 1 ]; |
KURETA90 | 0:76a4e97c113f | 455 | b = 1 << ( j & 0x07 ); |
KURETA90 | 0:76a4e97c113f | 456 | if( ( z & b ) == 0x00 ) { |
KURETA90 | 0:76a4e97c113f | 457 | if( trans_mode == LCD_TRANSMODE_OPAQUE ) { |
KURETA90 | 0:76a4e97c113f | 458 | pixel( x + i, y + j, _background ); |
KURETA90 | 0:76a4e97c113f | 459 | } |
KURETA90 | 0:76a4e97c113f | 460 | else if( trans_mode == LCD_TRANSMODE_TRANSLUCENT ) { |
KURETA90 | 0:76a4e97c113f | 461 | pixel_alpha( x + i, y + j, _background ); |
KURETA90 | 0:76a4e97c113f | 462 | } |
KURETA90 | 0:76a4e97c113f | 463 | } else { |
KURETA90 | 0:76a4e97c113f | 464 | pixel( x + i, y + j, _foreground ); |
KURETA90 | 0:76a4e97c113f | 465 | } |
KURETA90 | 0:76a4e97c113f | 466 | } |
KURETA90 | 0:76a4e97c113f | 467 | } |
KURETA90 | 0:76a4e97c113f | 468 | if( ( w + 2 ) < hor ) { // x offset to next char |
KURETA90 | 0:76a4e97c113f | 469 | char_x += w + 2; |
KURETA90 | 0:76a4e97c113f | 470 | } |
KURETA90 | 0:76a4e97c113f | 471 | else { |
KURETA90 | 0:76a4e97c113f | 472 | char_x += hor; |
KURETA90 | 0:76a4e97c113f | 473 | } |
KURETA90 | 0:76a4e97c113f | 474 | } |
KURETA90 | 0:76a4e97c113f | 475 | |
KURETA90 | 0:76a4e97c113f | 476 | /** draw a symbol of same format as "character" */ |
KURETA90 | 0:76a4e97c113f | 477 | void ColorMemLCD::symbol(unsigned int x, unsigned int y, unsigned char *symbol) |
KURETA90 | 0:76a4e97c113f | 478 | { |
KURETA90 | 0:76a4e97c113f | 479 | unsigned int hor,vert,bpl,j,i,b; |
KURETA90 | 0:76a4e97c113f | 480 | unsigned char z; |
KURETA90 | 0:76a4e97c113f | 481 | |
KURETA90 | 0:76a4e97c113f | 482 | hor = symbol[0]; // get hor size of font |
KURETA90 | 0:76a4e97c113f | 483 | vert = symbol[1]; // get vert size of font |
KURETA90 | 0:76a4e97c113f | 484 | bpl = symbol[2]; // bytes per line |
KURETA90 | 0:76a4e97c113f | 485 | |
KURETA90 | 0:76a4e97c113f | 486 | if( char_x + hor > width() ) { |
KURETA90 | 0:76a4e97c113f | 487 | char_x = 0; |
KURETA90 | 0:76a4e97c113f | 488 | char_y = char_y + vert; |
KURETA90 | 0:76a4e97c113f | 489 | if( char_y >= height() - vert ) { |
KURETA90 | 0:76a4e97c113f | 490 | char_y = 0; |
KURETA90 | 0:76a4e97c113f | 491 | } |
KURETA90 | 0:76a4e97c113f | 492 | } |
KURETA90 | 0:76a4e97c113f | 493 | |
KURETA90 | 0:76a4e97c113f | 494 | for( j = 0; j < vert ; j++ ) { // vert line |
KURETA90 | 0:76a4e97c113f | 495 | for( i = 0 ; i < hor ; i++ ) { // horz line |
KURETA90 | 0:76a4e97c113f | 496 | z = symbol[ bpl * i + ( ( j & 0xF8 ) >> 3 ) + 1 + 3 ]; |
KURETA90 | 0:76a4e97c113f | 497 | b = 1 << ( j & 0x07 ); |
KURETA90 | 0:76a4e97c113f | 498 | if( ( z & b ) == 0x00 ) { |
KURETA90 | 0:76a4e97c113f | 499 | if( trans_mode == LCD_TRANSMODE_OPAQUE ) { |
KURETA90 | 0:76a4e97c113f | 500 | pixel( x + i, y + j, _background ); |
KURETA90 | 0:76a4e97c113f | 501 | } |
KURETA90 | 0:76a4e97c113f | 502 | else if( trans_mode == LCD_TRANSMODE_TRANSLUCENT ) { |
KURETA90 | 0:76a4e97c113f | 503 | pixel_alpha( x + i, y + j, _background ); |
KURETA90 | 0:76a4e97c113f | 504 | } |
KURETA90 | 0:76a4e97c113f | 505 | } else { |
KURETA90 | 0:76a4e97c113f | 506 | pixel( x + i, y + j, _foreground ); |
KURETA90 | 0:76a4e97c113f | 507 | } |
KURETA90 | 0:76a4e97c113f | 508 | } |
KURETA90 | 0:76a4e97c113f | 509 | } |
KURETA90 | 0:76a4e97c113f | 510 | } |
KURETA90 | 0:76a4e97c113f | 511 | |
KURETA90 | 0:76a4e97c113f | 512 | |
KURETA90 | 0:76a4e97c113f | 513 | /** select the font */ |
KURETA90 | 0:76a4e97c113f | 514 | void ColorMemLCD::set_font( unsigned char* f ) |
KURETA90 | 0:76a4e97c113f | 515 | { |
KURETA90 | 0:76a4e97c113f | 516 | font = f; |
KURETA90 | 0:76a4e97c113f | 517 | } |
KURETA90 | 0:76a4e97c113f | 518 | |
KURETA90 | 0:76a4e97c113f | 519 | |
KURETA90 | 0:76a4e97c113f | 520 | /** set transpalent effect */ |
KURETA90 | 0:76a4e97c113f | 521 | void ColorMemLCD::setTransMode( char mode ) |
KURETA90 | 0:76a4e97c113f | 522 | { |
KURETA90 | 0:76a4e97c113f | 523 | trans_mode = mode; |
KURETA90 | 0:76a4e97c113f | 524 | } |
KURETA90 | 0:76a4e97c113f | 525 | |
KURETA90 | 0:76a4e97c113f | 526 | |
KURETA90 | 0:76a4e97c113f | 527 | /** set a bitmap on the window buffer */ |
KURETA90 | 0:76a4e97c113f | 528 | void ColorMemLCD::Bitmap4bit( int x, int y, int w, int h, unsigned char *bitmap ) |
KURETA90 | 0:76a4e97c113f | 529 | { |
KURETA90 | 0:76a4e97c113f | 530 | Bitmap4bit( x, y, w, h, bitmap, 0, 0, w, h ); |
KURETA90 | 0:76a4e97c113f | 531 | } |
KURETA90 | 0:76a4e97c113f | 532 | |
KURETA90 | 0:76a4e97c113f | 533 | |
KURETA90 | 0:76a4e97c113f | 534 | /** set a bitmap on the window buffer */ |
KURETA90 | 0:76a4e97c113f | 535 | void ColorMemLCD::Bitmap4bit( int x, int y, int w, int h, unsigned char *bitmap, int bmp_x, int bmp_y, int bmp_w, int bmp_h ) |
KURETA90 | 0:76a4e97c113f | 536 | { |
KURETA90 | 0:76a4e97c113f | 537 | int i, j; |
KURETA90 | 0:76a4e97c113f | 538 | |
KURETA90 | 0:76a4e97c113f | 539 | if( ( x < 0 )|| |
KURETA90 | 0:76a4e97c113f | 540 | ( y < 0 )|| |
KURETA90 | 0:76a4e97c113f | 541 | ( w <= 0 )|| |
KURETA90 | 0:76a4e97c113f | 542 | ( h <= 0 )|| |
KURETA90 | 0:76a4e97c113f | 543 | ( bitmap == NULL )|| |
KURETA90 | 0:76a4e97c113f | 544 | ( bmp_x < 0 )|| |
KURETA90 | 0:76a4e97c113f | 545 | ( bmp_y < 0 )|| |
KURETA90 | 0:76a4e97c113f | 546 | ( bmp_w <= 0 )|| |
KURETA90 | 0:76a4e97c113f | 547 | ( bmp_h <= 0 )|| |
KURETA90 | 0:76a4e97c113f | 548 | ( ( x & 0x01 ) == 0x01 )|| |
KURETA90 | 0:76a4e97c113f | 549 | ( ( w & 0x01 ) == 0x01 )|| |
KURETA90 | 0:76a4e97c113f | 550 | ( ( bmp_x & 0x01 ) == 0x01 )|| |
KURETA90 | 0:76a4e97c113f | 551 | ( ( bmp_w & 0x01 ) == 0x01 ) ) { |
KURETA90 | 0:76a4e97c113f | 552 | /* Parameter Error */ |
KURETA90 | 0:76a4e97c113f | 553 | return; |
KURETA90 | 0:76a4e97c113f | 554 | } |
KURETA90 | 0:76a4e97c113f | 555 | |
KURETA90 | 0:76a4e97c113f | 556 | for( i = 0 ; i < h ; i++ ) { |
KURETA90 | 0:76a4e97c113f | 557 | if( ( window_y > i + y )|| |
KURETA90 | 0:76a4e97c113f | 558 | ( ( window_y + window_h ) <= i + y )|| |
KURETA90 | 0:76a4e97c113f | 559 | ( ( bmp_h ) <= i + bmp_y ) ) { |
KURETA90 | 0:76a4e97c113f | 560 | /* out of display buffer */ |
KURETA90 | 0:76a4e97c113f | 561 | continue; |
KURETA90 | 0:76a4e97c113f | 562 | } |
KURETA90 | 0:76a4e97c113f | 563 | for( j = 0 ; j < w ; j += 2 ) { |
KURETA90 | 0:76a4e97c113f | 564 | if( ( window_x > j + x )|| |
KURETA90 | 0:76a4e97c113f | 565 | ( ( window_x + window_w ) <= j + x )|| |
KURETA90 | 0:76a4e97c113f | 566 | ( ( bmp_w ) <= j + bmp_x ) ) { |
KURETA90 | 0:76a4e97c113f | 567 | /* out of display buffer */ |
KURETA90 | 0:76a4e97c113f | 568 | continue; |
KURETA90 | 0:76a4e97c113f | 569 | } |
KURETA90 | 0:76a4e97c113f | 570 | /* copy to display bufffer */ |
KURETA90 | 0:76a4e97c113f | 571 | disp_buf[ ( ( window_w / 2 ) * ( i + y - window_y ) ) + ( ( j + x - window_x ) / 2 ) ] = bitmap[ ( ( bmp_w / 2 ) * ( i + bmp_y ) ) + ( ( j + bmp_x ) / 2 ) ]; |
KURETA90 | 0:76a4e97c113f | 572 | } |
KURETA90 | 0:76a4e97c113f | 573 | } |
KURETA90 | 0:76a4e97c113f | 574 | } |
KURETA90 | 0:76a4e97c113f | 575 | |
KURETA90 | 0:76a4e97c113f | 576 | |
KURETA90 | 0:76a4e97c113f | 577 | /** set a bitmap on the window buffer */ |
KURETA90 | 0:76a4e97c113f | 578 | void ColorMemLCD::Bitmap1bit( int x, int y, int w, int h, unsigned char *bitmap ) |
KURETA90 | 0:76a4e97c113f | 579 | { |
KURETA90 | 0:76a4e97c113f | 580 | Bitmap1bit( x, y, w, h, bitmap, 0, 0, w, h ); |
KURETA90 | 0:76a4e97c113f | 581 | } |
KURETA90 | 0:76a4e97c113f | 582 | |
KURETA90 | 0:76a4e97c113f | 583 | |
KURETA90 | 0:76a4e97c113f | 584 | /** set a bitmap on the window buffer */ |
KURETA90 | 0:76a4e97c113f | 585 | void ColorMemLCD::Bitmap1bit( int x, int y, int w, int h, unsigned char *bitmap, int bmp_x, int bmp_y, int bmp_w, int bmp_h ) |
KURETA90 | 0:76a4e97c113f | 586 | { |
KURETA90 | 0:76a4e97c113f | 587 | int i, j; |
KURETA90 | 0:76a4e97c113f | 588 | int byte, offset; |
KURETA90 | 0:76a4e97c113f | 589 | |
KURETA90 | 0:76a4e97c113f | 590 | if( ( x < 0 )|| |
KURETA90 | 0:76a4e97c113f | 591 | ( y < 0 )|| |
KURETA90 | 0:76a4e97c113f | 592 | ( w <= 0 )|| |
KURETA90 | 0:76a4e97c113f | 593 | ( h <= 0 )|| |
KURETA90 | 0:76a4e97c113f | 594 | ( bitmap == NULL )|| |
KURETA90 | 0:76a4e97c113f | 595 | ( bmp_x < 0 )|| |
KURETA90 | 0:76a4e97c113f | 596 | ( bmp_y < 0 )|| |
KURETA90 | 0:76a4e97c113f | 597 | ( bmp_w <= 0 )|| |
KURETA90 | 0:76a4e97c113f | 598 | ( bmp_h <= 0 ) ) { |
KURETA90 | 0:76a4e97c113f | 599 | /* Parameter Error */ |
KURETA90 | 0:76a4e97c113f | 600 | return; |
KURETA90 | 0:76a4e97c113f | 601 | } |
KURETA90 | 0:76a4e97c113f | 602 | |
KURETA90 | 0:76a4e97c113f | 603 | for( i = 0 ; i < h ; i++ ) { |
KURETA90 | 0:76a4e97c113f | 604 | if( ( window_y > i + y )|| |
KURETA90 | 0:76a4e97c113f | 605 | ( ( window_y + window_h ) <= i + y )|| |
KURETA90 | 0:76a4e97c113f | 606 | ( ( bmp_h ) <= i + bmp_y ) ) { |
KURETA90 | 0:76a4e97c113f | 607 | /* out of display buffer */ |
KURETA90 | 0:76a4e97c113f | 608 | continue; |
KURETA90 | 0:76a4e97c113f | 609 | } |
KURETA90 | 0:76a4e97c113f | 610 | for( j = 0 ; j < w ; j ++ ) { |
KURETA90 | 0:76a4e97c113f | 611 | if( ( window_x > j + x )|| |
KURETA90 | 0:76a4e97c113f | 612 | ( ( window_x + window_w ) <= j + x )|| |
KURETA90 | 0:76a4e97c113f | 613 | ( ( bmp_w ) <= j + bmp_x ) ) { |
KURETA90 | 0:76a4e97c113f | 614 | /* out of display buffer */ |
KURETA90 | 0:76a4e97c113f | 615 | continue; |
KURETA90 | 0:76a4e97c113f | 616 | } |
KURETA90 | 0:76a4e97c113f | 617 | byte = ( ( bmp_w * ( i + bmp_y ) ) + ( ( j + bmp_x ) ) ) / 8; |
KURETA90 | 0:76a4e97c113f | 618 | offset = ( ( bmp_w * ( i + bmp_y ) ) + ( ( j + bmp_x ) ) ) % 8; |
KURETA90 | 0:76a4e97c113f | 619 | /* set to display bufffer */ |
KURETA90 | 0:76a4e97c113f | 620 | if( ( bitmap[ byte ] & ( 0x80 >> offset ) ) != 0x00 ) { |
KURETA90 | 0:76a4e97c113f | 621 | /* Foregroud */ |
KURETA90 | 0:76a4e97c113f | 622 | pixel( ( j + x - window_x ), ( i + y - window_y ), _foreground ); |
KURETA90 | 0:76a4e97c113f | 623 | } |
KURETA90 | 0:76a4e97c113f | 624 | else { |
KURETA90 | 0:76a4e97c113f | 625 | /* Backgroud */ |
KURETA90 | 0:76a4e97c113f | 626 | if( trans_mode == LCD_TRANSMODE_OPAQUE ) { |
KURETA90 | 0:76a4e97c113f | 627 | pixel( ( j + x - window_x ), ( i + y - window_y ), _background ); |
KURETA90 | 0:76a4e97c113f | 628 | } |
KURETA90 | 0:76a4e97c113f | 629 | else if( trans_mode == LCD_TRANSMODE_TRANSLUCENT ) { |
KURETA90 | 0:76a4e97c113f | 630 | pixel_alpha( ( j + x - window_x ), ( i + y - window_y ), _background ); |
KURETA90 | 0:76a4e97c113f | 631 | } |
KURETA90 | 0:76a4e97c113f | 632 | } |
KURETA90 | 0:76a4e97c113f | 633 | } |
KURETA90 | 0:76a4e97c113f | 634 | } |
KURETA90 | 0:76a4e97c113f | 635 | } |
KURETA90 | 0:76a4e97c113f | 636 | |
KURETA90 | 0:76a4e97c113f | 637 | |
KURETA90 | 0:76a4e97c113f | 638 | /** Transfer to the LCD from diaply buffer */ |
KURETA90 | 0:76a4e97c113f | 639 | void ColorMemLCD::update() |
KURETA90 | 0:76a4e97c113f | 640 | { |
KURETA90 | 0:76a4e97c113f | 641 | int32_t i; |
KURETA90 | 0:76a4e97c113f | 642 | int copy_width; |
KURETA90 | 0:76a4e97c113f | 643 | |
KURETA90 | 0:76a4e97c113f | 644 | if( window_x + window_w < LCD_DISP_WIDTH ) { |
KURETA90 | 0:76a4e97c113f | 645 | copy_width = (window_w / 2); |
KURETA90 | 0:76a4e97c113f | 646 | } |
KURETA90 | 0:76a4e97c113f | 647 | else { |
KURETA90 | 0:76a4e97c113f | 648 | copy_width = ( ( LCD_DISP_WIDTH - window_x ) / 2 ); |
KURETA90 | 0:76a4e97c113f | 649 | } |
KURETA90 | 0:76a4e97c113f | 650 | |
KURETA90 | 0:76a4e97c113f | 651 | for( i = 0 ; i < window_h ; i++ ) { |
KURETA90 | 0:76a4e97c113f | 652 | |
KURETA90 | 0:76a4e97c113f | 653 | if( window_y + i > LCD_DISP_HEIGHT ){ |
KURETA90 | 0:76a4e97c113f | 654 | /* out of window system */ |
KURETA90 | 0:76a4e97c113f | 655 | break; |
KURETA90 | 0:76a4e97c113f | 656 | } |
KURETA90 | 0:76a4e97c113f | 657 | |
KURETA90 | 0:76a4e97c113f | 658 | /* initialize command buffer */ |
KURETA90 | 0:76a4e97c113f | 659 | memset( &cmd_buf[0], (char)( (_background & 0x0F ) | ( (_background & 0x0F ) << 4 ) ), sizeof(cmd_buf) ); |
KURETA90 | 0:76a4e97c113f | 660 | |
KURETA90 | 0:76a4e97c113f | 661 | /* copy to command bufffer */ |
KURETA90 | 0:76a4e97c113f | 662 | memcpy( &cmd_buf[(window_x/2)], &disp_buf[ (window_w / 2) * i ], copy_width ); |
KURETA90 | 0:76a4e97c113f | 663 | |
KURETA90 | 0:76a4e97c113f | 664 | /* send cmaoond request */ |
KURETA90 | 0:76a4e97c113f | 665 | sendLineCommand( &cmd_buf[0], window_y + i ); |
KURETA90 | 0:76a4e97c113f | 666 | } |
KURETA90 | 0:76a4e97c113f | 667 | } |
KURETA90 | 0:76a4e97c113f | 668 | |
KURETA90 | 0:76a4e97c113f | 669 | |
KURETA90 | 0:76a4e97c113f | 670 | /** Transfer a 24 bit BMP to the LCD from filesytem */ |
KURETA90 | 0:76a4e97c113f | 671 | int ColorMemLCD::BMP_24( int x, int y, const char *filenameBMP ) |
KURETA90 | 0:76a4e97c113f | 672 | { |
KURETA90 | 0:76a4e97c113f | 673 | FILE* fp; |
KURETA90 | 0:76a4e97c113f | 674 | int32_t width; |
KURETA90 | 0:76a4e97c113f | 675 | int32_t height; |
KURETA90 | 0:76a4e97c113f | 676 | int16_t data_bit_size; |
KURETA90 | 0:76a4e97c113f | 677 | bool data_direction = false; |
KURETA90 | 0:76a4e97c113f | 678 | // uint32_t filesize; |
KURETA90 | 0:76a4e97c113f | 679 | uint32_t data_offset; |
KURETA90 | 0:76a4e97c113f | 680 | int32_t i = 0; |
KURETA90 | 0:76a4e97c113f | 681 | int32_t j = 0; |
KURETA90 | 0:76a4e97c113f | 682 | int32_t line = 0; |
KURETA90 | 0:76a4e97c113f | 683 | |
KURETA90 | 0:76a4e97c113f | 684 | memset( &file_buf[0], 0, sizeof(file_buf) ); |
KURETA90 | 0:76a4e97c113f | 685 | |
KURETA90 | 0:76a4e97c113f | 686 | fp = fopen( filenameBMP, "rb" ); |
KURETA90 | 0:76a4e97c113f | 687 | if( fp != NULL ) { |
KURETA90 | 0:76a4e97c113f | 688 | /* read file header */ |
KURETA90 | 0:76a4e97c113f | 689 | fread( &file_buf[0], sizeof(char), 14, fp ); |
KURETA90 | 0:76a4e97c113f | 690 | |
KURETA90 | 0:76a4e97c113f | 691 | // filesize = file_buf[ 2] + ( file_buf[ 3] << 8 ) + ( file_buf[ 4] << 16 ) + ( file_buf[ 5] << 24 ); |
KURETA90 | 0:76a4e97c113f | 692 | data_offset = file_buf[10] + ( file_buf[11] << 8 ) + ( file_buf[12] << 16 ) + ( file_buf[13] << 24 ); |
KURETA90 | 0:76a4e97c113f | 693 | |
KURETA90 | 0:76a4e97c113f | 694 | if( data_offset <= 14 ) { |
KURETA90 | 0:76a4e97c113f | 695 | /* error */ |
KURETA90 | 0:76a4e97c113f | 696 | fclose(fp); |
KURETA90 | 0:76a4e97c113f | 697 | return(0); |
KURETA90 | 0:76a4e97c113f | 698 | } |
KURETA90 | 0:76a4e97c113f | 699 | |
KURETA90 | 0:76a4e97c113f | 700 | memset( &file_buf[0], 0, sizeof(file_buf) ); |
KURETA90 | 0:76a4e97c113f | 701 | |
KURETA90 | 0:76a4e97c113f | 702 | /* read file header */ |
KURETA90 | 0:76a4e97c113f | 703 | fread( &file_buf[0], sizeof(char), (data_offset - 14), fp ); |
KURETA90 | 0:76a4e97c113f | 704 | |
KURETA90 | 0:76a4e97c113f | 705 | if( data_offset == 0x0C ) { |
KURETA90 | 0:76a4e97c113f | 706 | /* OS/2 format */ |
KURETA90 | 0:76a4e97c113f | 707 | width = file_buf[ 4] + ( file_buf[ 5] << 8 ); |
KURETA90 | 0:76a4e97c113f | 708 | height = file_buf[ 6] + ( file_buf[ 7] << 8 ); |
KURETA90 | 0:76a4e97c113f | 709 | data_bit_size = file_buf[10] + ( file_buf[11] << 8 ); |
KURETA90 | 0:76a4e97c113f | 710 | } |
KURETA90 | 0:76a4e97c113f | 711 | else if( data_offset == 0x36 ){ |
KURETA90 | 0:76a4e97c113f | 712 | /* Windows format */ |
KURETA90 | 0:76a4e97c113f | 713 | width = file_buf[ 4] + ( file_buf[ 5] << 8 ) + ( file_buf[ 6] << 16 ) + ( file_buf[ 7] << 24 ); |
KURETA90 | 0:76a4e97c113f | 714 | height = file_buf[ 8] + ( file_buf[ 9] << 8 ) + ( file_buf[10] << 16 ) + ( file_buf[11] << 24 ); |
KURETA90 | 0:76a4e97c113f | 715 | data_bit_size = file_buf[14] + ( file_buf[15] << 8 ); |
KURETA90 | 0:76a4e97c113f | 716 | } |
KURETA90 | 0:76a4e97c113f | 717 | else{ |
KURETA90 | 0:76a4e97c113f | 718 | /* Unknown format */ |
KURETA90 | 0:76a4e97c113f | 719 | fclose(fp); |
KURETA90 | 0:76a4e97c113f | 720 | return(0); |
KURETA90 | 0:76a4e97c113f | 721 | } |
KURETA90 | 0:76a4e97c113f | 722 | |
KURETA90 | 0:76a4e97c113f | 723 | if( data_bit_size != 24 ) { |
KURETA90 | 0:76a4e97c113f | 724 | /* Not 24bit format */ |
KURETA90 | 0:76a4e97c113f | 725 | fclose(fp); |
KURETA90 | 0:76a4e97c113f | 726 | return(0); |
KURETA90 | 0:76a4e97c113f | 727 | } |
KURETA90 | 0:76a4e97c113f | 728 | |
KURETA90 | 0:76a4e97c113f | 729 | if( height < 0 ) { |
KURETA90 | 0:76a4e97c113f | 730 | height *= -1; |
KURETA90 | 0:76a4e97c113f | 731 | data_direction = true; |
KURETA90 | 0:76a4e97c113f | 732 | } |
KURETA90 | 0:76a4e97c113f | 733 | |
KURETA90 | 0:76a4e97c113f | 734 | if( data_direction == true ) { |
KURETA90 | 0:76a4e97c113f | 735 | line = i; |
KURETA90 | 0:76a4e97c113f | 736 | } |
KURETA90 | 0:76a4e97c113f | 737 | else { |
KURETA90 | 0:76a4e97c113f | 738 | line = height - i - 1; |
KURETA90 | 0:76a4e97c113f | 739 | } |
KURETA90 | 0:76a4e97c113f | 740 | |
KURETA90 | 0:76a4e97c113f | 741 | for( i = 0; i < height; i++ ) { |
KURETA90 | 0:76a4e97c113f | 742 | |
KURETA90 | 0:76a4e97c113f | 743 | if( data_direction == true ) { |
KURETA90 | 0:76a4e97c113f | 744 | line = i + y; |
KURETA90 | 0:76a4e97c113f | 745 | } |
KURETA90 | 0:76a4e97c113f | 746 | else { |
KURETA90 | 0:76a4e97c113f | 747 | line = height - i - 1 + y; |
KURETA90 | 0:76a4e97c113f | 748 | } |
KURETA90 | 0:76a4e97c113f | 749 | if( line >= LCD_DISP_HEIGHT ) { |
KURETA90 | 0:76a4e97c113f | 750 | /* out of window system */ |
KURETA90 | 0:76a4e97c113f | 751 | continue; |
KURETA90 | 0:76a4e97c113f | 752 | } |
KURETA90 | 0:76a4e97c113f | 753 | |
KURETA90 | 0:76a4e97c113f | 754 | /* initialize line display data with backgroud color */ |
KURETA90 | 0:76a4e97c113f | 755 | memset( &cmd_buf[0], (char)( (_background & 0x0F ) | ( (_background & 0x0F ) << 4 ) ), sizeof(cmd_buf) ); |
KURETA90 | 0:76a4e97c113f | 756 | |
KURETA90 | 0:76a4e97c113f | 757 | if( ( line > window_y )&& |
KURETA90 | 0:76a4e97c113f | 758 | ( line < window_y + window_h ) ) { |
KURETA90 | 0:76a4e97c113f | 759 | /* inside display_buffer */ |
KURETA90 | 0:76a4e97c113f | 760 | memcpy( &cmd_buf[ ( window_x / 2 ) ], &disp_buf[ ( window_w / 2 ) * ( line - window_y ) ], ( window_w / 2 ) ); |
KURETA90 | 0:76a4e97c113f | 761 | } |
KURETA90 | 0:76a4e97c113f | 762 | |
KURETA90 | 0:76a4e97c113f | 763 | for( j = 0 ; j < width / 2 ; j++ ) { |
KURETA90 | 0:76a4e97c113f | 764 | /* Read pixel */ |
KURETA90 | 0:76a4e97c113f | 765 | memset( &file_buf[0], 0, 6 ); |
KURETA90 | 0:76a4e97c113f | 766 | if( ( ( j * 2 ) + 1 ) < width ) { |
KURETA90 | 0:76a4e97c113f | 767 | fread( &file_buf[0], sizeof(char), 6, fp ); |
KURETA90 | 0:76a4e97c113f | 768 | } |
KURETA90 | 0:76a4e97c113f | 769 | else if( ( ( j * 2 ) + 1 ) == width ){ |
KURETA90 | 0:76a4e97c113f | 770 | fread( &file_buf[0], sizeof(char), 3, fp ); |
KURETA90 | 0:76a4e97c113f | 771 | } |
KURETA90 | 0:76a4e97c113f | 772 | else { |
KURETA90 | 0:76a4e97c113f | 773 | break; |
KURETA90 | 0:76a4e97c113f | 774 | } |
KURETA90 | 0:76a4e97c113f | 775 | if( j + ( x / 2 ) >= (LCD_DISP_WIDTH/2) ) { |
KURETA90 | 0:76a4e97c113f | 776 | /* out of window system */ |
KURETA90 | 0:76a4e97c113f | 777 | continue; |
KURETA90 | 0:76a4e97c113f | 778 | } |
KURETA90 | 0:76a4e97c113f | 779 | cmd_buf[ j + ( x / 2 ) ] = ( ( file_buf[0] & 0x80 ) >> 2 ); /* B */ |
KURETA90 | 0:76a4e97c113f | 780 | cmd_buf[ j + ( x / 2 ) ] |= ( ( file_buf[1] & 0x80 ) >> 1 ); /* G */ |
KURETA90 | 0:76a4e97c113f | 781 | cmd_buf[ j + ( x / 2 ) ] |= ( file_buf[2] & 0x80 ); /* R */ |
KURETA90 | 0:76a4e97c113f | 782 | |
KURETA90 | 0:76a4e97c113f | 783 | if( ( ( j * 2 ) + 1 ) < width ) { |
KURETA90 | 0:76a4e97c113f | 784 | cmd_buf[ j + ( x / 2 ) ] |= ( ( file_buf[3] & 0x80 ) >> 6 ); /* B */ |
KURETA90 | 0:76a4e97c113f | 785 | cmd_buf[ j + ( x / 2 ) ] |= ( ( file_buf[4] & 0x80 ) >> 5 ); /* G */ |
KURETA90 | 0:76a4e97c113f | 786 | cmd_buf[ j + ( x / 2 ) ] |= ( ( file_buf[5] & 0x80 ) >> 4 ); /* R */ |
KURETA90 | 0:76a4e97c113f | 787 | } |
KURETA90 | 0:76a4e97c113f | 788 | } |
KURETA90 | 0:76a4e97c113f | 789 | |
KURETA90 | 0:76a4e97c113f | 790 | /* send cmaoond request */ |
KURETA90 | 0:76a4e97c113f | 791 | sendLineCommand( &cmd_buf[0], line ); |
KURETA90 | 0:76a4e97c113f | 792 | |
KURETA90 | 0:76a4e97c113f | 793 | /* copy to display buffer */ |
KURETA90 | 0:76a4e97c113f | 794 | if( ( line > window_y )&& |
KURETA90 | 0:76a4e97c113f | 795 | ( line < window_y + window_h ) ) { |
KURETA90 | 0:76a4e97c113f | 796 | /* inside display_buffer */ |
KURETA90 | 0:76a4e97c113f | 797 | memcpy( &disp_buf[ ( window_w / 2 ) * ( line - window_y ) ], &cmd_buf[ ( window_x / 2 ) ], ( window_w / 2 ) ); |
KURETA90 | 0:76a4e97c113f | 798 | } |
KURETA90 | 0:76a4e97c113f | 799 | } |
KURETA90 | 0:76a4e97c113f | 800 | fclose(fp); |
KURETA90 | 0:76a4e97c113f | 801 | } |
KURETA90 | 0:76a4e97c113f | 802 | |
KURETA90 | 0:76a4e97c113f | 803 | return(1); |
KURETA90 | 0:76a4e97c113f | 804 | } |
KURETA90 | 0:76a4e97c113f | 805 | |
KURETA90 | 0:76a4e97c113f | 806 | |
KURETA90 | 0:76a4e97c113f | 807 | /** send data packet */ |
KURETA90 | 0:76a4e97c113f | 808 | void ColorMemLCD::sendLineCommand( char* line_cmd, int line ) |
KURETA90 | 0:76a4e97c113f | 809 | { |
KURETA90 | 0:76a4e97c113f | 810 | int32_t j; |
KURETA90 | 0:76a4e97c113f | 811 | |
KURETA90 | 0:76a4e97c113f | 812 | if( ( line < 0 )|| |
KURETA90 | 0:76a4e97c113f | 813 | ( line >= LCD_DEVICE_HEIGHT ) ) { |
KURETA90 | 0:76a4e97c113f | 814 | /* out of device size */ |
KURETA90 | 0:76a4e97c113f | 815 | return; |
KURETA90 | 0:76a4e97c113f | 816 | } |
KURETA90 | 0:76a4e97c113f | 817 | |
KURETA90 | 0:76a4e97c113f | 818 | wait_us(6); |
KURETA90 | 0:76a4e97c113f | 819 | _cs = 1; |
KURETA90 | 0:76a4e97c113f | 820 | wait_us(6); |
KURETA90 | 0:76a4e97c113f | 821 | _spi.write( LCD_COLOR_CMD_UPDATE | ( polarity << 6 ) ); // Command |
KURETA90 | 0:76a4e97c113f | 822 | _spi.write( line + 1 ); // line |
KURETA90 | 0:76a4e97c113f | 823 | |
KURETA90 | 0:76a4e97c113f | 824 | for( j = 0 ; j < (LCD_DISP_WIDTH/2) ; j++ ) { |
KURETA90 | 0:76a4e97c113f | 825 | if( j >= (LCD_DEVICE_WIDTH/2) ) { |
KURETA90 | 0:76a4e97c113f | 826 | /* out of device size */ |
KURETA90 | 0:76a4e97c113f | 827 | break; |
KURETA90 | 0:76a4e97c113f | 828 | } |
KURETA90 | 0:76a4e97c113f | 829 | _spi.write(line_cmd[j]); // data |
KURETA90 | 0:76a4e97c113f | 830 | } |
KURETA90 | 0:76a4e97c113f | 831 | for( ; j < (LCD_DEVICE_WIDTH/2) ; j++ ) { |
KURETA90 | 0:76a4e97c113f | 832 | /* padding to device size */ |
KURETA90 | 0:76a4e97c113f | 833 | _spi.write( 0x00 ); |
KURETA90 | 0:76a4e97c113f | 834 | } |
KURETA90 | 0:76a4e97c113f | 835 | |
KURETA90 | 0:76a4e97c113f | 836 | _spi.write( 0x00 ); |
KURETA90 | 0:76a4e97c113f | 837 | _spi.write( 0x00 ); |
KURETA90 | 0:76a4e97c113f | 838 | wait_us(6); |
KURETA90 | 0:76a4e97c113f | 839 | _cs = 0; |
KURETA90 | 0:76a4e97c113f | 840 | } |
KURETA90 | 0:76a4e97c113f | 841 | |
KURETA90 | 0:76a4e97c113f | 842 | |
KURETA90 | 0:76a4e97c113f | 843 | /** Toggle the polarity at evry scecond */ |
KURETA90 | 0:76a4e97c113f | 844 | void ColorMemLCD::polling() |
KURETA90 | 0:76a4e97c113f | 845 | { |
KURETA90 | 0:76a4e97c113f | 846 | if( polarity == 0 ) { |
KURETA90 | 0:76a4e97c113f | 847 | polarity = 1; |
KURETA90 | 0:76a4e97c113f | 848 | } |
KURETA90 | 0:76a4e97c113f | 849 | else { |
KURETA90 | 0:76a4e97c113f | 850 | polarity = 0; |
KURETA90 | 0:76a4e97c113f | 851 | } |
KURETA90 | 0:76a4e97c113f | 852 | |
KURETA90 | 0:76a4e97c113f | 853 | if( _cs == 1 ) { |
KURETA90 | 0:76a4e97c113f | 854 | return; |
KURETA90 | 0:76a4e97c113f | 855 | } |
KURETA90 | 0:76a4e97c113f | 856 | |
KURETA90 | 0:76a4e97c113f | 857 | command_SetState(); |
KURETA90 | 0:76a4e97c113f | 858 | } |
KURETA90 | 0:76a4e97c113f | 859 | |
KURETA90 | 0:76a4e97c113f | 860 | |
KURETA90 | 0:76a4e97c113f | 861 | /** Command for setting the state of LCD */ |
KURETA90 | 0:76a4e97c113f | 862 | void ColorMemLCD::command_SetState() |
KURETA90 | 0:76a4e97c113f | 863 | { |
KURETA90 | 0:76a4e97c113f | 864 | wait_us( 6 ); |
KURETA90 | 0:76a4e97c113f | 865 | _cs = 1; |
KURETA90 | 0:76a4e97c113f | 866 | wait_us( 6 ); |
KURETA90 | 0:76a4e97c113f | 867 | _spi.write( blink_cmd | ( polarity << 6 )); |
KURETA90 | 0:76a4e97c113f | 868 | _spi.write( 0x00 ); |
KURETA90 | 0:76a4e97c113f | 869 | wait_us(6); |
KURETA90 | 0:76a4e97c113f | 870 | _cs = 0; |
KURETA90 | 0:76a4e97c113f | 871 | } |
KURETA90 | 0:76a4e97c113f | 872 | |
KURETA90 | 0:76a4e97c113f | 873 | |
KURETA90 | 0:76a4e97c113f | 874 | /** Command to clear whole the LCD */ |
KURETA90 | 0:76a4e97c113f | 875 | void ColorMemLCD::command_AllClear() |
KURETA90 | 0:76a4e97c113f | 876 | { |
KURETA90 | 0:76a4e97c113f | 877 | wait_us( 6 ); |
KURETA90 | 0:76a4e97c113f | 878 | _cs = 1; |
KURETA90 | 0:76a4e97c113f | 879 | wait_us( 6 ); |
KURETA90 | 0:76a4e97c113f | 880 | _spi.write( LCD_COLOR_CMD_ALL_CLEAR | ( polarity << 6 )); |
KURETA90 | 0:76a4e97c113f | 881 | _spi.write( 0x00 ); |
KURETA90 | 0:76a4e97c113f | 882 | wait_us(6); |
KURETA90 | 0:76a4e97c113f | 883 | _cs = 0; |
KURETA90 | 0:76a4e97c113f | 884 | } |
KURETA90 | 0:76a4e97c113f | 885 | |
KURETA90 | 0:76a4e97c113f | 886 | |
KURETA90 | 0:76a4e97c113f | 887 | /** Command to blink */ |
KURETA90 | 0:76a4e97c113f | 888 | void ColorMemLCD::setBlinkMode( char mode ) |
KURETA90 | 0:76a4e97c113f | 889 | { |
KURETA90 | 0:76a4e97c113f | 890 | switch( mode ) { |
KURETA90 | 0:76a4e97c113f | 891 | case LCD_BLINKMODE_NONE: |
KURETA90 | 0:76a4e97c113f | 892 | /* Blinking None */ |
KURETA90 | 0:76a4e97c113f | 893 | blink_cmd = LCD_COLOR_CMD_NO_UPDATE; |
KURETA90 | 0:76a4e97c113f | 894 | break; |
KURETA90 | 0:76a4e97c113f | 895 | case LCD_BLINKMODE_WHITE: |
KURETA90 | 0:76a4e97c113f | 896 | /* Blinking White */ |
KURETA90 | 0:76a4e97c113f | 897 | blink_cmd = LCD_COLOR_CMD_BLINKING_WHITE; |
KURETA90 | 0:76a4e97c113f | 898 | break; |
KURETA90 | 0:76a4e97c113f | 899 | case LCD_BLINKMODE_BLACK: |
KURETA90 | 0:76a4e97c113f | 900 | /* Blinking Black */ |
KURETA90 | 0:76a4e97c113f | 901 | blink_cmd = LCD_COLOR_CMD_BLINKING_BLACK; |
KURETA90 | 0:76a4e97c113f | 902 | break; |
KURETA90 | 0:76a4e97c113f | 903 | case LCD_BLINKMODE_INVERSE: |
KURETA90 | 0:76a4e97c113f | 904 | /* Inversion Mode */ |
KURETA90 | 0:76a4e97c113f | 905 | blink_cmd = LCD_COLOR_CMD_INVERSION; |
KURETA90 | 0:76a4e97c113f | 906 | break; |
KURETA90 | 0:76a4e97c113f | 907 | default: |
KURETA90 | 0:76a4e97c113f | 908 | /* No Update */ |
KURETA90 | 0:76a4e97c113f | 909 | blink_cmd = LCD_COLOR_CMD_NO_UPDATE; |
KURETA90 | 0:76a4e97c113f | 910 | break; |
KURETA90 | 0:76a4e97c113f | 911 | } |
KURETA90 | 0:76a4e97c113f | 912 | |
KURETA90 | 0:76a4e97c113f | 913 | _cs = 1; |
KURETA90 | 0:76a4e97c113f | 914 | wait_us( 6 ); |
KURETA90 | 0:76a4e97c113f | 915 | _spi.write( blink_cmd | ( polarity << 6 )); |
KURETA90 | 0:76a4e97c113f | 916 | _spi.write( 0x00 ); |
KURETA90 | 0:76a4e97c113f | 917 | wait_us(6); |
KURETA90 | 0:76a4e97c113f | 918 | _cs = 0; |
KURETA90 | 0:76a4e97c113f | 919 | } |