1.44 tft lcd display

Dependencies:   TFT_fonts mbed-os

Fork of newTFTLCD by madhu sudhana

Committer:
madhusudhana
Date:
Thu May 24 07:55:36 2018 +0000
Revision:
28:6ac2fa56f82c
Parent:
22:4c169297f374
Child:
29:35482446e4ee
1.44 tft lcd display

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ttodorov 0:881ff0b71102 1 /*
ttodorov 0:881ff0b71102 2 * Copyright (C)2010-2012 Henning Karlsen. All right reserved.
ttodorov 0:881ff0b71102 3 * Copyright (C)2012 Todor Todorov.
ttodorov 0:881ff0b71102 4 *
ttodorov 0:881ff0b71102 5 * This library is free software; you can redistribute it and/or
ttodorov 0:881ff0b71102 6 * modify it under the terms of the GNU Lesser General Public
ttodorov 0:881ff0b71102 7 * License as published by the Free Software Foundation; either
ttodorov 0:881ff0b71102 8 * version 2.1 of the License, or (at your option) any later version.
ttodorov 0:881ff0b71102 9 *
ttodorov 0:881ff0b71102 10 * This library is distributed in the hope that it will be useful,
ttodorov 0:881ff0b71102 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
ttodorov 0:881ff0b71102 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
ttodorov 0:881ff0b71102 13 * Lesser General Public License for more details.
ttodorov 0:881ff0b71102 14 *
ttodorov 0:881ff0b71102 15 * You should have received a copy of the GNU Lesser General Public
ttodorov 0:881ff0b71102 16 * License along with this library; if not, write to:
ttodorov 0:881ff0b71102 17 *
ttodorov 0:881ff0b71102 18 * Free Software Foundation, Inc.
ttodorov 0:881ff0b71102 19 * 51 Franklin St, 5th Floor, Boston, MA 02110-1301, USA
ttodorov 0:881ff0b71102 20 *
ttodorov 0:881ff0b71102 21 *********************************************************************/
ttodorov 0:881ff0b71102 22 #include "lcd_base.h"
ttodorov 3:64a5b67d5b51 23 #include "helpers.h"
ttodorov 0:881ff0b71102 24
ttodorov 22:4c169297f374 25 LCD::LCD( unsigned short width, unsigned short height ,PinName CS, PinName RS, PinName RESET, PinName BL, backlight_t blType, float defaultBacklight )
ttodorov 22:4c169297f374 26 : _disp_width( width ), _disp_height( height ), _lcd_pin_cs( CS ), _lcd_pin_rs( RS ), _lcd_pin_reset( RESET ), _bl_type( blType )
ttodorov 4:3ac4239f6c9c 27 {
ttodorov 4:3ac4239f6c9c 28 SetForeground();
ttodorov 4:3ac4239f6c9c 29 SetBackground();
ttodorov 21:e5c1e8ffada1 30 _font = &TerminusFont;
ttodorov 22:4c169297f374 31 if ( defaultBacklight < 0 ) _bl_pwm_default = 0;
ttodorov 22:4c169297f374 32 else if ( defaultBacklight > 1.0 ) _bl_pwm_default = 1.0;
ttodorov 22:4c169297f374 33 else _bl_pwm_default = defaultBacklight;
ttodorov 22:4c169297f374 34 if ( BL != NC )
ttodorov 22:4c169297f374 35 {
ttodorov 22:4c169297f374 36 if ( blType == Constant )
ttodorov 22:4c169297f374 37 {
ttodorov 22:4c169297f374 38 _bl_pwm = 0;
ttodorov 22:4c169297f374 39 _lcd_pin_bl = new DigitalOut( BL );
ttodorov 22:4c169297f374 40 }
ttodorov 22:4c169297f374 41 else
ttodorov 22:4c169297f374 42 {
ttodorov 22:4c169297f374 43 _lcd_pin_bl = 0;
ttodorov 22:4c169297f374 44 _bl_pwm = new PwmOut( BL );
ttodorov 22:4c169297f374 45 _bl_pwm->period_ms( 8.33 ); // 120 Hz
ttodorov 22:4c169297f374 46 _bl_pwm_current = _bl_pwm_default;
ttodorov 22:4c169297f374 47 // initially off
ttodorov 22:4c169297f374 48 *_bl_pwm = 0;
ttodorov 22:4c169297f374 49 }
ttodorov 22:4c169297f374 50
ttodorov 22:4c169297f374 51 }
ttodorov 22:4c169297f374 52 else
ttodorov 22:4c169297f374 53 {
ttodorov 22:4c169297f374 54 _lcd_pin_bl = 0;
ttodorov 22:4c169297f374 55 _bl_pwm = 0;
ttodorov 22:4c169297f374 56 }
ttodorov 22:4c169297f374 57 }
ttodorov 22:4c169297f374 58
ttodorov 22:4c169297f374 59 void LCD::Sleep( void )
ttodorov 22:4c169297f374 60 {
ttodorov 22:4c169297f374 61 if ( _lcd_pin_bl != 0 )
ttodorov 22:4c169297f374 62 *_lcd_pin_bl = LOW;
ttodorov 22:4c169297f374 63 else if ( _bl_pwm != 0 )
ttodorov 22:4c169297f374 64 *_bl_pwm = 0;
ttodorov 22:4c169297f374 65 }
ttodorov 22:4c169297f374 66
ttodorov 22:4c169297f374 67 void LCD::WakeUp( void )
ttodorov 22:4c169297f374 68 {
ttodorov 22:4c169297f374 69 if ( _lcd_pin_bl != 0 )
ttodorov 22:4c169297f374 70 *_lcd_pin_bl = HIGH;
ttodorov 22:4c169297f374 71 else if ( _bl_pwm != 0 )
ttodorov 22:4c169297f374 72 *_bl_pwm = _bl_pwm_current;
ttodorov 4:3ac4239f6c9c 73 }
ttodorov 0:881ff0b71102 74
ttodorov 0:881ff0b71102 75 inline
ttodorov 12:d0978272a340 76 void LCD::SetForeground( unsigned int color )
ttodorov 0:881ff0b71102 77 {
ttodorov 0:881ff0b71102 78 _foreground = color;
ttodorov 0:881ff0b71102 79 }
ttodorov 0:881ff0b71102 80
ttodorov 0:881ff0b71102 81 inline
ttodorov 12:d0978272a340 82 void LCD::SetBackground( unsigned int color )
ttodorov 0:881ff0b71102 83 {
ttodorov 0:881ff0b71102 84 _background = color;
ttodorov 0:881ff0b71102 85 }
ttodorov 0:881ff0b71102 86
madhusudhana 28:6ac2fa56f82c 87 void LCD::SetFont( const unsigned char font_t )
ttodorov 0:881ff0b71102 88 {
madhusudhana 28:6ac2fa56f82c 89 //_font = font;
madhusudhana 28:6ac2fa56f82c 90 _font = _font;
ttodorov 0:881ff0b71102 91 }
ttodorov 0:881ff0b71102 92
ttodorov 0:881ff0b71102 93 inline
ttodorov 0:881ff0b71102 94 unsigned short LCD::GetWidth( void )
ttodorov 0:881ff0b71102 95 {
ttodorov 12:d0978272a340 96 if ( _orientation == LANDSCAPE || _orientation == LANDSCAPE_REV ) return _disp_height;
ttodorov 0:881ff0b71102 97 return _disp_width;
ttodorov 0:881ff0b71102 98 }
ttodorov 0:881ff0b71102 99
ttodorov 0:881ff0b71102 100 inline
ttodorov 0:881ff0b71102 101 unsigned short LCD::GetHeight( void )
ttodorov 0:881ff0b71102 102 {
ttodorov 12:d0978272a340 103 if ( _orientation == LANDSCAPE || _orientation == LANDSCAPE_REV ) return _disp_width;
ttodorov 0:881ff0b71102 104 return _disp_height;
ttodorov 0:881ff0b71102 105 }
ttodorov 0:881ff0b71102 106
ttodorov 21:e5c1e8ffada1 107 inline
ttodorov 21:e5c1e8ffada1 108 uint8_t LCD::GetFontWidth( void )
ttodorov 21:e5c1e8ffada1 109 {
ttodorov 21:e5c1e8ffada1 110 if ( _font != 0 ) return _font->Width;
ttodorov 21:e5c1e8ffada1 111 return 0;
ttodorov 21:e5c1e8ffada1 112 }
ttodorov 21:e5c1e8ffada1 113
ttodorov 21:e5c1e8ffada1 114 inline
ttodorov 21:e5c1e8ffada1 115 uint8_t LCD::GetFontHeight( void )
ttodorov 21:e5c1e8ffada1 116 {
ttodorov 21:e5c1e8ffada1 117 if ( _font != 0 ) return _font->Height;
ttodorov 21:e5c1e8ffada1 118 return 0;
ttodorov 21:e5c1e8ffada1 119 }
ttodorov 21:e5c1e8ffada1 120
ttodorov 22:4c169297f374 121 void LCD::SetBacklightLevel( float level )
ttodorov 22:4c169297f374 122 {
ttodorov 22:4c169297f374 123 switch ( _bl_type )
ttodorov 22:4c169297f374 124 {
ttodorov 22:4c169297f374 125 case Direct:
ttodorov 22:4c169297f374 126 if ( _bl_pwm != 0 )
ttodorov 22:4c169297f374 127 {
ttodorov 22:4c169297f374 128 *_bl_pwm = level;
ttodorov 22:4c169297f374 129 _bl_pwm_current = level;
ttodorov 22:4c169297f374 130 }
ttodorov 22:4c169297f374 131 break;
ttodorov 22:4c169297f374 132
ttodorov 22:4c169297f374 133 case Indirect:
ttodorov 22:4c169297f374 134 break;
ttodorov 22:4c169297f374 135 case Constant:
ttodorov 22:4c169297f374 136 default:
ttodorov 22:4c169297f374 137 break;
ttodorov 22:4c169297f374 138 }
ttodorov 22:4c169297f374 139 }
ttodorov 22:4c169297f374 140
ttodorov 0:881ff0b71102 141 void LCD::FillScreen( int color )
ttodorov 0:881ff0b71102 142 {
ttodorov 12:d0978272a340 143 unsigned int rgb = color == -1 ? _background : color == -2 ? _foreground : ( unsigned int ) color;
ttodorov 4:3ac4239f6c9c 144 Activate();
ttodorov 2:81ed304b7e9b 145 ClearXY();
ttodorov 1:14bef43daf6f 146 for ( int i = 0; i < ( ( _disp_width ) * ( _disp_height ) ); i++ )
ttodorov 10:69571adcfad5 147 SetPixelColor( rgb );
ttodorov 4:3ac4239f6c9c 148 Deactivate();
ttodorov 0:881ff0b71102 149 }
ttodorov 0:881ff0b71102 150
ttodorov 0:881ff0b71102 151 inline
ttodorov 0:881ff0b71102 152 void LCD::ClearScreen( void )
ttodorov 0:881ff0b71102 153 {
madhusudhana 28:6ac2fa56f82c 154 FillScreen( 0 );//changed from -1 to 0 by madhu
ttodorov 0:881ff0b71102 155 }
ttodorov 0:881ff0b71102 156
ttodorov 0:881ff0b71102 157 void LCD::DrawPixel( unsigned short x, unsigned short y, int color )
ttodorov 0:881ff0b71102 158 {
ttodorov 4:3ac4239f6c9c 159 Activate();
ttodorov 2:81ed304b7e9b 160 SetXY( x, y, x, y );
ttodorov 10:69571adcfad5 161 SetPixelColor( color == -1 ? _background :
ttodorov 0:881ff0b71102 162 color == -2 ? _foreground : color );
ttodorov 4:3ac4239f6c9c 163 Deactivate();
ttodorov 0:881ff0b71102 164 }
ttodorov 0:881ff0b71102 165
ttodorov 0:881ff0b71102 166 void LCD::DrawLine( unsigned short x1, unsigned short y1, unsigned short x2, unsigned short y2, int color )
ttodorov 0:881ff0b71102 167 {
ttodorov 0:881ff0b71102 168
ttodorov 0:881ff0b71102 169 double delta, tx, ty;
ttodorov 0:881ff0b71102 170
ttodorov 0:881ff0b71102 171 if ( ( ( x2 - x1 ) < 0 ) )
ttodorov 0:881ff0b71102 172 {
ttodorov 0:881ff0b71102 173 swap( ushort, x1, x2 )
ttodorov 0:881ff0b71102 174 swap( ushort, y1, y2 )
ttodorov 0:881ff0b71102 175 }
ttodorov 0:881ff0b71102 176 if ( ( ( y2 - y1 ) < 0 ) )
ttodorov 0:881ff0b71102 177 {
ttodorov 0:881ff0b71102 178 swap( ushort, x1, x2 )
ttodorov 0:881ff0b71102 179 swap( ushort, y1, y2 )
ttodorov 0:881ff0b71102 180 }
ttodorov 0:881ff0b71102 181
ttodorov 0:881ff0b71102 182 if ( y1 == y2 )
ttodorov 0:881ff0b71102 183 {
ttodorov 0:881ff0b71102 184 if ( x1 > x2 )
ttodorov 0:881ff0b71102 185 swap( ushort, x1, x2 )
ttodorov 2:81ed304b7e9b 186 DrawHLine( x1, y1, x2 - x1, color );
ttodorov 0:881ff0b71102 187 }
ttodorov 0:881ff0b71102 188 else if ( x1 == x2 )
ttodorov 0:881ff0b71102 189 {
ttodorov 0:881ff0b71102 190 if ( y1 > y2 )
ttodorov 0:881ff0b71102 191 swap( ushort, y1, y2 )
ttodorov 2:81ed304b7e9b 192 DrawVLine( x1, y1, y2 - y1, color );
ttodorov 0:881ff0b71102 193 }
ttodorov 4:3ac4239f6c9c 194 else
ttodorov 0:881ff0b71102 195 {
ttodorov 12:d0978272a340 196 unsigned int usedColor = color == -1 ? _background : color == -2 ? _foreground : ( unsigned int ) color;
ttodorov 4:3ac4239f6c9c 197 Activate();
ttodorov 4:3ac4239f6c9c 198 if ( abs( x2 - x1 ) > abs( y2 - y1 ) )
ttodorov 0:881ff0b71102 199 {
ttodorov 4:3ac4239f6c9c 200 delta = ( double( y2 - y1 ) / double( x2 - x1 ) );
ttodorov 4:3ac4239f6c9c 201 ty = double( y1 );
ttodorov 4:3ac4239f6c9c 202 if ( x1 > x2 )
ttodorov 0:881ff0b71102 203 {
ttodorov 4:3ac4239f6c9c 204 for ( int i = x1; i >= x2; i-- )
ttodorov 4:3ac4239f6c9c 205 {
ttodorov 4:3ac4239f6c9c 206 SetXY( i, int( ty + 0.5 ), i, int( ty + 0.5 ) );
ttodorov 10:69571adcfad5 207 SetPixelColor( usedColor );
ttodorov 4:3ac4239f6c9c 208 ty = ty - delta;
ttodorov 4:3ac4239f6c9c 209 }
ttodorov 4:3ac4239f6c9c 210 }
ttodorov 4:3ac4239f6c9c 211 else
ttodorov 4:3ac4239f6c9c 212 {
ttodorov 4:3ac4239f6c9c 213 for ( int i = x1; i <= x2; i++ )
ttodorov 4:3ac4239f6c9c 214 {
ttodorov 4:3ac4239f6c9c 215 SetXY( i, int( ty + 0.5 ), i, int( ty + 0.5 ) );
ttodorov 10:69571adcfad5 216 SetPixelColor( usedColor );
ttodorov 4:3ac4239f6c9c 217 ty = ty + delta;
ttodorov 4:3ac4239f6c9c 218 }
ttodorov 0:881ff0b71102 219 }
ttodorov 0:881ff0b71102 220 }
ttodorov 0:881ff0b71102 221 else
ttodorov 0:881ff0b71102 222 {
ttodorov 4:3ac4239f6c9c 223 delta = ( float( x2 - x1 ) / float( y2 - y1 ) );
ttodorov 4:3ac4239f6c9c 224 tx = float( x1 );
ttodorov 4:3ac4239f6c9c 225 if ( y1 > y2 )
ttodorov 0:881ff0b71102 226 {
ttodorov 4:3ac4239f6c9c 227 for ( int i = y2 + 1; i > y1; i-- )
ttodorov 4:3ac4239f6c9c 228 {
ttodorov 4:3ac4239f6c9c 229 SetXY( int( tx + 0.5 ), i, int( tx + 0.5 ), i );
ttodorov 10:69571adcfad5 230 SetPixelColor( usedColor );
ttodorov 4:3ac4239f6c9c 231 tx = tx + delta;
ttodorov 4:3ac4239f6c9c 232 }
ttodorov 4:3ac4239f6c9c 233 }
ttodorov 4:3ac4239f6c9c 234 else
ttodorov 4:3ac4239f6c9c 235 {
ttodorov 4:3ac4239f6c9c 236 for ( int i = y1; i < y2 + 1; i++ )
ttodorov 4:3ac4239f6c9c 237 {
ttodorov 4:3ac4239f6c9c 238 SetXY( int( tx + 0.5 ), i, int( tx + 0.5 ), i );
ttodorov 10:69571adcfad5 239 SetPixelColor( usedColor );
ttodorov 4:3ac4239f6c9c 240 tx = tx + delta;
ttodorov 4:3ac4239f6c9c 241 }
ttodorov 0:881ff0b71102 242 }
ttodorov 0:881ff0b71102 243 }
ttodorov 4:3ac4239f6c9c 244 Deactivate();
ttodorov 0:881ff0b71102 245 }
ttodorov 0:881ff0b71102 246 }
ttodorov 0:881ff0b71102 247
ttodorov 0:881ff0b71102 248 void LCD::DrawRect( unsigned short x1, unsigned short y1, unsigned short x2, unsigned short y2, int color )
ttodorov 0:881ff0b71102 249 {
ttodorov 0:881ff0b71102 250 if ( x1 > x2 ) swap( ushort, x1, x2 )
ttodorov 0:881ff0b71102 251 if ( y1 > y2 ) swap( ushort, y1, y2 )
ttodorov 0:881ff0b71102 252
ttodorov 2:81ed304b7e9b 253 DrawHLine( x1, y1, x2 - x1, color );
ttodorov 2:81ed304b7e9b 254 DrawHLine( x1, y2, x2 - x1, color );
ttodorov 2:81ed304b7e9b 255 DrawVLine( x1, y1, y2 - y1, color );
ttodorov 2:81ed304b7e9b 256 DrawVLine( x2, y1, y2 - y1, color );
ttodorov 0:881ff0b71102 257 }
ttodorov 0:881ff0b71102 258
ttodorov 0:881ff0b71102 259 void LCD::DrawRoundRect( unsigned short x1, unsigned short y1, unsigned short x2, unsigned short y2, int color )
ttodorov 0:881ff0b71102 260 {
ttodorov 0:881ff0b71102 261 if ( x1 > x2 ) swap( ushort, x1, x2 )
ttodorov 0:881ff0b71102 262 if ( y1 > y2 ) swap( ushort, y1, y2 )
ttodorov 0:881ff0b71102 263
ttodorov 0:881ff0b71102 264 if ( ( x2 - x1 ) > 4 && ( y2 - y1 ) > 4 )
ttodorov 0:881ff0b71102 265 {
ttodorov 0:881ff0b71102 266 DrawPixel( x1 + 1, y1 + 1, color );
ttodorov 0:881ff0b71102 267 DrawPixel( x2 - 1, y1 + 1, color );
ttodorov 0:881ff0b71102 268 DrawPixel( x1 + 1, y2 - 1, color );
ttodorov 0:881ff0b71102 269 DrawPixel( x2 - 1, y2 - 1, color );
ttodorov 2:81ed304b7e9b 270 DrawHLine( x1 + 2, y1, x2 - x1 - 4, color );
ttodorov 2:81ed304b7e9b 271 DrawHLine( x1 + 2, y2, x2 - x1 - 4, color );
ttodorov 2:81ed304b7e9b 272 DrawVLine( x1, y1 + 2, y2 - y1 - 4, color );
ttodorov 2:81ed304b7e9b 273 DrawVLine( x2, y1 + 2, y2 - y1 - 4, color );
ttodorov 0:881ff0b71102 274 }
ttodorov 0:881ff0b71102 275 }
ttodorov 0:881ff0b71102 276
ttodorov 0:881ff0b71102 277 void LCD::FillRect( unsigned short x1, unsigned short y1, unsigned short x2, unsigned short y2, int color )
ttodorov 0:881ff0b71102 278 {
ttodorov 0:881ff0b71102 279 if ( x1 > x2 ) swap( ushort, x1, x2 );
ttodorov 0:881ff0b71102 280 if ( y1 > y2 ) swap( ushort, y1, y2 );
ttodorov 0:881ff0b71102 281
ttodorov 12:d0978272a340 282 for ( int i = 0; i < ( ( y2 - y1 ) / 2 ) + 1; i++ )
ttodorov 0:881ff0b71102 283 {
ttodorov 12:d0978272a340 284 DrawHLine( x1, y1 + i, x2 - x1, color );
ttodorov 12:d0978272a340 285 DrawHLine( x1, y2 - i, x2 - x1, color );
ttodorov 0:881ff0b71102 286 }
ttodorov 0:881ff0b71102 287 }
ttodorov 0:881ff0b71102 288
ttodorov 0:881ff0b71102 289 void LCD::FillRoundRect( unsigned short x1, unsigned short y1, unsigned short x2, unsigned short y2, int color )
ttodorov 0:881ff0b71102 290 {
ttodorov 0:881ff0b71102 291 if ( x1 > x2 ) swap( ushort, x1, x2 )
ttodorov 0:881ff0b71102 292 if ( y1 > y2 ) swap( ushort, y1, y2 )
ttodorov 0:881ff0b71102 293
ttodorov 0:881ff0b71102 294 if ( ( x2 - x1 ) > 4 && ( y2 - y1 ) > 4 )
ttodorov 0:881ff0b71102 295 {
ttodorov 0:881ff0b71102 296 for ( int i = 0; i < ( ( y2 - y1 ) / 2 ) + 1; i++ )
ttodorov 0:881ff0b71102 297 {
ttodorov 0:881ff0b71102 298 switch ( i )
ttodorov 0:881ff0b71102 299 {
ttodorov 0:881ff0b71102 300 case 0:
ttodorov 2:81ed304b7e9b 301 DrawHLine( x1 + 2, y1 + i, x2 - x1 - 4, color );
ttodorov 2:81ed304b7e9b 302 DrawHLine( x1 + 2, y2 - i, x2 - x1 - 4, color );
ttodorov 0:881ff0b71102 303 break;
ttodorov 0:881ff0b71102 304
ttodorov 0:881ff0b71102 305 case 1:
ttodorov 2:81ed304b7e9b 306 DrawHLine( x1 + 1, y1 + i, x2 - x1 - 2, color );
ttodorov 2:81ed304b7e9b 307 DrawHLine( x1 + 1, y2 - i, x2 - x1 - 2, color );
ttodorov 0:881ff0b71102 308 break;
ttodorov 0:881ff0b71102 309
ttodorov 0:881ff0b71102 310 default:
ttodorov 2:81ed304b7e9b 311 DrawHLine( x1, y1 + i, x2 - x1, color );
ttodorov 2:81ed304b7e9b 312 DrawHLine( x1, y2 - i, x2 - x1, color );
ttodorov 0:881ff0b71102 313 break;
ttodorov 0:881ff0b71102 314 }
ttodorov 0:881ff0b71102 315 }
ttodorov 0:881ff0b71102 316 }
ttodorov 0:881ff0b71102 317 }
ttodorov 0:881ff0b71102 318
ttodorov 0:881ff0b71102 319 void LCD::DrawCircle( unsigned short x, unsigned short y, unsigned short radius, int color )
ttodorov 0:881ff0b71102 320 {
ttodorov 0:881ff0b71102 321 int f = 1 - radius;
ttodorov 0:881ff0b71102 322 int ddF_x = 1;
ttodorov 0:881ff0b71102 323 int ddF_y = -2 * radius;
ttodorov 0:881ff0b71102 324 int x1 = 0;
ttodorov 0:881ff0b71102 325 int y1 = radius;
ttodorov 12:d0978272a340 326 unsigned int usedColor = color == -1 ? _background : color == -2 ? _foreground : ( unsigned int ) color;
ttodorov 0:881ff0b71102 327
ttodorov 4:3ac4239f6c9c 328 Activate();
ttodorov 2:81ed304b7e9b 329 SetXY( x, y + radius, x, y + radius );
ttodorov 10:69571adcfad5 330 SetPixelColor( usedColor );
ttodorov 2:81ed304b7e9b 331 SetXY( x, y - radius, x, y - radius );
ttodorov 10:69571adcfad5 332 SetPixelColor( usedColor );
ttodorov 2:81ed304b7e9b 333 SetXY( x + radius, y, x + radius, y );
ttodorov 10:69571adcfad5 334 SetPixelColor( usedColor );
ttodorov 2:81ed304b7e9b 335 SetXY( x - radius, y, x - radius, y );
ttodorov 10:69571adcfad5 336 SetPixelColor( usedColor );
ttodorov 0:881ff0b71102 337
ttodorov 0:881ff0b71102 338 while ( x1 < y1 )
ttodorov 0:881ff0b71102 339 {
ttodorov 0:881ff0b71102 340 if ( f >= 0 )
ttodorov 0:881ff0b71102 341 {
ttodorov 0:881ff0b71102 342 y1--;
ttodorov 0:881ff0b71102 343 ddF_y += 2;
ttodorov 0:881ff0b71102 344 f += ddF_y;
ttodorov 0:881ff0b71102 345 }
ttodorov 0:881ff0b71102 346 x1++;
ttodorov 0:881ff0b71102 347 ddF_x += 2;
ttodorov 0:881ff0b71102 348 f += ddF_x;
ttodorov 2:81ed304b7e9b 349 SetXY( x + x1, y + y1, x + x1, y + y1 );
ttodorov 10:69571adcfad5 350 SetPixelColor( usedColor );
ttodorov 2:81ed304b7e9b 351 SetXY( x - x1, y + y1, x - x1, y + y1 );
ttodorov 10:69571adcfad5 352 SetPixelColor( usedColor );
ttodorov 2:81ed304b7e9b 353 SetXY( x + x1, y - y1, x + x1, y - y1 );
ttodorov 10:69571adcfad5 354 SetPixelColor( usedColor );
ttodorov 2:81ed304b7e9b 355 SetXY( x - x1, y - y1, x - x1, y - y1 );
ttodorov 10:69571adcfad5 356 SetPixelColor( usedColor );
ttodorov 2:81ed304b7e9b 357 SetXY( x + y1, y + x1, x + y1, y + x1 );
ttodorov 10:69571adcfad5 358 SetPixelColor( usedColor );
ttodorov 2:81ed304b7e9b 359 SetXY( x - y1, y + x1, x - y1, y + x1 );
ttodorov 10:69571adcfad5 360 SetPixelColor( usedColor );
ttodorov 2:81ed304b7e9b 361 SetXY( x + y1, y - x1, x + y1, y - x1 );
ttodorov 10:69571adcfad5 362 SetPixelColor( usedColor );
ttodorov 2:81ed304b7e9b 363 SetXY( x - y1, y - x1, x - y1, y - x1 );
ttodorov 10:69571adcfad5 364 SetPixelColor( usedColor );
ttodorov 0:881ff0b71102 365 }
ttodorov 4:3ac4239f6c9c 366 Deactivate();
ttodorov 0:881ff0b71102 367 }
ttodorov 0:881ff0b71102 368
ttodorov 0:881ff0b71102 369 void LCD::FillCircle( unsigned short x, unsigned short y, unsigned short radius, int color )
ttodorov 0:881ff0b71102 370 {
ttodorov 12:d0978272a340 371 unsigned int usedColor = color == -1 ? _background : color == -2 ? _foreground : ( unsigned int ) color;
ttodorov 4:3ac4239f6c9c 372 Activate();
ttodorov 0:881ff0b71102 373 for ( int y1 = -radius; y1 <= radius; y1++ )
ttodorov 0:881ff0b71102 374 for ( int x1 = -radius; x1 <= radius; x1++ )
ttodorov 0:881ff0b71102 375 if ( x1 * x1 + y1 * y1 <= radius * radius )
ttodorov 0:881ff0b71102 376 {
ttodorov 2:81ed304b7e9b 377 SetXY( x + x1, y + y1, x + x1, y + y1 );
ttodorov 10:69571adcfad5 378 SetPixelColor( usedColor );
ttodorov 0:881ff0b71102 379 }
ttodorov 4:3ac4239f6c9c 380 Deactivate();
ttodorov 0:881ff0b71102 381 }
ttodorov 0:881ff0b71102 382
ttodorov 0:881ff0b71102 383 void LCD::Print( const char *str, unsigned short x, unsigned short y, int fgColor, int bgColor, unsigned short deg )
ttodorov 0:881ff0b71102 384 {
ttodorov 0:881ff0b71102 385 int stl, i;
ttodorov 0:881ff0b71102 386
ttodorov 0:881ff0b71102 387 stl = strlen( str );
ttodorov 0:881ff0b71102 388
ttodorov 12:d0978272a340 389 if ( x == RIGHT )
ttodorov 21:e5c1e8ffada1 390 x = GetWidth() - ( stl * _font->Width );
ttodorov 12:d0978272a340 391 if ( x == CENTER )
ttodorov 21:e5c1e8ffada1 392 x = ( GetWidth() - ( stl * _font->Width ) ) / 2;
ttodorov 0:881ff0b71102 393
ttodorov 0:881ff0b71102 394 for ( i = 0; i < stl; i++ )
ttodorov 0:881ff0b71102 395 if ( deg == 0 )
ttodorov 21:e5c1e8ffada1 396 PrintChar( *str++, x + ( i * ( _font->Width ) ), y, fgColor, bgColor );
ttodorov 0:881ff0b71102 397 else
ttodorov 2:81ed304b7e9b 398 RotateChar( *str++, x, y, i, fgColor, bgColor, deg );
ttodorov 0:881ff0b71102 399 }
madhusudhana 28:6ac2fa56f82c 400 void LCD::Printinv( const char *str, unsigned short x, unsigned short y, int fgColor, int bgColor, unsigned short deg )
madhusudhana 28:6ac2fa56f82c 401 {
madhusudhana 28:6ac2fa56f82c 402 int stl, i;
madhusudhana 28:6ac2fa56f82c 403
madhusudhana 28:6ac2fa56f82c 404 stl = strlen( str );
madhusudhana 28:6ac2fa56f82c 405
madhusudhana 28:6ac2fa56f82c 406 if ( x == RIGHT )
madhusudhana 28:6ac2fa56f82c 407 x = GetWidth() - ( stl * _font->Width );
madhusudhana 28:6ac2fa56f82c 408 if ( x == CENTER )
madhusudhana 28:6ac2fa56f82c 409 x = ( GetWidth() - ( stl * _font->Width ) ) / 2;
madhusudhana 28:6ac2fa56f82c 410
madhusudhana 28:6ac2fa56f82c 411 for ( i = 0; i < stl; i++ )
madhusudhana 28:6ac2fa56f82c 412 if ( deg == 0 )
madhusudhana 28:6ac2fa56f82c 413 PrintChar( *str++, x -( i * ( _font->Width ) ), y, fgColor, bgColor );
madhusudhana 28:6ac2fa56f82c 414 else
madhusudhana 28:6ac2fa56f82c 415 RotateChar( *str++, x, y, i, fgColor, bgColor, deg );
madhusudhana 28:6ac2fa56f82c 416 }
ttodorov 0:881ff0b71102 417
ttodorov 12:d0978272a340 418 void LCD::DrawBitmap( unsigned short x, unsigned short y, const bitmap_t* img, unsigned char scale )
ttodorov 0:881ff0b71102 419 {
ttodorov 0:881ff0b71102 420 int tx, ty, tc, tsx, tsy;
ttodorov 0:881ff0b71102 421
ttodorov 4:3ac4239f6c9c 422 Activate();
ttodorov 0:881ff0b71102 423 if ( scale == 1 )
ttodorov 0:881ff0b71102 424 {
ttodorov 12:d0978272a340 425 SetXY( x, y, x + img->Width - 1, y + img->Height - 1 );
ttodorov 20:4bdca8d8dadc 426
ttodorov 13:5ceeba86bbe4 427 if ( img->Format == RGB16 )
ttodorov 0:881ff0b71102 428 {
ttodorov 13:5ceeba86bbe4 429 const unsigned short *pixel = ( const unsigned short* ) img->PixelData;
ttodorov 20:4bdca8d8dadc 430 for ( tc = 0; tc < ( img->Width * img->Height ); tc++ )
ttodorov 20:4bdca8d8dadc 431 SetPixelColor( *pixel++, img->Format );
ttodorov 13:5ceeba86bbe4 432 }
ttodorov 13:5ceeba86bbe4 433 else if ( img->Format == RGB18 )
ttodorov 13:5ceeba86bbe4 434 {
ttodorov 13:5ceeba86bbe4 435 const unsigned int *pixel = ( const unsigned int* ) img->PixelData;
ttodorov 20:4bdca8d8dadc 436 for ( tc = 0; tc < ( img->Width * img->Height ); tc++ )
ttodorov 20:4bdca8d8dadc 437 SetPixelColor( *pixel++, img->Format );
ttodorov 0:881ff0b71102 438 }
ttodorov 0:881ff0b71102 439 }
ttodorov 0:881ff0b71102 440 else
ttodorov 0:881ff0b71102 441 {
ttodorov 13:5ceeba86bbe4 442 if ( img->Format == RGB16 )
ttodorov 0:881ff0b71102 443 {
ttodorov 13:5ceeba86bbe4 444 const unsigned short *pixel = ( const unsigned short* ) img->PixelData;
ttodorov 13:5ceeba86bbe4 445
ttodorov 13:5ceeba86bbe4 446 for ( ty = 0; ty < img->Height; ty++ )
ttodorov 13:5ceeba86bbe4 447 {
ttodorov 13:5ceeba86bbe4 448 SetXY( x, y + ( ty * scale ), x + ( ( img->Width * scale ) - 1 ), y + ( ty * scale ) + scale );
ttodorov 13:5ceeba86bbe4 449 for ( tsy = 0; tsy < scale; tsy++ )
ttodorov 13:5ceeba86bbe4 450 {
ttodorov 13:5ceeba86bbe4 451 for ( tx = 0; tx < img->Width; tx++ )
ttodorov 13:5ceeba86bbe4 452 {
ttodorov 13:5ceeba86bbe4 453 for ( tsx = 0; tsx < scale; tsx++ )
ttodorov 20:4bdca8d8dadc 454 SetPixelColor( pixel[ ( ty * img->Width ) + tx ], img->Format );
ttodorov 20:4bdca8d8dadc 455 }
ttodorov 20:4bdca8d8dadc 456 }
ttodorov 20:4bdca8d8dadc 457 }
ttodorov 20:4bdca8d8dadc 458 }
ttodorov 20:4bdca8d8dadc 459 else if ( img->Format == RGB18 )
ttodorov 20:4bdca8d8dadc 460 {
ttodorov 20:4bdca8d8dadc 461 const unsigned int *pixel = ( const unsigned int* ) img->PixelData;
ttodorov 20:4bdca8d8dadc 462
ttodorov 20:4bdca8d8dadc 463 for ( ty = 0; ty < img->Height; ty++ )
ttodorov 20:4bdca8d8dadc 464 {
ttodorov 20:4bdca8d8dadc 465 SetXY( x, y + ( ty * scale ), x + ( ( img->Width * scale ) - 1 ), y + ( ty * scale ) + scale );
ttodorov 20:4bdca8d8dadc 466 for ( tsy = 0; tsy < scale; tsy++ )
ttodorov 20:4bdca8d8dadc 467 {
ttodorov 20:4bdca8d8dadc 468 for ( tx = 0; tx < img->Width; tx++ )
ttodorov 20:4bdca8d8dadc 469 {
ttodorov 20:4bdca8d8dadc 470 for ( tsx = 0; tsx < scale; tsx++ )
ttodorov 20:4bdca8d8dadc 471 SetPixelColor( pixel[ ( ty * img->Width ) + tx ], img->Format );
ttodorov 13:5ceeba86bbe4 472 }
ttodorov 13:5ceeba86bbe4 473 }
ttodorov 13:5ceeba86bbe4 474 }
ttodorov 13:5ceeba86bbe4 475 }
ttodorov 0:881ff0b71102 476 }
ttodorov 4:3ac4239f6c9c 477 Deactivate();
ttodorov 0:881ff0b71102 478 }
ttodorov 0:881ff0b71102 479
ttodorov 12:d0978272a340 480 void LCD::DrawBitmap( unsigned short x, unsigned short y, const bitmap_t* img, unsigned short deg, unsigned short rox, unsigned short roy )
ttodorov 0:881ff0b71102 481 {
ttodorov 0:881ff0b71102 482 int tx, ty, newx, newy;
ttodorov 0:881ff0b71102 483 double radian;
ttodorov 0:881ff0b71102 484 radian = deg * 0.0175;
ttodorov 0:881ff0b71102 485
ttodorov 0:881ff0b71102 486 if ( deg == 0 )
ttodorov 12:d0978272a340 487 DrawBitmap( x, y, img );
ttodorov 0:881ff0b71102 488 else
ttodorov 0:881ff0b71102 489 {
ttodorov 4:3ac4239f6c9c 490 Activate();
ttodorov 13:5ceeba86bbe4 491
ttodorov 13:5ceeba86bbe4 492 if ( img->Format == RGB16 )
ttodorov 13:5ceeba86bbe4 493 {
ttodorov 13:5ceeba86bbe4 494 const unsigned short *pixel = ( const unsigned short* ) img->PixelData;
ttodorov 13:5ceeba86bbe4 495
ttodorov 13:5ceeba86bbe4 496 for ( ty = 0; ty < img->Height; ty++ )
ttodorov 13:5ceeba86bbe4 497 for ( tx = 0; tx < img->Width; tx++ )
ttodorov 13:5ceeba86bbe4 498 {
ttodorov 13:5ceeba86bbe4 499 newx = x + rox + ( ( ( tx - rox ) * cos( radian ) ) - ( ( ty - roy ) * sin( radian ) ) );
ttodorov 13:5ceeba86bbe4 500 newy = y + roy + ( ( ( ty - roy ) * cos( radian ) ) + ( ( tx - rox ) * sin( radian ) ) );
ttodorov 13:5ceeba86bbe4 501
ttodorov 13:5ceeba86bbe4 502 SetXY( newx, newy, newx, newy );
ttodorov 20:4bdca8d8dadc 503 SetPixelColor( pixel[ ( ty * img->Width ) + tx ], img->Format );
ttodorov 13:5ceeba86bbe4 504 }
ttodorov 13:5ceeba86bbe4 505 }
ttodorov 13:5ceeba86bbe4 506 else if ( img->Format == RGB18 )
ttodorov 13:5ceeba86bbe4 507 {
ttodorov 13:5ceeba86bbe4 508 const unsigned int *pixel = ( const unsigned int* ) img->PixelData;
ttodorov 13:5ceeba86bbe4 509
ttodorov 13:5ceeba86bbe4 510 for ( ty = 0; ty < img->Height; ty++ )
ttodorov 13:5ceeba86bbe4 511 for ( tx = 0; tx < img->Width; tx++ )
ttodorov 13:5ceeba86bbe4 512 {
ttodorov 13:5ceeba86bbe4 513 newx = x + rox + ( ( ( tx - rox ) * cos( radian ) ) - ( ( ty - roy ) * sin( radian ) ) );
ttodorov 13:5ceeba86bbe4 514 newy = y + roy + ( ( ( ty - roy ) * cos( radian ) ) + ( ( tx - rox ) * sin( radian ) ) );
ttodorov 13:5ceeba86bbe4 515
ttodorov 13:5ceeba86bbe4 516 SetXY( newx, newy, newx, newy );
ttodorov 20:4bdca8d8dadc 517 SetPixelColor( pixel[ ( ty * img->Width ) + tx ], img->Format );
ttodorov 13:5ceeba86bbe4 518 }
ttodorov 13:5ceeba86bbe4 519 }
ttodorov 4:3ac4239f6c9c 520 Deactivate();
ttodorov 0:881ff0b71102 521 }
ttodorov 4:3ac4239f6c9c 522 }
ttodorov 4:3ac4239f6c9c 523
ttodorov 4:3ac4239f6c9c 524 inline
ttodorov 4:3ac4239f6c9c 525 void LCD::Activate( void )
ttodorov 4:3ac4239f6c9c 526 {
ttodorov 4:3ac4239f6c9c 527 _lcd_pin_cs = LOW;
ttodorov 4:3ac4239f6c9c 528 }
ttodorov 4:3ac4239f6c9c 529
ttodorov 4:3ac4239f6c9c 530 inline
ttodorov 4:3ac4239f6c9c 531 void LCD::Deactivate( void )
ttodorov 4:3ac4239f6c9c 532 {
ttodorov 4:3ac4239f6c9c 533 _lcd_pin_cs = HIGH;
ttodorov 0:881ff0b71102 534 }
ttodorov 0:881ff0b71102 535
ttodorov 0:881ff0b71102 536 inline
ttodorov 2:81ed304b7e9b 537 void LCD::WriteCmdData( unsigned short cmd, unsigned short data )
ttodorov 0:881ff0b71102 538 {
ttodorov 2:81ed304b7e9b 539 WriteCmd( cmd );
ttodorov 2:81ed304b7e9b 540 WriteData( data );
ttodorov 0:881ff0b71102 541 }
ttodorov 0:881ff0b71102 542
ttodorov 12:d0978272a340 543 inline
ttodorov 12:d0978272a340 544 void LCD::ClearXY( void )
ttodorov 0:881ff0b71102 545 {
ttodorov 12:d0978272a340 546 SetXY( 0, 0, GetWidth() - 1, GetHeight() - 1 );
ttodorov 0:881ff0b71102 547 }
ttodorov 0:881ff0b71102 548
ttodorov 2:81ed304b7e9b 549 void LCD::DrawHLine( unsigned short x, unsigned short y, unsigned short len, int color )
ttodorov 0:881ff0b71102 550 {
ttodorov 12:d0978272a340 551 unsigned int usedColor = color == -1 ? _background : color == -2 ? _foreground : ( unsigned int ) color;
ttodorov 0:881ff0b71102 552
ttodorov 4:3ac4239f6c9c 553 Activate();
ttodorov 2:81ed304b7e9b 554 SetXY( x, y, x + len, y );
ttodorov 0:881ff0b71102 555 for ( int i = 0; i < len + 1; i++ )
ttodorov 10:69571adcfad5 556 SetPixelColor( usedColor );
ttodorov 4:3ac4239f6c9c 557 Deactivate();
ttodorov 0:881ff0b71102 558 }
ttodorov 0:881ff0b71102 559
ttodorov 2:81ed304b7e9b 560 void LCD::DrawVLine( unsigned short x, unsigned short y, unsigned short len, int color )
ttodorov 0:881ff0b71102 561 {
ttodorov 12:d0978272a340 562 unsigned int usedColor = color == -1 ? _background : color == -2 ? _foreground : ( unsigned int ) color;
ttodorov 0:881ff0b71102 563
ttodorov 4:3ac4239f6c9c 564 Activate();
ttodorov 2:81ed304b7e9b 565 SetXY( x, y, x, y + len );
ttodorov 0:881ff0b71102 566 for ( int i = 0; i < len; i++ )
ttodorov 10:69571adcfad5 567 SetPixelColor( usedColor );
ttodorov 4:3ac4239f6c9c 568 Deactivate();
ttodorov 0:881ff0b71102 569 }
ttodorov 0:881ff0b71102 570
ttodorov 2:81ed304b7e9b 571 void LCD::PrintChar( char c, unsigned short x, unsigned short y, int fgColor, int bgColor )
ttodorov 0:881ff0b71102 572 {
ttodorov 0:881ff0b71102 573 uint8_t i, ch;
ttodorov 0:881ff0b71102 574 uint16_t j;
ttodorov 12:d0978272a340 575 unsigned int usedColorFG = fgColor == -1 ? _background : fgColor == -2 ? _foreground : ( unsigned int ) fgColor;
ttodorov 12:d0978272a340 576 unsigned int usedColorBG = bgColor == -1 ? _background : bgColor == -2 ? _foreground : ( unsigned int ) bgColor;
ttodorov 21:e5c1e8ffada1 577
ttodorov 21:e5c1e8ffada1 578 uint16_t totalCharBytes = ( _font->Width * _font->Height ) / 8;
ttodorov 21:e5c1e8ffada1 579 int16_t position = _font->Position[ c - _font->Offset ];
ttodorov 21:e5c1e8ffada1 580 if ( position == -1 ) position = 0; // will print space character
ttodorov 21:e5c1e8ffada1 581
ttodorov 4:3ac4239f6c9c 582 Activate();
ttodorov 0:881ff0b71102 583
ttodorov 21:e5c1e8ffada1 584 SetXY( x, y, x + _font->Width - 1, y + _font->Height - 1 );
ttodorov 21:e5c1e8ffada1 585
ttodorov 21:e5c1e8ffada1 586 for ( j = 0; j < totalCharBytes; j++ )
ttodorov 0:881ff0b71102 587 {
ttodorov 21:e5c1e8ffada1 588 ch = _font->Data[ position ];
ttodorov 12:d0978272a340 589 for ( i = 0; i < 8; i++ )
ttodorov 0:881ff0b71102 590 {
ttodorov 21:e5c1e8ffada1 591 if ( ( ch & ( 1 << ( 7 - i ) ) ) != 0 ) SetPixelColor( usedColorFG );
ttodorov 21:e5c1e8ffada1 592 else SetPixelColor( usedColorBG );
ttodorov 0:881ff0b71102 593 }
ttodorov 21:e5c1e8ffada1 594 position++;
ttodorov 0:881ff0b71102 595 }
ttodorov 4:3ac4239f6c9c 596 Deactivate();
ttodorov 0:881ff0b71102 597 }
ttodorov 0:881ff0b71102 598
ttodorov 2:81ed304b7e9b 599 void LCD::RotateChar( char c, unsigned short x, unsigned short y, int pos, int fgColor, int bgColor, unsigned short deg )
ttodorov 0:881ff0b71102 600 {
ttodorov 0:881ff0b71102 601 uint8_t i, j, ch;
ttodorov 0:881ff0b71102 602 int newx, newy;
ttodorov 0:881ff0b71102 603 double radian;
ttodorov 0:881ff0b71102 604 radian = deg * 0.0175;
ttodorov 0:881ff0b71102 605
ttodorov 12:d0978272a340 606 unsigned int usedColorFG = fgColor == -1 ? _background : fgColor == -2 ? _foreground : ( unsigned int ) fgColor;
ttodorov 12:d0978272a340 607 unsigned int usedColorBG = bgColor == -1 ? _background : bgColor == -2 ? _foreground : ( unsigned int ) bgColor;
ttodorov 0:881ff0b71102 608
ttodorov 21:e5c1e8ffada1 609 int16_t position = _font->Position[ c - _font->Offset ];
ttodorov 21:e5c1e8ffada1 610 if ( position == -1 ) position = 0; // will print space character
ttodorov 21:e5c1e8ffada1 611
ttodorov 4:3ac4239f6c9c 612 Activate();
ttodorov 21:e5c1e8ffada1 613
ttodorov 21:e5c1e8ffada1 614 for ( j = 0; j < _font->Height; j++ )
ttodorov 0:881ff0b71102 615 {
ttodorov 21:e5c1e8ffada1 616 for ( uint16_t zz = 0; zz < ( ( double ) _font->Width / 8 ); zz++ )
ttodorov 0:881ff0b71102 617 {
ttodorov 21:e5c1e8ffada1 618 ch = _font->Data[ position + zz ];
ttodorov 0:881ff0b71102 619 for ( i = 0; i < 8; i++ )
ttodorov 0:881ff0b71102 620 {
ttodorov 21:e5c1e8ffada1 621 newx = x + ( ( ( i + ( zz * 8 ) + ( pos * _font->Width ) ) * cos( radian ) ) - ( ( j ) * sin( radian ) ) );
ttodorov 21:e5c1e8ffada1 622 newy = y + ( ( ( j ) * cos( radian ) ) + ( ( i + ( zz * 8 ) + ( pos * _font->Width ) ) * sin( radian ) ) );
ttodorov 0:881ff0b71102 623
ttodorov 2:81ed304b7e9b 624 SetXY( newx, newy, newx + 1, newy + 1 );
ttodorov 0:881ff0b71102 625
ttodorov 21:e5c1e8ffada1 626 if ( ( ch & ( 1 << ( 7 - i ) ) ) != 0 ) SetPixelColor( usedColorFG );
ttodorov 21:e5c1e8ffada1 627 else SetPixelColor( usedColorBG );
ttodorov 0:881ff0b71102 628 }
ttodorov 0:881ff0b71102 629 }
ttodorov 21:e5c1e8ffada1 630 position += ( _font->Width / 8 );
ttodorov 0:881ff0b71102 631 }
ttodorov 21:e5c1e8ffada1 632
ttodorov 4:3ac4239f6c9c 633 Deactivate();
ttodorov 0:881ff0b71102 634 }