Imrich Konkol / Mbed 2 deprecated lcd_tft_ssd2119

Dependencies:   EthernetNetIf mbed

Committer:
ikon
Date:
Sun Feb 27 23:39:10 2011 +0000
Revision:
2:456410210d03
1.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ikon 2:456410210d03 1 // Display oriented routines in mBed Retro Picture Frame
ikon 2:456410210d03 2 #include "mbed.h"
ikon 2:456410210d03 3 #include "Display.h"
ikon 2:456410210d03 4 #include "Fonts.h"
ikon 2:456410210d03 5
ikon 2:456410210d03 6 SPI spi(p5, p6, p7); // mosi, miso, sclk
ikon 2:456410210d03 7 DigitalOut DCS(p8); // Display chip select
ikon 2:456410210d03 8 DigitalOut DRS(p15); // Display reset
ikon 2:456410210d03 9 DigitalOut DCD(p16); // Display command/data
ikon 2:456410210d03 10 DigitalOut DRD(p17); // Display read
ikon 2:456410210d03 11 DigitalOut DWR(p18); // Display write
ikon 2:456410210d03 12
ikon 2:456410210d03 13 //static uint16_t xx,yy;
ikon 2:456410210d03 14 //static uint16_t BACKGROUND, FOREGROUND;
ikon 2:456410210d03 15
ikon 2:456410210d03 16 // Global 256 colour palette arraysc
ikon 2:456410210d03 17 uint16_t palette256[256];
ikon 2:456410210d03 18
ikon 2:456410210d03 19 static uint16_t yy=0;
ikon 2:456410210d03 20 static uint16_t xx=0;
ikon 2:456410210d03 21
ikon 2:456410210d03 22 uint16_t BACKGROUND = WHITE;
ikon 2:456410210d03 23 uint16_t FOREGROUND = BLACK;
ikon 2:456410210d03 24
ikon 2:456410210d03 25
ikon 2:456410210d03 26 #define HRES 320 // X axis # of pixels
ikon 2:456410210d03 27 #define VRES 240 // Y axis # of pixels
ikon 2:456410210d03 28
ikon 2:456410210d03 29 // Essential display commands
ikon 2:456410210d03 30 /*************************************************/
ikon 2:456410210d03 31 void write_command(uint16_t command) {
ikon 2:456410210d03 32 uint8_t raw;
ikon 2:456410210d03 33
ikon 2:456410210d03 34 DRD = 1;
ikon 2:456410210d03 35 DCS = 0;
ikon 2:456410210d03 36 DCD = 0;
ikon 2:456410210d03 37
ikon 2:456410210d03 38 raw = command;
ikon 2:456410210d03 39 //raw &= 0x00FF; // Keep bit9 low - means command
ikon 2:456410210d03 40 //printf("Raw data: %d\n",raw);
ikon 2:456410210d03 41 spi.write(raw);
ikon 2:456410210d03 42
ikon 2:456410210d03 43 DWR = 1;
ikon 2:456410210d03 44 DCS = 1;
ikon 2:456410210d03 45 }
ikon 2:456410210d03 46
ikon 2:456410210d03 47 /*************************************************/
ikon 2:456410210d03 48
ikon 2:456410210d03 49 //typedef unsigned char u8;
ikon 2:456410210d03 50 //typedef unsigned int u16;
ikon 2:456410210d03 51 void write_data(uint16_t value) {
ikon 2:456410210d03 52 uint8_t raw;
ikon 2:456410210d03 53
ikon 2:456410210d03 54 DRD = 1;
ikon 2:456410210d03 55 DCD = 1;
ikon 2:456410210d03 56 DCS = 0;
ikon 2:456410210d03 57
ikon 2:456410210d03 58 raw = (value)>>8;
ikon 2:456410210d03 59 // raw &= 0x00FF; // Keep bit9 high - means data
ikon 2:456410210d03 60 // raw |= 0x0100;
ikon 2:456410210d03 61 // printf("Raw data: %d\n",raw);
ikon 2:456410210d03 62 spi.write(raw);
ikon 2:456410210d03 63
ikon 2:456410210d03 64 DCS = 1;
ikon 2:456410210d03 65 //wait_ms(1);
ikon 2:456410210d03 66 DCS = 0;
ikon 2:456410210d03 67
ikon 2:456410210d03 68 raw = value;
ikon 2:456410210d03 69 // raw &= 0x00FF; // Keep bit9 high - means data
ikon 2:456410210d03 70 // raw |= 0x0100;
ikon 2:456410210d03 71 // printf("Raw data: %d\n",raw);
ikon 2:456410210d03 72 spi.write(raw);
ikon 2:456410210d03 73
ikon 2:456410210d03 74 DCS = 1;
ikon 2:456410210d03 75 }
ikon 2:456410210d03 76
ikon 2:456410210d03 77
ikon 2:456410210d03 78
ikon 2:456410210d03 79
ikon 2:456410210d03 80
ikon 2:456410210d03 81
ikon 2:456410210d03 82
ikon 2:456410210d03 83
ikon 2:456410210d03 84
ikon 2:456410210d03 85 // Set X & Y axis of next pixel write
ikon 2:456410210d03 86 void LcdSetPenXY(uint16_t x, uint16_t y) {
ikon 2:456410210d03 87 write_command(0x004F); // RAM address set for Y axis
ikon 2:456410210d03 88 write_data(y); // Page 58 of SSD2119 datasheet
ikon 2:456410210d03 89 write_command(0x004E); // RAM address set for X axis
ikon 2:456410210d03 90 write_data(x); // Page 58 of SSD2119 datasheet
ikon 2:456410210d03 91 write_command(0x0022); // Return back to pixel write mode
ikon 2:456410210d03 92 }
ikon 2:456410210d03 93
ikon 2:456410210d03 94
ikon 2:456410210d03 95 /*-----------------------------------------------------------------------------
ikon 2:456410210d03 96 Name : LcdGotoXY
ikon 2:456410210d03 97 Description : Sets cursor location to xy location corresponding to basic
ikon 2:456410210d03 98 font size.
ikon 2:456410210d03 99 Argument(s) : x, y -> Coordinate for new cursor position. Range: 0,0..VRES/6,HRES/8
ikon 2:456410210d03 100 Return value : None.
ikon 2:456410210d03 101 -----------------------------------------------------------------------------*/
ikon 2:456410210d03 102 void LcdGotoXY ( uint8_t x, uint8_t y ) {
ikon 2:456410210d03 103 // uint16_t xx, yy;
ikon 2:456410210d03 104 xx = y * 8;
ikon 2:456410210d03 105 yy = x * 6;
ikon 2:456410210d03 106 //LcdCacheIdx = (x - 1) * HRES + (y - 1) * VRES;
ikon 2:456410210d03 107 LcdSetPenXY(xx,yy);
ikon 2:456410210d03 108 }
ikon 2:456410210d03 109
ikon 2:456410210d03 110 /*-----------------------------------------------------------------------------
ikon 2:456410210d03 111 Name : LcdGotoXY8
ikon 2:456410210d03 112 Description : Sets cursor location to xy location corresponding to basic
ikon 2:456410210d03 113 font size 8x8 pixels (same as above but adjusted for S font).
ikon 2:456410210d03 114 Argument(s) : x, y -> Coordinate for new cursor position. Range: 0,0..HRES/8,VRES/8
ikon 2:456410210d03 115 Return value : None.
ikon 2:456410210d03 116 -----------------------------------------------------------------------------*/
ikon 2:456410210d03 117 void LcdGotoXY8 ( uint8_t x, uint8_t y ) {
ikon 2:456410210d03 118 // uint16_t xx, yy;
ikon 2:456410210d03 119 xx = (HRES - 1) - ((x+1) * 8);
ikon 2:456410210d03 120 yy = y * 8;
ikon 2:456410210d03 121 //LcdCacheIdx = (x - 1) * HRES + (y - 1) * VRES;
ikon 2:456410210d03 122 LcdSetPenXY(xx,yy);
ikon 2:456410210d03 123 }
ikon 2:456410210d03 124
ikon 2:456410210d03 125 typedef enum {
ikon 2:456410210d03 126 FONT_1X = 1,
ikon 2:456410210d03 127 FONT_2X = 2
ikon 2:456410210d03 128
ikon 2:456410210d03 129 } LcdFontSize;
ikon 2:456410210d03 130
ikon 2:456410210d03 131 typedef enum {
ikon 2:456410210d03 132 PIXEL_OFF = 0,
ikon 2:456410210d03 133 PIXEL_ON = 1,
ikon 2:456410210d03 134 PIXEL_XOR = 2
ikon 2:456410210d03 135
ikon 2:456410210d03 136 } LcdPixelMode;
ikon 2:456410210d03 137
ikon 2:456410210d03 138
ikon 2:456410210d03 139 // Added for horizontal print
ikon 2:456410210d03 140 void LcdChr8x8 ( uint8_t ch) {
ikon 2:456410210d03 141
ikon 2:456410210d03 142 uint8_t i,j,c;
ikon 2:456410210d03 143
ikon 2:456410210d03 144 if ( (ch < 0x20) || (ch > 0x7F) ) {
ikon 2:456410210d03 145 // Convert to a printable character.
ikon 2:456410210d03 146 ch = 0x80;
ikon 2:456410210d03 147 }
ikon 2:456410210d03 148
ikon 2:456410210d03 149 for(i=0;i<8;i++) {
ikon 2:456410210d03 150 c = Font8x8[8*(ch-32)+i];
ikon 2:456410210d03 151
ikon 2:456410210d03 152 for ( j = 0; j < 8; j++ ) {
ikon 2:456410210d03 153 if ( (c & 0x01) == 0x01 ) {
ikon 2:456410210d03 154 write_data(FOREGROUND);
ikon 2:456410210d03 155 } else {
ikon 2:456410210d03 156 write_data(BACKGROUND);
ikon 2:456410210d03 157 }
ikon 2:456410210d03 158 c >>= 1;
ikon 2:456410210d03 159 }
ikon 2:456410210d03 160 yy++;
ikon 2:456410210d03 161 write_command(0x004F); // RAM address set for Y axis
ikon 2:456410210d03 162 write_data(yy); // Page 58 of SSD2119 datasheet
ikon 2:456410210d03 163 write_command(0x0022);
ikon 2:456410210d03 164 }
ikon 2:456410210d03 165 yy-=8;
ikon 2:456410210d03 166 xx-=8;
ikon 2:456410210d03 167 LcdSetPenXY(xx,yy);
ikon 2:456410210d03 168 }
ikon 2:456410210d03 169
ikon 2:456410210d03 170 // Print 8*8 charset string
ikon 2:456410210d03 171 void LcdStr8x8 ( char *dataPtr ) {
ikon 2:456410210d03 172 while ( *dataPtr ) {
ikon 2:456410210d03 173 LcdChr8x8( *dataPtr++ );
ikon 2:456410210d03 174 }
ikon 2:456410210d03 175 }
ikon 2:456410210d03 176
ikon 2:456410210d03 177 /*-----------------------------------------------------------------------------
ikon 2:456410210d03 178 Name : LcdChr
ikon 2:456410210d03 179 Description : Displays a character at current cursor location
ikon 2:456410210d03 180 and increment cursor location.
ikon 2:456410210d03 181 Argument(s) : size -> Font size. See enum.
ikon 2:456410210d03 182 ch -> Character to write.
ikon 2:456410210d03 183 Return value : None.
ikon 2:456410210d03 184 -----------------------------------------------------------------------------*/
ikon 2:456410210d03 185 void LcdChr ( uint8_t ch ) {
ikon 2:456410210d03 186 uint8_t i, j, c;
ikon 2:456410210d03 187
ikon 2:456410210d03 188 if ( (ch < 0x20) || (ch > 0x7F) ) {
ikon 2:456410210d03 189 // Convert to a printable character.
ikon 2:456410210d03 190 ch = 0x80;
ikon 2:456410210d03 191 }
ikon 2:456410210d03 192
ikon 2:456410210d03 193 //write_command(0x0022);
ikon 2:456410210d03 194
ikon 2:456410210d03 195 for ( i = 0; i < 6; i++ ) {
ikon 2:456410210d03 196 if (i < 5) {
ikon 2:456410210d03 197 c = FontLookup[ch - 32][i];
ikon 2:456410210d03 198 } else {
ikon 2:456410210d03 199 c = 0x00; // Space after each character
ikon 2:456410210d03 200 }
ikon 2:456410210d03 201
ikon 2:456410210d03 202 for ( j = 0; j < 8; j++ ) {
ikon 2:456410210d03 203 if ( (c & 0x01) == 0x01 ) {
ikon 2:456410210d03 204 //printf("X");
ikon 2:456410210d03 205 write_data(FOREGROUND);
ikon 2:456410210d03 206 } else {
ikon 2:456410210d03 207 //printf(".");
ikon 2:456410210d03 208 write_data(BACKGROUND);
ikon 2:456410210d03 209 }
ikon 2:456410210d03 210 //printf("\n");
ikon 2:456410210d03 211 c >>= 1;
ikon 2:456410210d03 212 }
ikon 2:456410210d03 213 yy++;
ikon 2:456410210d03 214 write_command(0x004F); // RAM address set for Y axis
ikon 2:456410210d03 215 write_data(yy); // Page 58 of SSD2119 datasheet
ikon 2:456410210d03 216 write_command(0x0022);
ikon 2:456410210d03 217 }
ikon 2:456410210d03 218 }
ikon 2:456410210d03 219
ikon 2:456410210d03 220
ikon 2:456410210d03 221 /*-----------------------------------------------------------------------------
ikon 2:456410210d03 222 Name : LcdStr
ikon 2:456410210d03 223 Description : Displays a character at current cursor location and increment
ikon 2:456410210d03 224 cursor location according to font size.
ikon 2:456410210d03 225 Argument(s) : size -> Font size. See enum.
ikon 2:456410210d03 226 dataPtr -> Pointer to null terminated ASCII string to display.
ikon 2:456410210d03 227 Return value : None.
ikon 2:456410210d03 228 -----------------------------------------------------------------------------*/
ikon 2:456410210d03 229 void LcdStr ( char *dataPtr ) {
ikon 2:456410210d03 230 while ( *dataPtr ) {
ikon 2:456410210d03 231 LcdChr( *dataPtr++ );
ikon 2:456410210d03 232 }
ikon 2:456410210d03 233 }
ikon 2:456410210d03 234
ikon 2:456410210d03 235
ikon 2:456410210d03 236 /*************************************************/
ikon 2:456410210d03 237 void initialization() {
ikon 2:456410210d03 238
ikon 2:456410210d03 239 // Setup the spi for 8 bit data, high steady state clock,
ikon 2:456410210d03 240 // second edge capture, with a 10 MHz clock rate
ikon 2:456410210d03 241 spi.format(8,3); // CPOL=1, CPHA=1
ikon 2:456410210d03 242 spi.frequency(10000000); // SPI fastest possible
ikon 2:456410210d03 243 /*
ikon 2:456410210d03 244 SET_RD;
ikon 2:456410210d03 245 SET_WR;
ikon 2:456410210d03 246 SET_CS;
ikon 2:456410210d03 247 SET_CD;
ikon 2:456410210d03 248 PORTA=0x00;
ikon 2:456410210d03 249 PORTE=0x00;
ikon 2:456410210d03 250
ikon 2:456410210d03 251 CLR_RESET;
ikon 2:456410210d03 252 delay(200);
ikon 2:456410210d03 253 SET_RESET;
ikon 2:456410210d03 254 delay(500);
ikon 2:456410210d03 255 */
ikon 2:456410210d03 256 DRD = 1;
ikon 2:456410210d03 257 DWR = 1;
ikon 2:456410210d03 258 DCS = 1;
ikon 2:456410210d03 259 DCD = 1;
ikon 2:456410210d03 260
ikon 2:456410210d03 261 DRS = 0;
ikon 2:456410210d03 262 wait_ms(200);
ikon 2:456410210d03 263 DRS = 1;
ikon 2:456410210d03 264 wait_ms(500);
ikon 2:456410210d03 265
ikon 2:456410210d03 266 write_command(0x0028); // VCOM OTP
ikon 2:456410210d03 267 write_data(0x0006); // Page 55-56 of SSD2119 datasheet
ikon 2:456410210d03 268
ikon 2:456410210d03 269 write_command(0x0000); // start Oscillator
ikon 2:456410210d03 270 write_data(0x0001); // Page 36 of SSD2119 datasheet
ikon 2:456410210d03 271
ikon 2:456410210d03 272 write_command(0x0010); // Sleep mode
ikon 2:456410210d03 273 write_data(0x0000); // Page 49 of SSD2119 datasheet
ikon 2:456410210d03 274
ikon 2:456410210d03 275 write_command(0x0001); // Driver Output Control
ikon 2:456410210d03 276 write_data(0x32EF); // Page 36-39 of SSD2119 datasheet
ikon 2:456410210d03 277
ikon 2:456410210d03 278 write_command(0x0002); // LCD Driving Waveform Control
ikon 2:456410210d03 279 write_data(0x0600); // Page 40-42 of SSD2119 datasheet
ikon 2:456410210d03 280
ikon 2:456410210d03 281 write_command(0x0003); // Power Control 1
ikon 2:456410210d03 282 write_data(0x6A38); // Page 43-44 of SSD2119 datasheet
ikon 2:456410210d03 283
ikon 2:456410210d03 284 write_command(0x0011); // Entry Mode
ikon 2:456410210d03 285 write_data(0x6870); // Page 50-52 of SSD2119 datasheet
ikon 2:456410210d03 286
ikon 2:456410210d03 287 write_command(0x000F); // Gate Scan Position
ikon 2:456410210d03 288 write_data(0x0000); // Page 49 of SSD2119 datasheet
ikon 2:456410210d03 289
ikon 2:456410210d03 290 write_command(0x000B); // Frame Cycle Control
ikon 2:456410210d03 291 write_data(0x5308); // Page 45 of SSD2119 datasheet
ikon 2:456410210d03 292
ikon 2:456410210d03 293 write_command(0x000C); // Power Control 2
ikon 2:456410210d03 294 write_data(0x0003); // Page 47 of SSD2119 datasheet
ikon 2:456410210d03 295
ikon 2:456410210d03 296 write_command(0x000D); // Power Control 3
ikon 2:456410210d03 297 write_data(0x000A); // Page 48 of SSD2119 datasheet
ikon 2:456410210d03 298
ikon 2:456410210d03 299 write_command(0x000E); // Power Control 4
ikon 2:456410210d03 300 write_data(0x2E00); // Page 48 of SSD2119 datasheet
ikon 2:456410210d03 301
ikon 2:456410210d03 302 write_command(0x001E); // Power Control 5
ikon 2:456410210d03 303 write_data(0x00BE); // Page 53 of SSD2119 datasheet
ikon 2:456410210d03 304
ikon 2:456410210d03 305 write_command(0x0025); // Frame Frequency Control
ikon 2:456410210d03 306 write_data(0x8000); // Page 53 of SSD2119 datasheet
ikon 2:456410210d03 307
ikon 2:456410210d03 308 write_command(0x0026); // Analog setting
ikon 2:456410210d03 309 write_data(0x7800); // Page 54 of SSD2119 datasheet
ikon 2:456410210d03 310
ikon 2:456410210d03 311 write_command(0x004E); // Ram Address Set
ikon 2:456410210d03 312 write_data(0x0000); // Page 58 of SSD2119 datasheet
ikon 2:456410210d03 313
ikon 2:456410210d03 314 write_command(0x004F); // Ram Address Set
ikon 2:456410210d03 315 write_data(0x0000); // Page 58 of SSD2119 datasheet
ikon 2:456410210d03 316
ikon 2:456410210d03 317 write_command(0x0012); // Sleep mode
ikon 2:456410210d03 318 write_data(0x08D9); // Page 49 of SSD2119 datasheet
ikon 2:456410210d03 319
ikon 2:456410210d03 320 // Gamma Control (R30h to R3Bh) -- Page 56 of SSD2119 datasheet
ikon 2:456410210d03 321 write_command(0x0030);
ikon 2:456410210d03 322 write_data(0x0000);
ikon 2:456410210d03 323
ikon 2:456410210d03 324 write_command(0x0031);
ikon 2:456410210d03 325 write_data(0x0104);
ikon 2:456410210d03 326
ikon 2:456410210d03 327 write_command(0x0032);
ikon 2:456410210d03 328 write_data(0x0100);
ikon 2:456410210d03 329
ikon 2:456410210d03 330 write_command(0x0033);
ikon 2:456410210d03 331 write_data(0x0305);
ikon 2:456410210d03 332
ikon 2:456410210d03 333 write_command(0x0034);
ikon 2:456410210d03 334 write_data(0x0505);
ikon 2:456410210d03 335
ikon 2:456410210d03 336 write_command(0x0035);
ikon 2:456410210d03 337 write_data(0x0305);
ikon 2:456410210d03 338
ikon 2:456410210d03 339 write_command(0x0036);
ikon 2:456410210d03 340 write_data(0x0707);
ikon 2:456410210d03 341
ikon 2:456410210d03 342 write_command(0x0037);
ikon 2:456410210d03 343 write_data(0x0300);
ikon 2:456410210d03 344
ikon 2:456410210d03 345 write_command(0x003A);
ikon 2:456410210d03 346 write_data(0x1200);
ikon 2:456410210d03 347
ikon 2:456410210d03 348 write_command(0x003B);
ikon 2:456410210d03 349 write_data(0x0800);
ikon 2:456410210d03 350
ikon 2:456410210d03 351 write_command(0x0007); // Display Control
ikon 2:456410210d03 352 write_data(0x0033); // Page 45 of SSD2119 datasheet
ikon 2:456410210d03 353
ikon 2:456410210d03 354 wait_ms(150);
ikon 2:456410210d03 355
ikon 2:456410210d03 356 write_command(0x0022); // RAM data write/read
ikon 2:456410210d03 357 }
ikon 2:456410210d03 358
ikon 2:456410210d03 359 /*************************************************/
ikon 2:456410210d03 360 void Display_Home() {
ikon 2:456410210d03 361 xx = 0;
ikon 2:456410210d03 362 yy = 0;
ikon 2:456410210d03 363 write_command(0x004E); // RAM address set
ikon 2:456410210d03 364 write_data(0x0000); // Page 58 of SSD2119 datasheet
ikon 2:456410210d03 365 write_command(0x004F); // RAM address set
ikon 2:456410210d03 366 write_data(0x0000); // Page 58 of SSD2119 datasheet
ikon 2:456410210d03 367
ikon 2:456410210d03 368 write_command(0x0044); // Vertical RAM address position
ikon 2:456410210d03 369 write_data(0xEF00); // Page 57 of SSD2119 datasheet
ikon 2:456410210d03 370 write_command(0x0045); // Horizontal RAM address position
ikon 2:456410210d03 371 write_data(0x0000); // Page 57 of SSD2119 datasheet
ikon 2:456410210d03 372 write_command(0x0046); // Horizontal RAM address position
ikon 2:456410210d03 373 write_data(0x013F); // Page 57 of SSD2119 datasheet
ikon 2:456410210d03 374
ikon 2:456410210d03 375 write_command(0x0022); // RAM data write/read
ikon 2:456410210d03 376 }
ikon 2:456410210d03 377
ikon 2:456410210d03 378
ikon 2:456410210d03 379 void display_rgb(unsigned int data) {
ikon 2:456410210d03 380 unsigned int i,j;
ikon 2:456410210d03 381 Display_Home();
ikon 2:456410210d03 382 for (i=0;i<HRES;i++) {
ikon 2:456410210d03 383 for (j=0;j<VRES;j++) {
ikon 2:456410210d03 384 write_data(data);
ikon 2:456410210d03 385 }
ikon 2:456410210d03 386 }
ikon 2:456410210d03 387 }
ikon 2:456410210d03 388
ikon 2:456410210d03 389 void LCD_test() {
ikon 2:456410210d03 390 //uint16_t i;
ikon 2:456410210d03 391 unsigned int i,j;
ikon 2:456410210d03 392 //bool b;
ikon 2:456410210d03 393 Display_Home();
ikon 2:456410210d03 394
ikon 2:456410210d03 395 printf("Disp home done.\n");
ikon 2:456410210d03 396 for (i=0; i<HRES;i++) {
ikon 2:456410210d03 397 //b = 0;
ikon 2:456410210d03 398 for (j=0;j<VRES;j++) {
ikon 2:456410210d03 399
ikon 2:456410210d03 400 /*
ikon 2:456410210d03 401 if (j < (VRES/2)) {
ikon 2:456410210d03 402 b = 0;
ikon 2:456410210d03 403 } else {
ikon 2:456410210d03 404 b = 1;
ikon 2:456410210d03 405 }
ikon 2:456410210d03 406 */
ikon 2:456410210d03 407 //if (j == 120) b=1;
ikon 2:456410210d03 408 //b=1;
ikon 2:456410210d03 409 if (i>279)write_data(BLACK);
ikon 2:456410210d03 410 else if (i>259) write_data(BLUE); //{ if (b) { write_data(BLUE); } else { write_data(HBLUE); } }
ikon 2:456410210d03 411 else if (i>239) write_data(HBLUE);
ikon 2:456410210d03 412 else if (i>219) write_data(RED); //{ if (b) { write_data(RED); } else { write_data(HRED); } }
ikon 2:456410210d03 413 else if (i>199) write_data(HRED);
ikon 2:456410210d03 414 else if (i>179) write_data(MAGENTA); //{ if (b) { write_data(MAGENTA); } else { write_data(HMAGENTA); } }
ikon 2:456410210d03 415 else if (i>159) write_data(HMAGENTA);
ikon 2:456410210d03 416 else if (i>139) write_data(GREEN); //{ if (b) { write_data(GREEN); } else { write_data(HGREEN); } }
ikon 2:456410210d03 417 else if (i>119) write_data(HGREEN);
ikon 2:456410210d03 418 else if (i>99) write_data(CYAN); //{ if (b) { write_data(CYAN); } else { write_data(HCYAN); } }
ikon 2:456410210d03 419 else if (i>79) write_data(HCYAN);
ikon 2:456410210d03 420 else if (i>59) write_data(YELLOW); //{ if (b) { write_data(YELLOW); } else { write_data(HYELLOW); } }
ikon 2:456410210d03 421 else if (i>39) write_data(HYELLOW);
ikon 2:456410210d03 422 else if (i>19) write_data(WHITE);
ikon 2:456410210d03 423 else write_data(HWHITE); //{ if (b) { write_data(WHITE); } else { write_data(HWHITE); } }
ikon 2:456410210d03 424 }
ikon 2:456410210d03 425 //printf("Col = %d\n",i);
ikon 2:456410210d03 426 }
ikon 2:456410210d03 427 }
ikon 2:456410210d03 428
ikon 2:456410210d03 429 void cls() {
ikon 2:456410210d03 430 // write_command(0x22);
ikon 2:456410210d03 431 display_rgb(WHITE);
ikon 2:456410210d03 432 }
ikon 2:456410210d03 433
ikon 2:456410210d03 434 // Show Spectrum screen on the display
ikon 2:456410210d03 435 unsigned char scr2lcd(char *scrfile) {
ikon 2:456410210d03 436 unsigned char a,ink,pap,pal;
ikon 2:456410210d03 437 uint16_t in=0,pa=7;
ikon 2:456410210d03 438 int c;
ikon 2:456410210d03 439 bool std=1;
ikon 2:456410210d03 440 unsigned int x,y,i,j,k,l,m;
ikon 2:456410210d03 441 unsigned char screen[6976];
ikon 2:456410210d03 442 uint16_t palette64[64];
ikon 2:456410210d03 443 char fullpath[30];
ikon 2:456410210d03 444
ikon 2:456410210d03 445 strcpy(fullpath,"/local/");
ikon 2:456410210d03 446 strcat(fullpath,scrfile);
ikon 2:456410210d03 447
ikon 2:456410210d03 448 printf("Opening File %s...\r\n",fullpath); // Drive should be marked as removed
ikon 2:456410210d03 449 FILE *fp = fopen(fullpath, "r");
ikon 2:456410210d03 450 if (!fp) {
ikon 2:456410210d03 451 printf("File %s could not be opened!\r\n",scrfile);
ikon 2:456410210d03 452 return(1);
ikon 2:456410210d03 453 }
ikon 2:456410210d03 454
ikon 2:456410210d03 455 //cls(); // Keep border, do not cls
ikon 2:456410210d03 456 Display_Home();
ikon 2:456410210d03 457 x=START_X;
ikon 2:456410210d03 458 y=START_Y;
ikon 2:456410210d03 459 LcdSetPenXY(x,y);
ikon 2:456410210d03 460
ikon 2:456410210d03 461 write_command(0x22);
ikon 2:456410210d03 462
ikon 2:456410210d03 463 i=0;
ikon 2:456410210d03 464 while ( ( ( c = fgetc(fp) ) != EOF ) && (i<6976) ) {
ikon 2:456410210d03 465 screen[i] = c;
ikon 2:456410210d03 466 i++;
ikon 2:456410210d03 467 }
ikon 2:456410210d03 468
ikon 2:456410210d03 469 // Non-stanard screen
ikon 2:456410210d03 470 if (i != 6912) {
ikon 2:456410210d03 471
ikon 2:456410210d03 472 printf("ULAplus or other format.\n");
ikon 2:456410210d03 473 // ULAplus screen
ikon 2:456410210d03 474 std=0;
ikon 2:456410210d03 475
ikon 2:456410210d03 476 for(i=0;i<64;i++) {
ikon 2:456410210d03 477 palette64[i] = palette256[screen[6912+i]];
ikon 2:456410210d03 478 }
ikon 2:456410210d03 479 } else
ikon 2:456410210d03 480 std = 1;
ikon 2:456410210d03 481
ikon 2:456410210d03 482 fclose(fp);
ikon 2:456410210d03 483 printf("Screen read done.\n");
ikon 2:456410210d03 484
ikon 2:456410210d03 485 for (j=0;j<3;j++) { // Screen "third"
ikon 2:456410210d03 486 for (i=0;i<8;i++) { // Line in third
ikon 2:456410210d03 487 for (k=0;k<8;k++) { // Microline
ikon 2:456410210d03 488 for (l=32;l>0;l--) { // Byte
ikon 2:456410210d03 489 c = screen[j * 2048 + k * 256 + i * 32 + (l-1)]; // Pixel byte
ikon 2:456410210d03 490 a = screen[6144 + j * 256 + i * 32 + (l-1)]; // Attr byte
ikon 2:456410210d03 491 if (std) { // Handle attributes as ULA
ikon 2:456410210d03 492 ink = a & 0x07;
ikon 2:456410210d03 493 pap = ( a >> 3 ) & 0x07;
ikon 2:456410210d03 494 if ( (a & 0x40) == 0x40 ) { // Bright1 - not for black (0)
ikon 2:456410210d03 495 if ( ink != 0 ) ink += 7;
ikon 2:456410210d03 496 if ( pap != 0 ) pap += 7;
ikon 2:456410210d03 497 }
ikon 2:456410210d03 498 } else { // Otherwise treat as ULA+
ikon 2:456410210d03 499 pal = a >> 6; // Palette suffix
ikon 2:456410210d03 500 ink = a & 0x07;
ikon 2:456410210d03 501 pap = ( a >> 3 ) & 0x07;
ikon 2:456410210d03 502 in = palette64[pal*16+ink];
ikon 2:456410210d03 503 pa = palette64[pal*16+8+pap];
ikon 2:456410210d03 504 }
ikon 2:456410210d03 505
ikon 2:456410210d03 506 for (m=0;m<8;m++) { // Pixel
ikon 2:456410210d03 507
ikon 2:456410210d03 508 if ( (c & 0x01) == 0x01 ) {
ikon 2:456410210d03 509 if (std)
ikon 2:456410210d03 510 write_data(colors[ink]);
ikon 2:456410210d03 511 else
ikon 2:456410210d03 512 write_data(in);
ikon 2:456410210d03 513 } else {
ikon 2:456410210d03 514 if (std)
ikon 2:456410210d03 515 write_data(colors[pap]);
ikon 2:456410210d03 516 else
ikon 2:456410210d03 517 write_data(pa);
ikon 2:456410210d03 518 }
ikon 2:456410210d03 519 c >>= 1;
ikon 2:456410210d03 520 }
ikon 2:456410210d03 521 }
ikon 2:456410210d03 522 y++;
ikon 2:456410210d03 523 x=START_X;
ikon 2:456410210d03 524 LcdSetPenXY(x,y);
ikon 2:456410210d03 525
ikon 2:456410210d03 526 }
ikon 2:456410210d03 527 }
ikon 2:456410210d03 528 }
ikon 2:456410210d03 529
ikon 2:456410210d03 530
ikon 2:456410210d03 531 return(0);
ikon 2:456410210d03 532 }
ikon 2:456410210d03 533
ikon 2:456410210d03 534 // List files on internal filesystem
ikon 2:456410210d03 535 void Dir() {
ikon 2:456410210d03 536 unsigned int i=0, y=2;
ikon 2:456410210d03 537 char str[40];
ikon 2:456410210d03 538
ikon 2:456410210d03 539 DIR *d = opendir("/local"); // Opens the root directory of the local file system
ikon 2:456410210d03 540 struct dirent *p;
ikon 2:456410210d03 541 while ((p = readdir(d)) != NULL) { // Print the names of the files in the local file system
ikon 2:456410210d03 542 //sprintf(str, "%s\n", p->d_name); // to stdout.
ikon 2:456410210d03 543 LcdStr(p->d_name);
ikon 2:456410210d03 544 // LcdStr(p->filesize);
ikon 2:456410210d03 545 y++;
ikon 2:456410210d03 546 LcdGotoXY(0,y);
ikon 2:456410210d03 547 if ( strstr(p->d_name,".SCR") != NULL) {
ikon 2:456410210d03 548 i++;
ikon 2:456410210d03 549 }
ikon 2:456410210d03 550 }
ikon 2:456410210d03 551 closedir(d);
ikon 2:456410210d03 552 sprintf(str, "%d SCR files found!",i);
ikon 2:456410210d03 553 LcdStr(str);
ikon 2:456410210d03 554 }
ikon 2:456410210d03 555
ikon 2:456410210d03 556 // Slideshow - show all SCR files from mbed FS
ikon 2:456410210d03 557 void SldShw() {
ikon 2:456410210d03 558 DIR *d = opendir("/local"); // Opens the root directory of the local file system
ikon 2:456410210d03 559 struct dirent *p;
ikon 2:456410210d03 560 while ((p = readdir(d)) != NULL) { // Print the names of the files in the local file system
ikon 2:456410210d03 561 if ( strstr(p->d_name,".SCR") != NULL) {
ikon 2:456410210d03 562 scr2lcd(p->d_name); // Display SCR files from listing
ikon 2:456410210d03 563 wait(3.0);
ikon 2:456410210d03 564 }
ikon 2:456410210d03 565 }
ikon 2:456410210d03 566 closedir(d);
ikon 2:456410210d03 567 }
ikon 2:456410210d03 568
ikon 2:456410210d03 569 // Show 256 color palette on the display
ikon 2:456410210d03 570 void ShowPalette256() {
ikon 2:456410210d03 571 uint16_t r,g,b,x,y,c;
ikon 2:456410210d03 572 uint16_t dr,dg,db,d; // Display data
ikon 2:456410210d03 573
ikon 2:456410210d03 574 cls();
ikon 2:456410210d03 575 // LcdSetPenXY(0,0);
ikon 2:456410210d03 576
ikon 2:456410210d03 577 for (r=0;r<8;r++) {
ikon 2:456410210d03 578 dr = r*36;
ikon 2:456410210d03 579 dr <<= 8;
ikon 2:456410210d03 580 dr &= 0xF800;
ikon 2:456410210d03 581 for (g=0;g<8;g++) {
ikon 2:456410210d03 582 dg = g*36;
ikon 2:456410210d03 583 dg <<= 3;
ikon 2:456410210d03 584 dg &= 0x07E0;
ikon 2:456410210d03 585
ikon 2:456410210d03 586 for (b=0;b<4;b++) {
ikon 2:456410210d03 587 // Color calculation
ikon 2:456410210d03 588 db = b*85;
ikon 2:456410210d03 589 db >>= 3;
ikon 2:456410210d03 590 db &= 0x001F;
ikon 2:456410210d03 591
ikon 2:456410210d03 592 d = dr | dg | db;
ikon 2:456410210d03 593
ikon 2:456410210d03 594 // printf("%d\n",d); // Debug palette print
ikon 2:456410210d03 595 c = 32*g + 4*r + b;
ikon 2:456410210d03 596 palette256[c] = d;
ikon 2:456410210d03 597
ikon 2:456410210d03 598 for (y=0;y<8;y++) {
ikon 2:456410210d03 599 LcdSetPenXY(248-(8*(r*4+b)), (8*g)+y);
ikon 2:456410210d03 600 write_command(0x22);
ikon 2:456410210d03 601
ikon 2:456410210d03 602 for (x=0;x<8;x++) {
ikon 2:456410210d03 603 write_data(d);
ikon 2:456410210d03 604 } // endfor x
ikon 2:456410210d03 605
ikon 2:456410210d03 606 } // endfor y
ikon 2:456410210d03 607
ikon 2:456410210d03 608 } // endfor b
ikon 2:456410210d03 609 } // endfor g
ikon 2:456410210d03 610 } // endfor b
ikon 2:456410210d03 611
ikon 2:456410210d03 612 } // end function ShowPalette
ikon 2:456410210d03 613
ikon 2:456410210d03 614 // Terminal emulator
ikon 2:456410210d03 615