Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: EthernetNetIf mbed
main.cpp@0:d6b0747774da, 2010-11-29 (annotated)
- Committer:
- ikon
- Date:
- Mon Nov 29 22:25:48 2010 +0000
- Revision:
- 0:d6b0747774da
- Child:
- 1:c9dad7bc0795
0.1
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
ikon | 0:d6b0747774da | 1 | // ********************************************************************* |
ikon | 0:d6b0747774da | 2 | // |
ikon | 0:d6b0747774da | 3 | // Display driver for Solomon SSD2119 controller connected to mbed board |
ikon | 0:d6b0747774da | 4 | // with simple terminal program |
ikon | 0:d6b0747774da | 5 | // |
ikon | 0:d6b0747774da | 6 | // ** szdiditalsquare (eBay) display connected on SPI + control pins ** |
ikon | 0:d6b0747774da | 7 | // mbed SSD2219 (on szdigitalsquare board) |
ikon | 0:d6b0747774da | 8 | // p5 -mosi (28) SDA |
ikon | 0:d6b0747774da | 9 | // p6 -miso NC |
ikon | 0:d6b0747774da | 10 | // p7 -sck (26) SCL |
ikon | 0:d6b0747774da | 11 | // p8 -cs (19) CS |
ikon | 0:d6b0747774da | 12 | // p15-res (23) RESET |
ikon | 0:d6b0747774da | 13 | // p16-c/d (20) RS |
ikon | 0:d6b0747774da | 14 | // p17-rd (22) RD |
ikon | 0:d6b0747774da | 15 | // p18-wr (21) WR |
ikon | 0:d6b0747774da | 16 | // |
ikon | 0:d6b0747774da | 17 | // Pins PS0 - PS3 should be open on system board = 4bit SPI mode |
ikon | 0:d6b0747774da | 18 | // |
ikon | 0:d6b0747774da | 19 | // After sucessful init you'll see color bars on whole display and |
ikon | 0:d6b0747774da | 20 | // welcome message. Then you can start typing in your serial terminal |
ikon | 0:d6b0747774da | 21 | // and information will appear on the display |
ikon | 0:d6b0747774da | 22 | // |
ikon | 0:d6b0747774da | 23 | // 28.11.2010 port from CrystalFonts & Nokia LCD lib by Imrich Konkol |
ikon | 0:d6b0747774da | 24 | // 29.11.2010 ZX Spectrum SCR viewer added |
ikon | 0:d6b0747774da | 25 | // - to show test.scr from internal mbed drive type \\ at |
ikon | 0:d6b0747774da | 26 | // PC terminal prompt |
ikon | 0:d6b0747774da | 27 | // ********************************************************************* |
ikon | 0:d6b0747774da | 28 | #include "mbed.h" |
ikon | 0:d6b0747774da | 29 | |
ikon | 0:d6b0747774da | 30 | |
ikon | 0:d6b0747774da | 31 | // color definitions (H = half) |
ikon | 0:d6b0747774da | 32 | #define BLACK 0x0000 |
ikon | 0:d6b0747774da | 33 | #define HBLUE 0x0010 |
ikon | 0:d6b0747774da | 34 | #define BLUE 0x001F |
ikon | 0:d6b0747774da | 35 | #define HRED 0x8000 |
ikon | 0:d6b0747774da | 36 | #define RED 0xF800 |
ikon | 0:d6b0747774da | 37 | #define HGREEN 0x0400 |
ikon | 0:d6b0747774da | 38 | #define GREEN 0x07E0 |
ikon | 0:d6b0747774da | 39 | #define HCYAN 0x0410 |
ikon | 0:d6b0747774da | 40 | #define CYAN 0x07FF |
ikon | 0:d6b0747774da | 41 | #define HMAGENTA 0x8010 |
ikon | 0:d6b0747774da | 42 | #define MAGENTA 0xF81F |
ikon | 0:d6b0747774da | 43 | #define HYELLOW 0x8400 |
ikon | 0:d6b0747774da | 44 | #define YELLOW 0xFFE0 |
ikon | 0:d6b0747774da | 45 | #define HWHITE 0x8410 |
ikon | 0:d6b0747774da | 46 | #define WHITE 0xFFFF |
ikon | 0:d6b0747774da | 47 | |
ikon | 0:d6b0747774da | 48 | // Define Spectrum colors |
ikon | 0:d6b0747774da | 49 | static const uint16_t colors [15] = { |
ikon | 0:d6b0747774da | 50 | BLACK,HBLUE,HRED,HMAGENTA,HGREEN,HCYAN,HYELLOW,HWHITE,BLUE,RED,MAGENTA,GREEN,CYAN,YELLOW,WHITE |
ikon | 0:d6b0747774da | 51 | }; |
ikon | 0:d6b0747774da | 52 | |
ikon | 0:d6b0747774da | 53 | #define HRES 320 // X axis # of pixels |
ikon | 0:d6b0747774da | 54 | #define VRES 240 // Y axis # of pixels |
ikon | 0:d6b0747774da | 55 | |
ikon | 0:d6b0747774da | 56 | #define START_X 31 |
ikon | 0:d6b0747774da | 57 | #define START_Y 23 |
ikon | 0:d6b0747774da | 58 | |
ikon | 0:d6b0747774da | 59 | LocalFileSystem local("local"); |
ikon | 0:d6b0747774da | 60 | |
ikon | 0:d6b0747774da | 61 | SPI spi(p5, p6, p7); // mosi, miso, sclk |
ikon | 0:d6b0747774da | 62 | DigitalOut DCS(p8); // Display chip select |
ikon | 0:d6b0747774da | 63 | DigitalOut DRS(p15); // Display reset |
ikon | 0:d6b0747774da | 64 | DigitalOut DCD(p16); // Display command/data |
ikon | 0:d6b0747774da | 65 | DigitalOut DRD(p17); // Display read |
ikon | 0:d6b0747774da | 66 | DigitalOut DWR(p18); // Display write |
ikon | 0:d6b0747774da | 67 | |
ikon | 0:d6b0747774da | 68 | DigitalOut myled(LED1); |
ikon | 0:d6b0747774da | 69 | |
ikon | 0:d6b0747774da | 70 | |
ikon | 0:d6b0747774da | 71 | Serial pc(USBTX, USBRX); //debug info - see raw data being transferred back and forth as GBA is booting |
ikon | 0:d6b0747774da | 72 | |
ikon | 0:d6b0747774da | 73 | #define LCD_CACHE_SIZE 5 |
ikon | 0:d6b0747774da | 74 | /*----------------------------------------------------------------------------- |
ikon | 0:d6b0747774da | 75 | Global Variables |
ikon | 0:d6b0747774da | 76 | -----------------------------------------------------------------------------*/ |
ikon | 0:d6b0747774da | 77 | //static uint8_t LcdCache [ LCD_CACHE_SIZE ]; |
ikon | 0:d6b0747774da | 78 | |
ikon | 0:d6b0747774da | 79 | //static int LcdCacheIdx; |
ikon | 0:d6b0747774da | 80 | //static int LoWaterMark; |
ikon | 0:d6b0747774da | 81 | //static int HiWaterMark; |
ikon | 0:d6b0747774da | 82 | static uint16_t yy=0; |
ikon | 0:d6b0747774da | 83 | static uint16_t xx=0; |
ikon | 0:d6b0747774da | 84 | |
ikon | 0:d6b0747774da | 85 | // Essential display commands |
ikon | 0:d6b0747774da | 86 | /*************************************************/ |
ikon | 0:d6b0747774da | 87 | void write_command(uint16_t command) { |
ikon | 0:d6b0747774da | 88 | uint8_t raw; |
ikon | 0:d6b0747774da | 89 | |
ikon | 0:d6b0747774da | 90 | DRD = 1; |
ikon | 0:d6b0747774da | 91 | DCS = 0; |
ikon | 0:d6b0747774da | 92 | DCD = 0; |
ikon | 0:d6b0747774da | 93 | |
ikon | 0:d6b0747774da | 94 | raw = command; |
ikon | 0:d6b0747774da | 95 | //raw &= 0x00FF; // Keep bit9 low - means command |
ikon | 0:d6b0747774da | 96 | //printf("Raw data: %d\n",raw); |
ikon | 0:d6b0747774da | 97 | spi.write(raw); |
ikon | 0:d6b0747774da | 98 | |
ikon | 0:d6b0747774da | 99 | DWR = 1; |
ikon | 0:d6b0747774da | 100 | DCS = 1; |
ikon | 0:d6b0747774da | 101 | } |
ikon | 0:d6b0747774da | 102 | |
ikon | 0:d6b0747774da | 103 | /*************************************************/ |
ikon | 0:d6b0747774da | 104 | |
ikon | 0:d6b0747774da | 105 | //typedef unsigned char u8; |
ikon | 0:d6b0747774da | 106 | //typedef unsigned int u16; |
ikon | 0:d6b0747774da | 107 | void write_data(uint16_t value) { |
ikon | 0:d6b0747774da | 108 | uint8_t raw; |
ikon | 0:d6b0747774da | 109 | |
ikon | 0:d6b0747774da | 110 | DRD = 1; |
ikon | 0:d6b0747774da | 111 | DCD = 1; |
ikon | 0:d6b0747774da | 112 | DCS = 0; |
ikon | 0:d6b0747774da | 113 | |
ikon | 0:d6b0747774da | 114 | raw = (value)>>8; |
ikon | 0:d6b0747774da | 115 | // raw &= 0x00FF; // Keep bit9 high - means data |
ikon | 0:d6b0747774da | 116 | // raw |= 0x0100; |
ikon | 0:d6b0747774da | 117 | // printf("Raw data: %d\n",raw); |
ikon | 0:d6b0747774da | 118 | spi.write(raw); |
ikon | 0:d6b0747774da | 119 | |
ikon | 0:d6b0747774da | 120 | DCS = 1; |
ikon | 0:d6b0747774da | 121 | //wait_ms(1); |
ikon | 0:d6b0747774da | 122 | DCS = 0; |
ikon | 0:d6b0747774da | 123 | |
ikon | 0:d6b0747774da | 124 | raw = value; |
ikon | 0:d6b0747774da | 125 | // raw &= 0x00FF; // Keep bit9 high - means data |
ikon | 0:d6b0747774da | 126 | // raw |= 0x0100; |
ikon | 0:d6b0747774da | 127 | // printf("Raw data: %d\n",raw); |
ikon | 0:d6b0747774da | 128 | spi.write(raw); |
ikon | 0:d6b0747774da | 129 | |
ikon | 0:d6b0747774da | 130 | DCS = 1; |
ikon | 0:d6b0747774da | 131 | } |
ikon | 0:d6b0747774da | 132 | |
ikon | 0:d6b0747774da | 133 | |
ikon | 0:d6b0747774da | 134 | // Font generator |
ikon | 0:d6b0747774da | 135 | /*----------------------------------------------------------------------------- |
ikon | 0:d6b0747774da | 136 | Character generator |
ikon | 0:d6b0747774da | 137 | |
ikon | 0:d6b0747774da | 138 | This table defines the standard ASCII characters in a 5x7 dot format. |
ikon | 0:d6b0747774da | 139 | -----------------------------------------------------------------------------*/ |
ikon | 0:d6b0747774da | 140 | static const uint8_t FontLookup [][5] = { |
ikon | 0:d6b0747774da | 141 | { 0x00, 0x00, 0x00, 0x00, 0x00 }, // sp |
ikon | 0:d6b0747774da | 142 | { 0x00, 0x00, 0x2f, 0x00, 0x00 }, // ! |
ikon | 0:d6b0747774da | 143 | { 0x00, 0x07, 0x00, 0x07, 0x00 }, // " |
ikon | 0:d6b0747774da | 144 | { 0x14, 0x7f, 0x14, 0x7f, 0x14 }, // # |
ikon | 0:d6b0747774da | 145 | { 0x24, 0x2a, 0x7f, 0x2a, 0x12 }, // $ |
ikon | 0:d6b0747774da | 146 | { 0xc4, 0xc8, 0x10, 0x26, 0x46 }, // % |
ikon | 0:d6b0747774da | 147 | { 0x36, 0x49, 0x55, 0x22, 0x50 }, // & |
ikon | 0:d6b0747774da | 148 | { 0x00, 0x05, 0x03, 0x00, 0x00 }, // ' |
ikon | 0:d6b0747774da | 149 | { 0x00, 0x1c, 0x22, 0x41, 0x00 }, // ( |
ikon | 0:d6b0747774da | 150 | { 0x00, 0x41, 0x22, 0x1c, 0x00 }, // ) |
ikon | 0:d6b0747774da | 151 | { 0x14, 0x08, 0x3E, 0x08, 0x14 }, // * |
ikon | 0:d6b0747774da | 152 | { 0x08, 0x08, 0x3E, 0x08, 0x08 }, // + |
ikon | 0:d6b0747774da | 153 | { 0x00, 0x00, 0x50, 0x30, 0x00 }, // , |
ikon | 0:d6b0747774da | 154 | { 0x10, 0x10, 0x10, 0x10, 0x10 }, // - |
ikon | 0:d6b0747774da | 155 | { 0x00, 0x60, 0x60, 0x00, 0x00 }, // . |
ikon | 0:d6b0747774da | 156 | { 0x20, 0x10, 0x08, 0x04, 0x02 }, // / |
ikon | 0:d6b0747774da | 157 | { 0x3E, 0x51, 0x49, 0x45, 0x3E }, // 0 |
ikon | 0:d6b0747774da | 158 | { 0x00, 0x42, 0x7F, 0x40, 0x00 }, // 1 |
ikon | 0:d6b0747774da | 159 | { 0x42, 0x61, 0x51, 0x49, 0x46 }, // 2 |
ikon | 0:d6b0747774da | 160 | { 0x21, 0x41, 0x45, 0x4B, 0x31 }, // 3 |
ikon | 0:d6b0747774da | 161 | { 0x18, 0x14, 0x12, 0x7F, 0x10 }, // 4 |
ikon | 0:d6b0747774da | 162 | { 0x27, 0x45, 0x45, 0x45, 0x39 }, // 5 |
ikon | 0:d6b0747774da | 163 | { 0x3C, 0x4A, 0x49, 0x49, 0x30 }, // 6 |
ikon | 0:d6b0747774da | 164 | { 0x01, 0x71, 0x09, 0x05, 0x03 }, // 7 |
ikon | 0:d6b0747774da | 165 | { 0x36, 0x49, 0x49, 0x49, 0x36 }, // 8 |
ikon | 0:d6b0747774da | 166 | { 0x06, 0x49, 0x49, 0x29, 0x1E }, // 9 |
ikon | 0:d6b0747774da | 167 | { 0x00, 0x36, 0x36, 0x00, 0x00 }, // : |
ikon | 0:d6b0747774da | 168 | { 0x00, 0x56, 0x36, 0x00, 0x00 }, // ; |
ikon | 0:d6b0747774da | 169 | { 0x08, 0x14, 0x22, 0x41, 0x00 }, // < |
ikon | 0:d6b0747774da | 170 | { 0x14, 0x14, 0x14, 0x14, 0x14 }, // = |
ikon | 0:d6b0747774da | 171 | { 0x00, 0x41, 0x22, 0x14, 0x08 }, // > |
ikon | 0:d6b0747774da | 172 | { 0x02, 0x01, 0x51, 0x09, 0x06 }, // ? |
ikon | 0:d6b0747774da | 173 | { 0x32, 0x49, 0x59, 0x51, 0x3E }, // @ |
ikon | 0:d6b0747774da | 174 | { 0x7E, 0x11, 0x11, 0x11, 0x7E }, // A |
ikon | 0:d6b0747774da | 175 | { 0x7F, 0x49, 0x49, 0x49, 0x36 }, // B |
ikon | 0:d6b0747774da | 176 | { 0x3E, 0x41, 0x41, 0x41, 0x22 }, // C |
ikon | 0:d6b0747774da | 177 | { 0x7F, 0x41, 0x41, 0x22, 0x1C }, // D |
ikon | 0:d6b0747774da | 178 | { 0x7F, 0x49, 0x49, 0x49, 0x41 }, // E |
ikon | 0:d6b0747774da | 179 | { 0x7F, 0x09, 0x09, 0x09, 0x01 }, // F |
ikon | 0:d6b0747774da | 180 | { 0x3E, 0x41, 0x49, 0x49, 0x7A }, // G |
ikon | 0:d6b0747774da | 181 | { 0x7F, 0x08, 0x08, 0x08, 0x7F }, // H |
ikon | 0:d6b0747774da | 182 | { 0x00, 0x41, 0x7F, 0x41, 0x00 }, // I |
ikon | 0:d6b0747774da | 183 | { 0x20, 0x40, 0x41, 0x3F, 0x01 }, // J |
ikon | 0:d6b0747774da | 184 | { 0x7F, 0x08, 0x14, 0x22, 0x41 }, // K |
ikon | 0:d6b0747774da | 185 | { 0x7F, 0x40, 0x40, 0x40, 0x40 }, // L |
ikon | 0:d6b0747774da | 186 | { 0x7F, 0x02, 0x0C, 0x02, 0x7F }, // M |
ikon | 0:d6b0747774da | 187 | { 0x7F, 0x04, 0x08, 0x10, 0x7F }, // N |
ikon | 0:d6b0747774da | 188 | { 0x3E, 0x41, 0x41, 0x41, 0x3E }, // O |
ikon | 0:d6b0747774da | 189 | { 0x7F, 0x09, 0x09, 0x09, 0x06 }, // P |
ikon | 0:d6b0747774da | 190 | { 0x3E, 0x41, 0x51, 0x21, 0x5E }, // Q |
ikon | 0:d6b0747774da | 191 | { 0x7F, 0x09, 0x19, 0x29, 0x46 }, // R |
ikon | 0:d6b0747774da | 192 | { 0x46, 0x49, 0x49, 0x49, 0x31 }, // S |
ikon | 0:d6b0747774da | 193 | { 0x01, 0x01, 0x7F, 0x01, 0x01 }, // T |
ikon | 0:d6b0747774da | 194 | { 0x3F, 0x40, 0x40, 0x40, 0x3F }, // U |
ikon | 0:d6b0747774da | 195 | { 0x1F, 0x20, 0x40, 0x20, 0x1F }, // V |
ikon | 0:d6b0747774da | 196 | { 0x3F, 0x40, 0x38, 0x40, 0x3F }, // W |
ikon | 0:d6b0747774da | 197 | { 0x63, 0x14, 0x08, 0x14, 0x63 }, // X |
ikon | 0:d6b0747774da | 198 | { 0x07, 0x08, 0x70, 0x08, 0x07 }, // Y |
ikon | 0:d6b0747774da | 199 | { 0x61, 0x51, 0x49, 0x45, 0x43 }, // Z |
ikon | 0:d6b0747774da | 200 | { 0x00, 0x7F, 0x41, 0x41, 0x00 }, // [ |
ikon | 0:d6b0747774da | 201 | { 0x00, 0x06, 0x18, 0x60, 0x00 }, // backslash |
ikon | 0:d6b0747774da | 202 | { 0x00, 0x41, 0x41, 0x7F, 0x00 }, // ] |
ikon | 0:d6b0747774da | 203 | { 0x04, 0x02, 0x01, 0x02, 0x04 }, // ^ |
ikon | 0:d6b0747774da | 204 | { 0x40, 0x40, 0x40, 0x40, 0x40 }, // _ |
ikon | 0:d6b0747774da | 205 | { 0x00, 0x01, 0x02, 0x04, 0x00 }, // ' |
ikon | 0:d6b0747774da | 206 | { 0x20, 0x54, 0x54, 0x54, 0x78 }, // a |
ikon | 0:d6b0747774da | 207 | { 0x7F, 0x48, 0x44, 0x44, 0x38 }, // b |
ikon | 0:d6b0747774da | 208 | { 0x38, 0x44, 0x44, 0x44, 0x20 }, // c |
ikon | 0:d6b0747774da | 209 | { 0x38, 0x44, 0x44, 0x48, 0x7F }, // d |
ikon | 0:d6b0747774da | 210 | { 0x38, 0x54, 0x54, 0x54, 0x18 }, // e |
ikon | 0:d6b0747774da | 211 | { 0x08, 0x7E, 0x09, 0x01, 0x02 }, // f |
ikon | 0:d6b0747774da | 212 | { 0x0C, 0x52, 0x52, 0x52, 0x3E }, // g |
ikon | 0:d6b0747774da | 213 | { 0x7F, 0x08, 0x04, 0x04, 0x78 }, // h |
ikon | 0:d6b0747774da | 214 | { 0x00, 0x44, 0x7D, 0x40, 0x00 }, // i |
ikon | 0:d6b0747774da | 215 | { 0x20, 0x40, 0x44, 0x3D, 0x00 }, // j |
ikon | 0:d6b0747774da | 216 | { 0x7F, 0x10, 0x28, 0x44, 0x00 }, // k |
ikon | 0:d6b0747774da | 217 | { 0x00, 0x41, 0x7F, 0x40, 0x00 }, // l |
ikon | 0:d6b0747774da | 218 | { 0x7C, 0x04, 0x18, 0x04, 0x78 }, // m |
ikon | 0:d6b0747774da | 219 | { 0x7C, 0x08, 0x04, 0x04, 0x78 }, // n |
ikon | 0:d6b0747774da | 220 | { 0x38, 0x44, 0x44, 0x44, 0x38 }, // o |
ikon | 0:d6b0747774da | 221 | { 0x7C, 0x14, 0x14, 0x14, 0x08 }, // p |
ikon | 0:d6b0747774da | 222 | { 0x08, 0x14, 0x14, 0x18, 0x7C }, // q |
ikon | 0:d6b0747774da | 223 | { 0x7C, 0x08, 0x04, 0x04, 0x08 }, // r |
ikon | 0:d6b0747774da | 224 | { 0x48, 0x54, 0x54, 0x54, 0x20 }, // s |
ikon | 0:d6b0747774da | 225 | { 0x04, 0x3F, 0x44, 0x40, 0x20 }, // t |
ikon | 0:d6b0747774da | 226 | { 0x3C, 0x40, 0x40, 0x20, 0x7C }, // u |
ikon | 0:d6b0747774da | 227 | { 0x1C, 0x20, 0x40, 0x20, 0x1C }, // v |
ikon | 0:d6b0747774da | 228 | { 0x3C, 0x40, 0x30, 0x40, 0x3C }, // w |
ikon | 0:d6b0747774da | 229 | { 0x44, 0x28, 0x10, 0x28, 0x44 }, // x |
ikon | 0:d6b0747774da | 230 | { 0x0C, 0x50, 0x50, 0x50, 0x3C }, // y |
ikon | 0:d6b0747774da | 231 | { 0x44, 0x64, 0x54, 0x4C, 0x44 }, // z |
ikon | 0:d6b0747774da | 232 | { 0x08, 0x36, 0x41, 0x41, 0x00 }, // { |
ikon | 0:d6b0747774da | 233 | { 0x00, 0x00, 0x7F, 0x00, 0x00 }, // | |
ikon | 0:d6b0747774da | 234 | { 0x00, 0x41, 0x41, 0x36, 0x08 }, // } |
ikon | 0:d6b0747774da | 235 | { 0x01, 0x02, 0x01, 0x02, 0x00 }, // ~ |
ikon | 0:d6b0747774da | 236 | { 0x3E, 0x5D, 0x55, 0x55, 0x3E }, // (c) |
ikon | 0:d6b0747774da | 237 | { 0x55, 0x2A, 0x55, 0x2A, 0x55 } // 55 |
ikon | 0:d6b0747774da | 238 | }; |
ikon | 0:d6b0747774da | 239 | |
ikon | 0:d6b0747774da | 240 | // Set X & Y axis of next pixel write |
ikon | 0:d6b0747774da | 241 | void LcdSetPenXY(uint16_t x, uint16_t y) { |
ikon | 0:d6b0747774da | 242 | write_command(0x004F); // RAM address set for Y axis |
ikon | 0:d6b0747774da | 243 | write_data(y); // Page 58 of SSD2119 datasheet |
ikon | 0:d6b0747774da | 244 | write_command(0x004E); // RAM address set for X axis |
ikon | 0:d6b0747774da | 245 | write_data(x); // Page 58 of SSD2119 datasheet |
ikon | 0:d6b0747774da | 246 | write_command(0x0022); // Return back to pixel write mode |
ikon | 0:d6b0747774da | 247 | } |
ikon | 0:d6b0747774da | 248 | |
ikon | 0:d6b0747774da | 249 | |
ikon | 0:d6b0747774da | 250 | /*----------------------------------------------------------------------------- |
ikon | 0:d6b0747774da | 251 | Name : LcdGotoXY |
ikon | 0:d6b0747774da | 252 | Description : Sets cursor location to xy location corresponding to basic |
ikon | 0:d6b0747774da | 253 | font size. |
ikon | 0:d6b0747774da | 254 | Argument(s) : x, y -> Coordinate for new cursor position. Range: 1,1..14,6 |
ikon | 0:d6b0747774da | 255 | Return value : None. |
ikon | 0:d6b0747774da | 256 | -----------------------------------------------------------------------------*/ |
ikon | 0:d6b0747774da | 257 | void LcdGotoXY ( uint8_t x, uint8_t y ) { |
ikon | 0:d6b0747774da | 258 | // uint16_t xx, yy; |
ikon | 0:d6b0747774da | 259 | xx = y * 8; |
ikon | 0:d6b0747774da | 260 | yy = x * 6; |
ikon | 0:d6b0747774da | 261 | //LcdCacheIdx = (x - 1) * HRES + (y - 1) * VRES; |
ikon | 0:d6b0747774da | 262 | LcdSetPenXY(xx,yy); |
ikon | 0:d6b0747774da | 263 | } |
ikon | 0:d6b0747774da | 264 | |
ikon | 0:d6b0747774da | 265 | typedef enum { |
ikon | 0:d6b0747774da | 266 | FONT_1X = 1, |
ikon | 0:d6b0747774da | 267 | FONT_2X = 2 |
ikon | 0:d6b0747774da | 268 | |
ikon | 0:d6b0747774da | 269 | } LcdFontSize; |
ikon | 0:d6b0747774da | 270 | |
ikon | 0:d6b0747774da | 271 | typedef enum { |
ikon | 0:d6b0747774da | 272 | PIXEL_OFF = 0, |
ikon | 0:d6b0747774da | 273 | PIXEL_ON = 1, |
ikon | 0:d6b0747774da | 274 | PIXEL_XOR = 2 |
ikon | 0:d6b0747774da | 275 | |
ikon | 0:d6b0747774da | 276 | } LcdPixelMode; |
ikon | 0:d6b0747774da | 277 | |
ikon | 0:d6b0747774da | 278 | /*----------------------------------------------------------------------------- |
ikon | 0:d6b0747774da | 279 | Name : LcdChr |
ikon | 0:d6b0747774da | 280 | Description : Displays a character at current cursor location |
ikon | 0:d6b0747774da | 281 | and increment cursor location. |
ikon | 0:d6b0747774da | 282 | Argument(s) : size -> Font size. See enum. |
ikon | 0:d6b0747774da | 283 | ch -> Character to write. |
ikon | 0:d6b0747774da | 284 | Return value : None. |
ikon | 0:d6b0747774da | 285 | -----------------------------------------------------------------------------*/ |
ikon | 0:d6b0747774da | 286 | void LcdChr ( uint8_t ch ) { |
ikon | 0:d6b0747774da | 287 | uint8_t i, j, c; |
ikon | 0:d6b0747774da | 288 | |
ikon | 0:d6b0747774da | 289 | if ( (ch < 0x20) || (ch > 0x7F) ) { |
ikon | 0:d6b0747774da | 290 | // Convert to a printable character. |
ikon | 0:d6b0747774da | 291 | ch = 0x80; |
ikon | 0:d6b0747774da | 292 | } |
ikon | 0:d6b0747774da | 293 | |
ikon | 0:d6b0747774da | 294 | //write_command(0x0022); |
ikon | 0:d6b0747774da | 295 | |
ikon | 0:d6b0747774da | 296 | for ( i = 0; i < 6; i++ ) { |
ikon | 0:d6b0747774da | 297 | if (i < 5) { |
ikon | 0:d6b0747774da | 298 | c = FontLookup[ch - 32][i]; |
ikon | 0:d6b0747774da | 299 | } else { |
ikon | 0:d6b0747774da | 300 | c = 0x00; // Space after each character |
ikon | 0:d6b0747774da | 301 | } |
ikon | 0:d6b0747774da | 302 | |
ikon | 0:d6b0747774da | 303 | for ( j = 0; j < 8; j++ ) { |
ikon | 0:d6b0747774da | 304 | if ( (c & 0x01) == 0x01 ) { |
ikon | 0:d6b0747774da | 305 | //printf("X"); |
ikon | 0:d6b0747774da | 306 | write_data(BLACK); |
ikon | 0:d6b0747774da | 307 | } else { |
ikon | 0:d6b0747774da | 308 | //printf("."); |
ikon | 0:d6b0747774da | 309 | write_data(WHITE); |
ikon | 0:d6b0747774da | 310 | } |
ikon | 0:d6b0747774da | 311 | //printf("\n"); |
ikon | 0:d6b0747774da | 312 | c >>= 1; |
ikon | 0:d6b0747774da | 313 | } |
ikon | 0:d6b0747774da | 314 | yy++; |
ikon | 0:d6b0747774da | 315 | write_command(0x004F); // RAM address set for Y axis |
ikon | 0:d6b0747774da | 316 | write_data(yy); // Page 58 of SSD2119 datasheet |
ikon | 0:d6b0747774da | 317 | write_command(0x0022); |
ikon | 0:d6b0747774da | 318 | } |
ikon | 0:d6b0747774da | 319 | } |
ikon | 0:d6b0747774da | 320 | |
ikon | 0:d6b0747774da | 321 | /*----------------------------------------------------------------------------- |
ikon | 0:d6b0747774da | 322 | Name : LcdStr |
ikon | 0:d6b0747774da | 323 | Description : Displays a character at current cursor location and increment |
ikon | 0:d6b0747774da | 324 | cursor location according to font size. |
ikon | 0:d6b0747774da | 325 | Argument(s) : size -> Font size. See enum. |
ikon | 0:d6b0747774da | 326 | dataPtr -> Pointer to null terminated ASCII string to display. |
ikon | 0:d6b0747774da | 327 | Return value : None. |
ikon | 0:d6b0747774da | 328 | -----------------------------------------------------------------------------*/ |
ikon | 0:d6b0747774da | 329 | void LcdStr ( char *dataPtr ) { |
ikon | 0:d6b0747774da | 330 | while ( *dataPtr ) { |
ikon | 0:d6b0747774da | 331 | LcdChr( *dataPtr++ ); |
ikon | 0:d6b0747774da | 332 | } |
ikon | 0:d6b0747774da | 333 | } |
ikon | 0:d6b0747774da | 334 | |
ikon | 0:d6b0747774da | 335 | |
ikon | 0:d6b0747774da | 336 | /*************************************************/ |
ikon | 0:d6b0747774da | 337 | void initialization() { |
ikon | 0:d6b0747774da | 338 | /* |
ikon | 0:d6b0747774da | 339 | SET_RD; |
ikon | 0:d6b0747774da | 340 | SET_WR; |
ikon | 0:d6b0747774da | 341 | SET_CS; |
ikon | 0:d6b0747774da | 342 | SET_CD; |
ikon | 0:d6b0747774da | 343 | PORTA=0x00; |
ikon | 0:d6b0747774da | 344 | PORTE=0x00; |
ikon | 0:d6b0747774da | 345 | |
ikon | 0:d6b0747774da | 346 | CLR_RESET; |
ikon | 0:d6b0747774da | 347 | delay(200); |
ikon | 0:d6b0747774da | 348 | SET_RESET; |
ikon | 0:d6b0747774da | 349 | delay(500); |
ikon | 0:d6b0747774da | 350 | */ |
ikon | 0:d6b0747774da | 351 | DRD = 1; |
ikon | 0:d6b0747774da | 352 | DWR = 1; |
ikon | 0:d6b0747774da | 353 | DCS = 1; |
ikon | 0:d6b0747774da | 354 | DCD = 1; |
ikon | 0:d6b0747774da | 355 | |
ikon | 0:d6b0747774da | 356 | DRS = 0; |
ikon | 0:d6b0747774da | 357 | wait_ms(200); |
ikon | 0:d6b0747774da | 358 | DRS = 1; |
ikon | 0:d6b0747774da | 359 | wait_ms(500); |
ikon | 0:d6b0747774da | 360 | |
ikon | 0:d6b0747774da | 361 | write_command(0x0028); // VCOM OTP |
ikon | 0:d6b0747774da | 362 | write_data(0x0006); // Page 55-56 of SSD2119 datasheet |
ikon | 0:d6b0747774da | 363 | |
ikon | 0:d6b0747774da | 364 | write_command(0x0000); // start Oscillator |
ikon | 0:d6b0747774da | 365 | write_data(0x0001); // Page 36 of SSD2119 datasheet |
ikon | 0:d6b0747774da | 366 | |
ikon | 0:d6b0747774da | 367 | write_command(0x0010); // Sleep mode |
ikon | 0:d6b0747774da | 368 | write_data(0x0000); // Page 49 of SSD2119 datasheet |
ikon | 0:d6b0747774da | 369 | |
ikon | 0:d6b0747774da | 370 | write_command(0x0001); // Driver Output Control |
ikon | 0:d6b0747774da | 371 | write_data(0x32EF); // Page 36-39 of SSD2119 datasheet |
ikon | 0:d6b0747774da | 372 | |
ikon | 0:d6b0747774da | 373 | write_command(0x0002); // LCD Driving Waveform Control |
ikon | 0:d6b0747774da | 374 | write_data(0x0600); // Page 40-42 of SSD2119 datasheet |
ikon | 0:d6b0747774da | 375 | |
ikon | 0:d6b0747774da | 376 | write_command(0x0003); // Power Control 1 |
ikon | 0:d6b0747774da | 377 | write_data(0x6A38); // Page 43-44 of SSD2119 datasheet |
ikon | 0:d6b0747774da | 378 | |
ikon | 0:d6b0747774da | 379 | write_command(0x0011); // Entry Mode |
ikon | 0:d6b0747774da | 380 | write_data(0x6870); // Page 50-52 of SSD2119 datasheet |
ikon | 0:d6b0747774da | 381 | |
ikon | 0:d6b0747774da | 382 | write_command(0x000F); // Gate Scan Position |
ikon | 0:d6b0747774da | 383 | write_data(0x0000); // Page 49 of SSD2119 datasheet |
ikon | 0:d6b0747774da | 384 | |
ikon | 0:d6b0747774da | 385 | write_command(0x000B); // Frame Cycle Control |
ikon | 0:d6b0747774da | 386 | write_data(0x5308); // Page 45 of SSD2119 datasheet |
ikon | 0:d6b0747774da | 387 | |
ikon | 0:d6b0747774da | 388 | write_command(0x000C); // Power Control 2 |
ikon | 0:d6b0747774da | 389 | write_data(0x0003); // Page 47 of SSD2119 datasheet |
ikon | 0:d6b0747774da | 390 | |
ikon | 0:d6b0747774da | 391 | write_command(0x000D); // Power Control 3 |
ikon | 0:d6b0747774da | 392 | write_data(0x000A); // Page 48 of SSD2119 datasheet |
ikon | 0:d6b0747774da | 393 | |
ikon | 0:d6b0747774da | 394 | write_command(0x000E); // Power Control 4 |
ikon | 0:d6b0747774da | 395 | write_data(0x2E00); // Page 48 of SSD2119 datasheet |
ikon | 0:d6b0747774da | 396 | |
ikon | 0:d6b0747774da | 397 | write_command(0x001E); // Power Control 5 |
ikon | 0:d6b0747774da | 398 | write_data(0x00BE); // Page 53 of SSD2119 datasheet |
ikon | 0:d6b0747774da | 399 | |
ikon | 0:d6b0747774da | 400 | write_command(0x0025); // Frame Frequency Control |
ikon | 0:d6b0747774da | 401 | write_data(0x8000); // Page 53 of SSD2119 datasheet |
ikon | 0:d6b0747774da | 402 | |
ikon | 0:d6b0747774da | 403 | write_command(0x0026); // Analog setting |
ikon | 0:d6b0747774da | 404 | write_data(0x7800); // Page 54 of SSD2119 datasheet |
ikon | 0:d6b0747774da | 405 | |
ikon | 0:d6b0747774da | 406 | write_command(0x004E); // Ram Address Set |
ikon | 0:d6b0747774da | 407 | write_data(0x0000); // Page 58 of SSD2119 datasheet |
ikon | 0:d6b0747774da | 408 | |
ikon | 0:d6b0747774da | 409 | write_command(0x004F); // Ram Address Set |
ikon | 0:d6b0747774da | 410 | write_data(0x0000); // Page 58 of SSD2119 datasheet |
ikon | 0:d6b0747774da | 411 | |
ikon | 0:d6b0747774da | 412 | write_command(0x0012); // Sleep mode |
ikon | 0:d6b0747774da | 413 | write_data(0x08D9); // Page 49 of SSD2119 datasheet |
ikon | 0:d6b0747774da | 414 | |
ikon | 0:d6b0747774da | 415 | // Gamma Control (R30h to R3Bh) -- Page 56 of SSD2119 datasheet |
ikon | 0:d6b0747774da | 416 | write_command(0x0030); |
ikon | 0:d6b0747774da | 417 | write_data(0x0000); |
ikon | 0:d6b0747774da | 418 | |
ikon | 0:d6b0747774da | 419 | write_command(0x0031); |
ikon | 0:d6b0747774da | 420 | write_data(0x0104); |
ikon | 0:d6b0747774da | 421 | |
ikon | 0:d6b0747774da | 422 | write_command(0x0032); |
ikon | 0:d6b0747774da | 423 | write_data(0x0100); |
ikon | 0:d6b0747774da | 424 | |
ikon | 0:d6b0747774da | 425 | write_command(0x0033); |
ikon | 0:d6b0747774da | 426 | write_data(0x0305); |
ikon | 0:d6b0747774da | 427 | |
ikon | 0:d6b0747774da | 428 | write_command(0x0034); |
ikon | 0:d6b0747774da | 429 | write_data(0x0505); |
ikon | 0:d6b0747774da | 430 | |
ikon | 0:d6b0747774da | 431 | write_command(0x0035); |
ikon | 0:d6b0747774da | 432 | write_data(0x0305); |
ikon | 0:d6b0747774da | 433 | |
ikon | 0:d6b0747774da | 434 | write_command(0x0036); |
ikon | 0:d6b0747774da | 435 | write_data(0x0707); |
ikon | 0:d6b0747774da | 436 | |
ikon | 0:d6b0747774da | 437 | write_command(0x0037); |
ikon | 0:d6b0747774da | 438 | write_data(0x0300); |
ikon | 0:d6b0747774da | 439 | |
ikon | 0:d6b0747774da | 440 | write_command(0x003A); |
ikon | 0:d6b0747774da | 441 | write_data(0x1200); |
ikon | 0:d6b0747774da | 442 | |
ikon | 0:d6b0747774da | 443 | write_command(0x003B); |
ikon | 0:d6b0747774da | 444 | write_data(0x0800); |
ikon | 0:d6b0747774da | 445 | |
ikon | 0:d6b0747774da | 446 | write_command(0x0007); // Display Control |
ikon | 0:d6b0747774da | 447 | write_data(0x0033); // Page 45 of SSD2119 datasheet |
ikon | 0:d6b0747774da | 448 | |
ikon | 0:d6b0747774da | 449 | wait_ms(150); |
ikon | 0:d6b0747774da | 450 | |
ikon | 0:d6b0747774da | 451 | write_command(0x0022); // RAM data write/read |
ikon | 0:d6b0747774da | 452 | } |
ikon | 0:d6b0747774da | 453 | |
ikon | 0:d6b0747774da | 454 | /*************************************************/ |
ikon | 0:d6b0747774da | 455 | void Display_Home() { |
ikon | 0:d6b0747774da | 456 | xx = 0; |
ikon | 0:d6b0747774da | 457 | yy = 0; |
ikon | 0:d6b0747774da | 458 | write_command(0x004E); // RAM address set |
ikon | 0:d6b0747774da | 459 | write_data(0x0000); // Page 58 of SSD2119 datasheet |
ikon | 0:d6b0747774da | 460 | write_command(0x004F); // RAM address set |
ikon | 0:d6b0747774da | 461 | write_data(0x0000); // Page 58 of SSD2119 datasheet |
ikon | 0:d6b0747774da | 462 | |
ikon | 0:d6b0747774da | 463 | write_command(0x0044); // Vertical RAM address position |
ikon | 0:d6b0747774da | 464 | write_data(0xEF00); // Page 57 of SSD2119 datasheet |
ikon | 0:d6b0747774da | 465 | write_command(0x0045); // Horizontal RAM address position |
ikon | 0:d6b0747774da | 466 | write_data(0x0000); // Page 57 of SSD2119 datasheet |
ikon | 0:d6b0747774da | 467 | write_command(0x0046); // Horizontal RAM address position |
ikon | 0:d6b0747774da | 468 | write_data(0x013F); // Page 57 of SSD2119 datasheet |
ikon | 0:d6b0747774da | 469 | |
ikon | 0:d6b0747774da | 470 | write_command(0x0022); // RAM data write/read |
ikon | 0:d6b0747774da | 471 | } |
ikon | 0:d6b0747774da | 472 | |
ikon | 0:d6b0747774da | 473 | |
ikon | 0:d6b0747774da | 474 | void display_rgb(unsigned int data) { |
ikon | 0:d6b0747774da | 475 | unsigned int i,j; |
ikon | 0:d6b0747774da | 476 | Display_Home(); |
ikon | 0:d6b0747774da | 477 | for (i=0;i<HRES;i++) { |
ikon | 0:d6b0747774da | 478 | for (j=0;j<VRES;j++) { |
ikon | 0:d6b0747774da | 479 | write_data(data); |
ikon | 0:d6b0747774da | 480 | } |
ikon | 0:d6b0747774da | 481 | } |
ikon | 0:d6b0747774da | 482 | } |
ikon | 0:d6b0747774da | 483 | |
ikon | 0:d6b0747774da | 484 | void LCD_test() { |
ikon | 0:d6b0747774da | 485 | //uint16_t i; |
ikon | 0:d6b0747774da | 486 | unsigned int i,j; |
ikon | 0:d6b0747774da | 487 | //bool b; |
ikon | 0:d6b0747774da | 488 | Display_Home(); |
ikon | 0:d6b0747774da | 489 | |
ikon | 0:d6b0747774da | 490 | printf("Disp home done.\n"); |
ikon | 0:d6b0747774da | 491 | for (i=0; i<HRES;i++) { |
ikon | 0:d6b0747774da | 492 | //b = 0; |
ikon | 0:d6b0747774da | 493 | for (j=0;j<VRES;j++) { |
ikon | 0:d6b0747774da | 494 | |
ikon | 0:d6b0747774da | 495 | /* |
ikon | 0:d6b0747774da | 496 | if (j < (VRES/2)) { |
ikon | 0:d6b0747774da | 497 | b = 0; |
ikon | 0:d6b0747774da | 498 | } else { |
ikon | 0:d6b0747774da | 499 | b = 1; |
ikon | 0:d6b0747774da | 500 | } |
ikon | 0:d6b0747774da | 501 | */ |
ikon | 0:d6b0747774da | 502 | //if (j == 120) b=1; |
ikon | 0:d6b0747774da | 503 | //b=1; |
ikon | 0:d6b0747774da | 504 | if (i>279)write_data(BLACK); |
ikon | 0:d6b0747774da | 505 | else if (i>259) write_data(BLUE); //{ if (b) { write_data(BLUE); } else { write_data(HBLUE); } } |
ikon | 0:d6b0747774da | 506 | else if (i>239) write_data(HBLUE); |
ikon | 0:d6b0747774da | 507 | else if (i>219) write_data(RED); //{ if (b) { write_data(RED); } else { write_data(HRED); } } |
ikon | 0:d6b0747774da | 508 | else if (i>199) write_data(HRED); |
ikon | 0:d6b0747774da | 509 | else if (i>179) write_data(MAGENTA); //{ if (b) { write_data(MAGENTA); } else { write_data(HMAGENTA); } } |
ikon | 0:d6b0747774da | 510 | else if (i>159) write_data(HMAGENTA); |
ikon | 0:d6b0747774da | 511 | else if (i>139) write_data(GREEN); //{ if (b) { write_data(GREEN); } else { write_data(HGREEN); } } |
ikon | 0:d6b0747774da | 512 | else if (i>119) write_data(HGREEN); |
ikon | 0:d6b0747774da | 513 | else if (i>99) write_data(CYAN); //{ if (b) { write_data(CYAN); } else { write_data(HCYAN); } } |
ikon | 0:d6b0747774da | 514 | else if (i>79) write_data(HCYAN); |
ikon | 0:d6b0747774da | 515 | else if (i>59) write_data(YELLOW); //{ if (b) { write_data(YELLOW); } else { write_data(HYELLOW); } } |
ikon | 0:d6b0747774da | 516 | else if (i>39) write_data(HYELLOW); |
ikon | 0:d6b0747774da | 517 | else if (i>19) write_data(WHITE); |
ikon | 0:d6b0747774da | 518 | else write_data(HWHITE); //{ if (b) { write_data(WHITE); } else { write_data(HWHITE); } } |
ikon | 0:d6b0747774da | 519 | } |
ikon | 0:d6b0747774da | 520 | //printf("Col = %d\n",i); |
ikon | 0:d6b0747774da | 521 | } |
ikon | 0:d6b0747774da | 522 | } |
ikon | 0:d6b0747774da | 523 | |
ikon | 0:d6b0747774da | 524 | void cls() { |
ikon | 0:d6b0747774da | 525 | // write_command(0x22); |
ikon | 0:d6b0747774da | 526 | display_rgb(WHITE); |
ikon | 0:d6b0747774da | 527 | } |
ikon | 0:d6b0747774da | 528 | |
ikon | 0:d6b0747774da | 529 | unsigned char cat(char *filename) { |
ikon | 0:d6b0747774da | 530 | char c; |
ikon | 0:d6b0747774da | 531 | unsigned int x,y; |
ikon | 0:d6b0747774da | 532 | |
ikon | 0:d6b0747774da | 533 | printf("Opening File...\n"); // Drive should be marked as removed |
ikon | 0:d6b0747774da | 534 | FILE *fp = fopen(filename, "r"); |
ikon | 0:d6b0747774da | 535 | if (!fp) { |
ikon | 0:d6b0747774da | 536 | printf("File %s could not be opened!\n",filename); |
ikon | 0:d6b0747774da | 537 | return(1); |
ikon | 0:d6b0747774da | 538 | } |
ikon | 0:d6b0747774da | 539 | cls(); |
ikon | 0:d6b0747774da | 540 | Display_Home(); |
ikon | 0:d6b0747774da | 541 | x = 0; |
ikon | 0:d6b0747774da | 542 | y = 0; |
ikon | 0:d6b0747774da | 543 | |
ikon | 0:d6b0747774da | 544 | while ( ( c=fgetc(fp) ) != EOF ) { |
ikon | 0:d6b0747774da | 545 | |
ikon | 0:d6b0747774da | 546 | LcdGotoXY(x,y); |
ikon | 0:d6b0747774da | 547 | |
ikon | 0:d6b0747774da | 548 | if (c == 13) { |
ikon | 0:d6b0747774da | 549 | y++; |
ikon | 0:d6b0747774da | 550 | x=0; |
ikon | 0:d6b0747774da | 551 | }; |
ikon | 0:d6b0747774da | 552 | if (c == 8) { |
ikon | 0:d6b0747774da | 553 | x--; |
ikon | 0:d6b0747774da | 554 | }; |
ikon | 0:d6b0747774da | 555 | |
ikon | 0:d6b0747774da | 556 | if (c > 31) LcdChr(c); |
ikon | 0:d6b0747774da | 557 | x++; |
ikon | 0:d6b0747774da | 558 | if (x>39) { |
ikon | 0:d6b0747774da | 559 | y++; |
ikon | 0:d6b0747774da | 560 | x=0; |
ikon | 0:d6b0747774da | 561 | if (y>39) y=0; |
ikon | 0:d6b0747774da | 562 | } |
ikon | 0:d6b0747774da | 563 | } |
ikon | 0:d6b0747774da | 564 | fclose(fp); |
ikon | 0:d6b0747774da | 565 | return(0); |
ikon | 0:d6b0747774da | 566 | } |
ikon | 0:d6b0747774da | 567 | |
ikon | 0:d6b0747774da | 568 | |
ikon | 0:d6b0747774da | 569 | unsigned char scr2lcd(char *scrfile) { |
ikon | 0:d6b0747774da | 570 | unsigned char c,a,ink,pap; |
ikon | 0:d6b0747774da | 571 | unsigned int x,y,i,j,k,l,m; |
ikon | 0:d6b0747774da | 572 | unsigned char screen[6912]; |
ikon | 0:d6b0747774da | 573 | |
ikon | 0:d6b0747774da | 574 | printf("Opening File...\n"); // Drive should be marked as removed |
ikon | 0:d6b0747774da | 575 | FILE *fp = fopen("/local/test.scr", "r"); |
ikon | 0:d6b0747774da | 576 | if (!fp) { |
ikon | 0:d6b0747774da | 577 | printf("File %s could not be opened!\n",scrfile); |
ikon | 0:d6b0747774da | 578 | return(1); |
ikon | 0:d6b0747774da | 579 | } |
ikon | 0:d6b0747774da | 580 | |
ikon | 0:d6b0747774da | 581 | //cls(); // Keep border, do not cls |
ikon | 0:d6b0747774da | 582 | Display_Home(); |
ikon | 0:d6b0747774da | 583 | x=START_X; |
ikon | 0:d6b0747774da | 584 | y=START_Y; |
ikon | 0:d6b0747774da | 585 | LcdSetPenXY(x,y); |
ikon | 0:d6b0747774da | 586 | |
ikon | 0:d6b0747774da | 587 | write_command(0x22); |
ikon | 0:d6b0747774da | 588 | |
ikon | 0:d6b0747774da | 589 | i=0; |
ikon | 0:d6b0747774da | 590 | while ( ( ( c = fgetc(fp) ) != EOF ) && (i<6912) ) { |
ikon | 0:d6b0747774da | 591 | screen[i] = c; |
ikon | 0:d6b0747774da | 592 | i++; |
ikon | 0:d6b0747774da | 593 | } |
ikon | 0:d6b0747774da | 594 | fclose(fp); |
ikon | 0:d6b0747774da | 595 | printf("Screen read done."); |
ikon | 0:d6b0747774da | 596 | |
ikon | 0:d6b0747774da | 597 | for (j=0;j<3;j++) { // Screen "third" |
ikon | 0:d6b0747774da | 598 | for (i=0;i<8;i++) { // Line in third |
ikon | 0:d6b0747774da | 599 | for (k=0;k<8;k++) { // Microline |
ikon | 0:d6b0747774da | 600 | for (l=32;l>0;l--) { // Byte |
ikon | 0:d6b0747774da | 601 | c = screen[j * 2048 + k * 256 + i * 32 + (l-1)]; |
ikon | 0:d6b0747774da | 602 | for (m=0;m<8;m++) { // Pixel |
ikon | 0:d6b0747774da | 603 | a = screen[6144+ j * 256 + i * 32 + (l-1)]; |
ikon | 0:d6b0747774da | 604 | ink = a & 0x07; |
ikon | 0:d6b0747774da | 605 | pap = (a >>=3) & 0x07; |
ikon | 0:d6b0747774da | 606 | if ( (a & 0x70) == 0x70 ) { // Bright1 |
ikon | 0:d6b0747774da | 607 | if ( ink != 0 ) ink = ink+8; |
ikon | 0:d6b0747774da | 608 | if ( pap != 0 ) pap = pap+8; |
ikon | 0:d6b0747774da | 609 | } |
ikon | 0:d6b0747774da | 610 | |
ikon | 0:d6b0747774da | 611 | if ( (c & 0x01) == 0x01 ) { |
ikon | 0:d6b0747774da | 612 | write_data(colors[ink]); |
ikon | 0:d6b0747774da | 613 | } else { |
ikon | 0:d6b0747774da | 614 | write_data(colors[pap]); |
ikon | 0:d6b0747774da | 615 | } |
ikon | 0:d6b0747774da | 616 | c >>= 1; |
ikon | 0:d6b0747774da | 617 | } |
ikon | 0:d6b0747774da | 618 | } |
ikon | 0:d6b0747774da | 619 | y++; |
ikon | 0:d6b0747774da | 620 | x=START_X; |
ikon | 0:d6b0747774da | 621 | LcdSetPenXY(x,y); |
ikon | 0:d6b0747774da | 622 | |
ikon | 0:d6b0747774da | 623 | } |
ikon | 0:d6b0747774da | 624 | } |
ikon | 0:d6b0747774da | 625 | } |
ikon | 0:d6b0747774da | 626 | |
ikon | 0:d6b0747774da | 627 | |
ikon | 0:d6b0747774da | 628 | return(0); |
ikon | 0:d6b0747774da | 629 | } |
ikon | 0:d6b0747774da | 630 | |
ikon | 0:d6b0747774da | 631 | |
ikon | 0:d6b0747774da | 632 | // Main loop starts here |
ikon | 0:d6b0747774da | 633 | int main() { |
ikon | 0:d6b0747774da | 634 | |
ikon | 0:d6b0747774da | 635 | uint8_t x,y; |
ikon | 0:d6b0747774da | 636 | char c,xc=' '; |
ikon | 0:d6b0747774da | 637 | //Configure the Fastest Baud Rate |
ikon | 0:d6b0747774da | 638 | pc.baud(115200); |
ikon | 0:d6b0747774da | 639 | |
ikon | 0:d6b0747774da | 640 | printf("Program start.\n"); |
ikon | 0:d6b0747774da | 641 | |
ikon | 0:d6b0747774da | 642 | // Setup the spi for 8 bit data, high steady state clock, |
ikon | 0:d6b0747774da | 643 | // second edge capture, with a 10 MHz clock rate |
ikon | 0:d6b0747774da | 644 | spi.format(8,3); // CPOL=1, CPHA=1 |
ikon | 0:d6b0747774da | 645 | spi.frequency(10000000); // SPI fastest possible |
ikon | 0:d6b0747774da | 646 | |
ikon | 0:d6b0747774da | 647 | printf("SPI initialized.\n"); |
ikon | 0:d6b0747774da | 648 | myled = 0; |
ikon | 0:d6b0747774da | 649 | |
ikon | 0:d6b0747774da | 650 | while (1) { |
ikon | 0:d6b0747774da | 651 | |
ikon | 0:d6b0747774da | 652 | initialization(); |
ikon | 0:d6b0747774da | 653 | |
ikon | 0:d6b0747774da | 654 | printf("Display initialized.\n"); |
ikon | 0:d6b0747774da | 655 | |
ikon | 0:d6b0747774da | 656 | LCD_test(); |
ikon | 0:d6b0747774da | 657 | |
ikon | 0:d6b0747774da | 658 | printf("Display test.\n"); |
ikon | 0:d6b0747774da | 659 | |
ikon | 0:d6b0747774da | 660 | wait(1.0); |
ikon | 0:d6b0747774da | 661 | |
ikon | 0:d6b0747774da | 662 | if (myled == 0) { |
ikon | 0:d6b0747774da | 663 | myled = 1; |
ikon | 0:d6b0747774da | 664 | } else { |
ikon | 0:d6b0747774da | 665 | myled = 0; |
ikon | 0:d6b0747774da | 666 | } |
ikon | 0:d6b0747774da | 667 | |
ikon | 0:d6b0747774da | 668 | Display_Home(); |
ikon | 0:d6b0747774da | 669 | LcdGotoXY(13,10); |
ikon | 0:d6b0747774da | 670 | LcdChr('H'); |
ikon | 0:d6b0747774da | 671 | LcdGotoXY(14,10); |
ikon | 0:d6b0747774da | 672 | LcdChr('e'); |
ikon | 0:d6b0747774da | 673 | LcdGotoXY(15,10); |
ikon | 0:d6b0747774da | 674 | LcdChr('l'); |
ikon | 0:d6b0747774da | 675 | LcdGotoXY(16,10); |
ikon | 0:d6b0747774da | 676 | LcdChr('l'); |
ikon | 0:d6b0747774da | 677 | LcdGotoXY(17,10); |
ikon | 0:d6b0747774da | 678 | LcdChr('o'); |
ikon | 0:d6b0747774da | 679 | |
ikon | 0:d6b0747774da | 680 | LcdStr(" World!"); |
ikon | 0:d6b0747774da | 681 | |
ikon | 0:d6b0747774da | 682 | LcdGotoXY(4,11); |
ikon | 0:d6b0747774da | 683 | LcdStr("Below you can see what you write"); |
ikon | 0:d6b0747774da | 684 | LcdGotoXY(12,12); |
ikon | 0:d6b0747774da | 685 | LcdStr("in your PC terminal"); |
ikon | 0:d6b0747774da | 686 | |
ikon | 0:d6b0747774da | 687 | wait(5.0); |
ikon | 0:d6b0747774da | 688 | |
ikon | 0:d6b0747774da | 689 | x = 0; |
ikon | 0:d6b0747774da | 690 | y = 13; |
ikon | 0:d6b0747774da | 691 | while (1) { |
ikon | 0:d6b0747774da | 692 | LcdGotoXY(x,y); |
ikon | 0:d6b0747774da | 693 | c = pc.getc(); |
ikon | 0:d6b0747774da | 694 | if (c == 13) { |
ikon | 0:d6b0747774da | 695 | y++; |
ikon | 0:d6b0747774da | 696 | x=0; |
ikon | 0:d6b0747774da | 697 | }; |
ikon | 0:d6b0747774da | 698 | if (c == 8) { |
ikon | 0:d6b0747774da | 699 | x--; |
ikon | 0:d6b0747774da | 700 | }; |
ikon | 0:d6b0747774da | 701 | |
ikon | 0:d6b0747774da | 702 | if (c > 31) { |
ikon | 0:d6b0747774da | 703 | LcdChr(c); |
ikon | 0:d6b0747774da | 704 | if ( (xc == '\\' ) && ( c == '\\' ) ) { |
ikon | 0:d6b0747774da | 705 | scr2lcd("test.scr"); |
ikon | 0:d6b0747774da | 706 | } |
ikon | 0:d6b0747774da | 707 | |
ikon | 0:d6b0747774da | 708 | xc = c; |
ikon | 0:d6b0747774da | 709 | } |
ikon | 0:d6b0747774da | 710 | x++; |
ikon | 0:d6b0747774da | 711 | if (x>39) { |
ikon | 0:d6b0747774da | 712 | y++; |
ikon | 0:d6b0747774da | 713 | x=0; |
ikon | 0:d6b0747774da | 714 | if (y>39) y=0; |
ikon | 0:d6b0747774da | 715 | } |
ikon | 0:d6b0747774da | 716 | } |
ikon | 0:d6b0747774da | 717 | } |
ikon | 0:d6b0747774da | 718 | |
ikon | 0:d6b0747774da | 719 | } |