A library for LPM013M126A – JDI Color Memory LCD. This library is an inherited class from the “GraphicDisplay”, and Its functions are similar to “C12832_lcd” or ”SPI_TFT” library.

Dependents:   Test_ColorMemLCD rIoTwear_LCD

1.28" (176x176 193ppi) 8 Color Memory LCD of ultra-low power consumption in sub uA.

Committer:
KURETA90
Date:
Thu Jun 23 04:34:39 2016 +0000
Revision:
1:b035a997ec3f
Parent:
0:76a4e97c113f
deleting unused parameter

Who changed what in which revision?

UserRevisionLine numberNew 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 }