This is the code used on my video series "Hybrid Supercapacitor Car Battery" for my own hardware monitoring system. THe videos can be found on madelectronengineering.com
Dependencies: BurstSPI Fonts INA219 mbed LPC1114_WakeInterruptIn
Fork of SharpMemoryLCD by
SharpLCD.cpp@2:0c49a8f32f6e, 2017-12-26 (annotated)
- Committer:
- madelectroneng
- Date:
- Tue Dec 26 21:30:09 2017 +0000
- Revision:
- 2:0c49a8f32f6e
- Parent:
- 0:0a76610c48a1
Inital setup
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
star297 | 0:0a76610c48a1 | 1 | |
star297 | 0:0a76610c48a1 | 2 | #include "mbed.h" |
star297 | 0:0a76610c48a1 | 3 | #include "SharpLCD.h" |
star297 | 0:0a76610c48a1 | 4 | |
star297 | 0:0a76610c48a1 | 5 | const unsigned char FONT8x8[97][8] = { |
star297 | 0:0a76610c48a1 | 6 | {0x08,0x08,0x08,0x00,0x00,0x00,0x00,0x00}, // columns, rows, num_bytes_per_char |
star297 | 0:0a76610c48a1 | 7 | {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // space 0x20 |
star297 | 0:0a76610c48a1 | 8 | {0x30,0x78,0x78,0x30,0x30,0x00,0x30,0x00}, // ! |
star297 | 0:0a76610c48a1 | 9 | {0x6C,0x6C,0x6C,0x00,0x00,0x00,0x00,0x00}, // " |
star297 | 0:0a76610c48a1 | 10 | {0x6C,0x6C,0xFE,0x6C,0xFE,0x6C,0x6C,0x00}, // # |
star297 | 0:0a76610c48a1 | 11 | {0x18,0x3E,0x60,0x3C,0x06,0x7C,0x18,0x00}, // $ |
star297 | 0:0a76610c48a1 | 12 | {0x00,0x63,0x66,0x0C,0x18,0x33,0x63,0x00}, // % |
star297 | 0:0a76610c48a1 | 13 | {0x1C,0x36,0x1C,0x3B,0x6E,0x66,0x3B,0x00}, // & |
star297 | 0:0a76610c48a1 | 14 | {0x30,0x30,0x60,0x00,0x00,0x00,0x00,0x00}, // ' |
star297 | 0:0a76610c48a1 | 15 | {0x0C,0x18,0x30,0x30,0x30,0x18,0x0C,0x00}, // ( |
star297 | 0:0a76610c48a1 | 16 | {0x30,0x18,0x0C,0x0C,0x0C,0x18,0x30,0x00}, // ) |
star297 | 0:0a76610c48a1 | 17 | {0x00,0x66,0x3C,0xFF,0x3C,0x66,0x00,0x00}, // * |
star297 | 0:0a76610c48a1 | 18 | {0x00,0x30,0x30,0xFC,0x30,0x30,0x00,0x00}, // + |
star297 | 0:0a76610c48a1 | 19 | {0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x30}, // , |
star297 | 0:0a76610c48a1 | 20 | {0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0x00}, // - |
star297 | 0:0a76610c48a1 | 21 | {0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00}, // . |
star297 | 0:0a76610c48a1 | 22 | {0x03,0x06,0x0C,0x18,0x30,0x60,0x40,0x00}, // / (forward slash) |
star297 | 0:0a76610c48a1 | 23 | {0x3E,0x63,0x63,0x6B,0x63,0x63,0x3E,0x00}, // 0 0x30 |
star297 | 0:0a76610c48a1 | 24 | {0x18,0x38,0x58,0x18,0x18,0x18,0x7E,0x00}, // 1 |
star297 | 0:0a76610c48a1 | 25 | {0x3C,0x66,0x06,0x1C,0x30,0x66,0x7E,0x00}, // 2 |
star297 | 0:0a76610c48a1 | 26 | {0x3C,0x66,0x06,0x1C,0x06,0x66,0x3C,0x00}, // 3 |
star297 | 0:0a76610c48a1 | 27 | {0x0E,0x1E,0x36,0x66,0x7F,0x06,0x0F,0x00}, // 4 |
star297 | 0:0a76610c48a1 | 28 | {0x7E,0x60,0x7C,0x06,0x06,0x66,0x3C,0x00}, // 5 |
star297 | 0:0a76610c48a1 | 29 | {0x1C,0x30,0x60,0x7C,0x66,0x66,0x3C,0x00}, // 6 |
star297 | 0:0a76610c48a1 | 30 | {0x7E,0x66,0x06,0x0C,0x18,0x18,0x18,0x00}, // 7 |
star297 | 0:0a76610c48a1 | 31 | {0x3C,0x66,0x66,0x3C,0x66,0x66,0x3C,0x00}, // 8 |
star297 | 0:0a76610c48a1 | 32 | {0x3C,0x66,0x66,0x3E,0x06,0x0C,0x38,0x00}, // 9 |
star297 | 0:0a76610c48a1 | 33 | {0x00,0x18,0x18,0x00,0x00,0x18,0x18,0x00}, // : |
star297 | 0:0a76610c48a1 | 34 | {0x00,0x18,0x18,0x00,0x00,0x18,0x18,0x30}, // ; |
star297 | 0:0a76610c48a1 | 35 | {0x0C,0x18,0x30,0x60,0x30,0x18,0x0C,0x00}, // < |
star297 | 0:0a76610c48a1 | 36 | {0x00,0x00,0x7E,0x00,0x00,0x7E,0x00,0x00}, // = |
star297 | 0:0a76610c48a1 | 37 | {0x30,0x18,0x0C,0x06,0x0C,0x18,0x30,0x00}, // > |
star297 | 0:0a76610c48a1 | 38 | {0x3C,0x66,0x06,0x0C,0x18,0x00,0x18,0x00}, // ? |
star297 | 0:0a76610c48a1 | 39 | {0x3E,0x63,0x6F,0x69,0x6F,0x60,0x3E,0x00}, // @ 0x40 |
star297 | 0:0a76610c48a1 | 40 | {0x18,0x3C,0x66,0x66,0x7E,0x66,0x66,0x00}, // A |
star297 | 0:0a76610c48a1 | 41 | {0x7E,0x33,0x33,0x3E,0x33,0x33,0x7E,0x00}, // B |
star297 | 0:0a76610c48a1 | 42 | {0x1E,0x33,0x60,0x60,0x60,0x33,0x1E,0x00}, // C |
star297 | 0:0a76610c48a1 | 43 | {0x7C,0x36,0x33,0x33,0x33,0x36,0x7C,0x00}, // D |
star297 | 0:0a76610c48a1 | 44 | {0x7F,0x31,0x34,0x3C,0x34,0x31,0x7F,0x00}, // E |
star297 | 0:0a76610c48a1 | 45 | {0x7F,0x31,0x34,0x3C,0x34,0x30,0x78,0x00}, // F |
star297 | 0:0a76610c48a1 | 46 | {0x1E,0x33,0x60,0x60,0x67,0x33,0x1F,0x00}, // G |
star297 | 0:0a76610c48a1 | 47 | {0x66,0x66,0x66,0x7E,0x66,0x66,0x66,0x00}, // H |
star297 | 0:0a76610c48a1 | 48 | {0x3C,0x18,0x18,0x18,0x18,0x18,0x3C,0x00}, // I |
star297 | 0:0a76610c48a1 | 49 | {0x0F,0x06,0x06,0x06,0x66,0x66,0x3C,0x00}, // J |
star297 | 0:0a76610c48a1 | 50 | {0x73,0x33,0x36,0x3C,0x36,0x33,0x73,0x00}, // K |
star297 | 0:0a76610c48a1 | 51 | {0x78,0x30,0x30,0x30,0x31,0x33,0x7F,0x00}, // L |
star297 | 0:0a76610c48a1 | 52 | {0x63,0x77,0x7F,0x7F,0x6B,0x63,0x63,0x00}, // M |
star297 | 0:0a76610c48a1 | 53 | {0x63,0x73,0x7B,0x6F,0x67,0x63,0x63,0x00}, // N |
star297 | 0:0a76610c48a1 | 54 | {0x3E,0x63,0x63,0x63,0x63,0x63,0x3E,0x00}, // O |
star297 | 0:0a76610c48a1 | 55 | {0x7E,0x33,0x33,0x3E,0x30,0x30,0x78,0x00}, // P 0x50 |
star297 | 0:0a76610c48a1 | 56 | {0x3C,0x66,0x66,0x66,0x6E,0x3C,0x0E,0x00}, // Q |
star297 | 0:0a76610c48a1 | 57 | {0x7E,0x33,0x33,0x3E,0x36,0x33,0x73,0x00}, // R |
star297 | 0:0a76610c48a1 | 58 | {0x3C,0x66,0x30,0x18,0x0C,0x66,0x3C,0x00}, // S |
star297 | 0:0a76610c48a1 | 59 | {0x7E,0x5A,0x18,0x18,0x18,0x18,0x3C,0x00}, // T |
star297 | 0:0a76610c48a1 | 60 | {0x66,0x66,0x66,0x66,0x66,0x66,0x7E,0x00}, // U |
star297 | 0:0a76610c48a1 | 61 | {0x66,0x66,0x66,0x66,0x66,0x3C,0x18,0x00}, // V |
star297 | 0:0a76610c48a1 | 62 | {0x63,0x63,0x63,0x6B,0x7F,0x77,0x63,0x00}, // W |
star297 | 0:0a76610c48a1 | 63 | {0x63,0x63,0x36,0x1C,0x1C,0x36,0x63,0x00}, // X |
star297 | 0:0a76610c48a1 | 64 | {0x66,0x66,0x66,0x3C,0x18,0x18,0x3C,0x00}, // Y |
star297 | 0:0a76610c48a1 | 65 | {0x7F,0x63,0x46,0x0C,0x19,0x33,0x7F,0x00}, // Z |
star297 | 0:0a76610c48a1 | 66 | {0x3C,0x30,0x30,0x30,0x30,0x30,0x3C,0x00}, // [ |
star297 | 0:0a76610c48a1 | 67 | {0x60,0x30,0x18,0x0C,0x06,0x03,0x01,0x00}, // \ (back slash) |
star297 | 0:0a76610c48a1 | 68 | {0x3C,0x0C,0x0C,0x0C,0x0C,0x0C,0x3C,0x00}, // ] |
star297 | 0:0a76610c48a1 | 69 | {0x08,0x1C,0x36,0x63,0x00,0x00,0x00,0x00}, // ^ |
star297 | 0:0a76610c48a1 | 70 | {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF}, // _ |
star297 | 0:0a76610c48a1 | 71 | {0x18,0x18,0x0C,0x00,0x00,0x00,0x00,0x00}, // ` 0x60 |
star297 | 0:0a76610c48a1 | 72 | {0x00,0x00,0x3C,0x06,0x3E,0x66,0x3B,0x00}, // a |
star297 | 0:0a76610c48a1 | 73 | {0x70,0x30,0x3E,0x33,0x33,0x33,0x6E,0x00}, // b |
star297 | 0:0a76610c48a1 | 74 | {0x00,0x00,0x3C,0x66,0x60,0x66,0x3C,0x00}, // c |
star297 | 0:0a76610c48a1 | 75 | {0x0E,0x06,0x3E,0x66,0x66,0x66,0x3B,0x00}, // d |
star297 | 0:0a76610c48a1 | 76 | {0x00,0x00,0x3C,0x66,0x7E,0x60,0x3C,0x00}, // e |
star297 | 0:0a76610c48a1 | 77 | {0x1C,0x36,0x30,0x78,0x30,0x30,0x78,0x00}, // f |
star297 | 0:0a76610c48a1 | 78 | {0x00,0x00,0x3B,0x66,0x66,0x3E,0x06,0x7C}, // g |
star297 | 0:0a76610c48a1 | 79 | {0x70,0x30,0x36,0x3B,0x33,0x33,0x73,0x00}, // h |
star297 | 0:0a76610c48a1 | 80 | {0x18,0x00,0x38,0x18,0x18,0x18,0x3C,0x00}, // i |
star297 | 0:0a76610c48a1 | 81 | {0x06,0x00,0x06,0x06,0x06,0x66,0x66,0x3C}, // j |
star297 | 0:0a76610c48a1 | 82 | {0x70,0x30,0x33,0x36,0x3C,0x36,0x73,0x00}, // k |
star297 | 0:0a76610c48a1 | 83 | {0x38,0x18,0x18,0x18,0x18,0x18,0x3C,0x00}, // l |
star297 | 0:0a76610c48a1 | 84 | {0x00,0x00,0x66,0x7F,0x7F,0x6B,0x63,0x00}, // m |
star297 | 0:0a76610c48a1 | 85 | {0x00,0x00,0x7C,0x66,0x66,0x66,0x66,0x00}, // n |
star297 | 0:0a76610c48a1 | 86 | {0x00,0x00,0x3C,0x66,0x66,0x66,0x3C,0x00}, // o |
star297 | 0:0a76610c48a1 | 87 | {0x00,0x00,0x6E,0x33,0x33,0x3E,0x30,0x78}, // p |
star297 | 0:0a76610c48a1 | 88 | {0x00,0x00,0x3B,0x66,0x66,0x3E,0x06,0x0F}, // q |
star297 | 0:0a76610c48a1 | 89 | {0x00,0x00,0x6E,0x3B,0x33,0x30,0x78,0x00}, // r |
star297 | 0:0a76610c48a1 | 90 | {0x00,0x00,0x3E,0x60,0x3C,0x06,0x7C,0x00}, // s |
star297 | 0:0a76610c48a1 | 91 | {0x08,0x18,0x3E,0x18,0x18,0x1A,0x0C,0x00}, // t |
star297 | 0:0a76610c48a1 | 92 | {0x00,0x00,0x66,0x66,0x66,0x66,0x3B,0x00}, // u |
star297 | 0:0a76610c48a1 | 93 | {0x00,0x00,0x66,0x66,0x66,0x3C,0x18,0x00}, // v |
star297 | 0:0a76610c48a1 | 94 | {0x00,0x00,0x63,0x6B,0x7F,0x7F,0x36,0x00}, // w |
star297 | 0:0a76610c48a1 | 95 | {0x00,0x00,0x63,0x36,0x1C,0x36,0x63,0x00}, // x |
star297 | 0:0a76610c48a1 | 96 | {0x00,0x00,0x66,0x66,0x66,0x3E,0x06,0x7C}, // y |
star297 | 0:0a76610c48a1 | 97 | {0x00,0x00,0x7E,0x4C,0x18,0x32,0x7E,0x00}, // z |
star297 | 0:0a76610c48a1 | 98 | {0x0E,0x18,0x18,0x70,0x18,0x18,0x0E,0x00}, // { |
star297 | 0:0a76610c48a1 | 99 | {0x0C,0x0C,0x0C,0x00,0x0C,0x0C,0x0C,0x00}, // | |
star297 | 0:0a76610c48a1 | 100 | {0x70,0x18,0x18,0x0E,0x18,0x18,0x70,0x00}, // } |
star297 | 0:0a76610c48a1 | 101 | {0x3B,0x6E,0x00,0x00,0x00,0x00,0x00,0x00}, // ~ |
star297 | 0:0a76610c48a1 | 102 | {0x1C,0x36,0x36,0x1C,0x00,0x00,0x00,0x00}}; // DEL |
star297 | 0:0a76610c48a1 | 103 | |
star297 | 0:0a76610c48a1 | 104 | // SharpLCD commands |
star297 | 0:0a76610c48a1 | 105 | #define SharpLCD_CMD_UPDATE (0x01) |
star297 | 0:0a76610c48a1 | 106 | #define SharpLCD_CMD_ALL_CLEAR (0x04) |
star297 | 0:0a76610c48a1 | 107 | |
star297 | 0:0a76610c48a1 | 108 | // Macro to switch endianness on char value |
star297 | 0:0a76610c48a1 | 109 | #define SWAP8(a) ((((a) & 0x80) >> 7) | (((a) & 0x40) >> 5) | (((a) & 0x20) >> 3) | (((a) & 0x10) >> 1) | (((a) & 0x08) << 1) | (((a) & 0x04) << 3) | (((a) & 0x02) << 5) | (((a) & 0x01) << 7)) |
star297 | 0:0a76610c48a1 | 110 | |
star297 | 0:0a76610c48a1 | 111 | SharpLCD::SharpLCD(PinName mosi, PinName miso, PinName sclk, PinName chipSelect, PinName enable, PinName extcom) |
star297 | 0:0a76610c48a1 | 112 | : spi(mosi, miso, sclk), chipSelect(chipSelect), Enable(enable), ExtCom(extcom) |
star297 | 0:0a76610c48a1 | 113 | { |
star297 | 0:0a76610c48a1 | 114 | //Initialize |
madelectroneng | 2:0c49a8f32f6e | 115 | spi.frequency(1000000);// Nominal speed is 1MHz, tested working at 3MHz |
star297 | 0:0a76610c48a1 | 116 | lcdPolarity = 0; |
star297 | 0:0a76610c48a1 | 117 | rowCount = 0; |
star297 | 0:0a76610c48a1 | 118 | memset((uint8_t*)pixelBuffer, White, sizeof(pixelBuffer)); // init full pixel buffer to White |
star297 | 0:0a76610c48a1 | 119 | memset((void*)RowState, 0, sizeof(RowState)); // init row status |
star297 | 0:0a76610c48a1 | 120 | // current pixel location |
star297 | 0:0a76610c48a1 | 121 | _x = 0; |
star297 | 0:0a76610c48a1 | 122 | _y = 0; |
star297 | 0:0a76610c48a1 | 123 | // window settings |
star297 | 0:0a76610c48a1 | 124 | _x1 = 0; |
star297 | 0:0a76610c48a1 | 125 | _x2 = 0; |
star297 | 0:0a76610c48a1 | 126 | _y1 = 0; |
star297 | 0:0a76610c48a1 | 127 | _y2 = 0; |
star297 | 0:0a76610c48a1 | 128 | _row = 0; |
star297 | 0:0a76610c48a1 | 129 | _column = 0; |
star297 | 0:0a76610c48a1 | 130 | } |
star297 | 0:0a76610c48a1 | 131 | // Call this function at 55 ~ 65 Hz to keep the display up-to-date. |
star297 | 0:0a76610c48a1 | 132 | void SharpLCD::toggle() { |
star297 | 0:0a76610c48a1 | 133 | ExtCom=!ExtCom; |
star297 | 0:0a76610c48a1 | 134 | } |
star297 | 0:0a76610c48a1 | 135 | |
star297 | 0:0a76610c48a1 | 136 | void SharpLCD::enableDisplay(void) { |
star297 | 0:0a76610c48a1 | 137 | Enable = 1; |
star297 | 0:0a76610c48a1 | 138 | } |
star297 | 0:0a76610c48a1 | 139 | |
star297 | 0:0a76610c48a1 | 140 | void SharpLCD::disableDisplay(void) { |
star297 | 0:0a76610c48a1 | 141 | Enable = 0; |
star297 | 0:0a76610c48a1 | 142 | } |
star297 | 0:0a76610c48a1 | 143 | |
madelectroneng | 2:0c49a8f32f6e | 144 | void SharpLCD::clearspace() { |
madelectroneng | 2:0c49a8f32f6e | 145 | // set pixel buffer to zero but do not blank screen |
madelectroneng | 2:0c49a8f32f6e | 146 | memset((void*)pixelBuffer, foreground, sizeof(pixelBuffer)); |
madelectroneng | 2:0c49a8f32f6e | 147 | memset((void*)RowState, 0, sizeof(RowState)); |
madelectroneng | 2:0c49a8f32f6e | 148 | } |
madelectroneng | 2:0c49a8f32f6e | 149 | |
star297 | 0:0a76610c48a1 | 150 | void SharpLCD::clearImmediate() { |
star297 | 0:0a76610c48a1 | 151 | // Clear out the pixel buffer |
star297 | 0:0a76610c48a1 | 152 | memset((void*)pixelBuffer, foreground, sizeof(pixelBuffer)); |
star297 | 0:0a76610c48a1 | 153 | memset((void*)RowState, 0, sizeof(RowState)); |
star297 | 0:0a76610c48a1 | 154 | chipSelect = 1; |
star297 | 0:0a76610c48a1 | 155 | // send clear command to display |
star297 | 0:0a76610c48a1 | 156 | cmd[0] = (uint8_t)(SWAP8(SharpLCD_CMD_ALL_CLEAR | lcdPolarity)); |
star297 | 0:0a76610c48a1 | 157 | cmd[1] = 0; |
star297 | 0:0a76610c48a1 | 158 | spi.fastWrite(cmd[0]); |
star297 | 0:0a76610c48a1 | 159 | spi.fastWrite(cmd[1]); |
star297 | 0:0a76610c48a1 | 160 | spi.clearRX(); |
star297 | 0:0a76610c48a1 | 161 | chipSelect = 0; |
star297 | 0:0a76610c48a1 | 162 | } |
star297 | 0:0a76610c48a1 | 163 | |
star297 | 0:0a76610c48a1 | 164 | void SharpLCD::update() { |
star297 | 0:0a76610c48a1 | 165 | //Initialize the command vector |
star297 | 0:0a76610c48a1 | 166 | cmd[0] = (uint8_t)SWAP8(SharpLCD_CMD_UPDATE); |
star297 | 0:0a76610c48a1 | 167 | cmd[1] = SWAP8(1); |
star297 | 0:0a76610c48a1 | 168 | chipSelect=1; |
star297 | 0:0a76610c48a1 | 169 | rowCount = 0; |
star297 | 0:0a76610c48a1 | 170 | display_write(); |
star297 | 0:0a76610c48a1 | 171 | } |
star297 | 0:0a76610c48a1 | 172 | |
star297 | 0:0a76610c48a1 | 173 | void SharpLCD::display_write() { |
star297 | 0:0a76610c48a1 | 174 | while(rowCount < DISPLAY_HEIGHT) { |
star297 | 0:0a76610c48a1 | 175 | // Determine the next line to send |
star297 | 0:0a76610c48a1 | 176 | if((RowState[rowCount / DISPLAY_BUFFER_TYPE_SIZE] & (1 << (rowCount % DISPLAY_BUFFER_TYPE_SIZE))) != 0) { |
star297 | 0:0a76610c48a1 | 177 | // Row has pixel changes, send this row to the display |
star297 | 0:0a76610c48a1 | 178 | cmd[1] = (uint8_t)SWAP8(rowCount+1); |
star297 | 0:0a76610c48a1 | 179 | |
star297 | 0:0a76610c48a1 | 180 | memcpy(&(cmd[2]), (const void*)&(pixelBuffer[rowCount*(DISPLAY_WIDTH/DISPLAY_BUFFER_TYPE_SIZE)]), DISPLAY_WIDTH / DISPLAY_BUFFER_TYPE_SIZE * sizeof(DISPLAY_BUFFER_TYPE)); |
star297 | 0:0a76610c48a1 | 181 | |
star297 | 0:0a76610c48a1 | 182 | int len=sizeof(cmd); |
star297 | 0:0a76610c48a1 | 183 | for(int i=0; i<len; i++) { |
star297 | 0:0a76610c48a1 | 184 | spi.fastWrite(cmd[i]); |
star297 | 0:0a76610c48a1 | 185 | } |
star297 | 0:0a76610c48a1 | 186 | // update pixel change status of this line as sent |
star297 | 0:0a76610c48a1 | 187 | RowState[rowCount / DISPLAY_BUFFER_TYPE_SIZE] &= ~(1 << (rowCount % DISPLAY_BUFFER_TYPE_SIZE)); |
star297 | 0:0a76610c48a1 | 188 | } |
star297 | 0:0a76610c48a1 | 189 | rowCount++; |
star297 | 0:0a76610c48a1 | 190 | } |
star297 | 0:0a76610c48a1 | 191 | // send end of transfer bytes |
star297 | 0:0a76610c48a1 | 192 | spi.fastWrite(cmd[0]); |
star297 | 0:0a76610c48a1 | 193 | spi.fastWrite(0xFF); |
star297 | 0:0a76610c48a1 | 194 | // clear SPI RX buffer |
star297 | 0:0a76610c48a1 | 195 | spi.clearRX(); |
star297 | 0:0a76610c48a1 | 196 | chipSelect = 0; |
star297 | 0:0a76610c48a1 | 197 | } |
star297 | 0:0a76610c48a1 | 198 | |
star297 | 0:0a76610c48a1 | 199 | void SharpLCD::pixel(int x, int y, int colour) { |
star297 | 0:0a76610c48a1 | 200 | uint8_t swapx = 7 - ((unsigned int)x & 0x07); |
star297 | 0:0a76610c48a1 | 201 | x = ((unsigned int)x & 0xFFFFFFF8) | swapx; |
star297 | 0:0a76610c48a1 | 202 | // determine if row has pixel changes |
star297 | 0:0a76610c48a1 | 203 | bool change = ((pixelBuffer[((y * DISPLAY_WIDTH) + x) / DISPLAY_BUFFER_TYPE_SIZE] & (1 << (x % DISPLAY_BUFFER_TYPE_SIZE))) != ((colour & 0x01) << (x % DISPLAY_BUFFER_TYPE_SIZE))); |
star297 | 0:0a76610c48a1 | 204 | if(change) { |
star297 | 0:0a76610c48a1 | 205 | // xor operation |
star297 | 0:0a76610c48a1 | 206 | pixelBuffer[((y * DISPLAY_WIDTH) + x) / DISPLAY_BUFFER_TYPE_SIZE] ^= (1 << (x % DISPLAY_BUFFER_TYPE_SIZE)); |
star297 | 0:0a76610c48a1 | 207 | // update pixel change status of this line |
star297 | 0:0a76610c48a1 | 208 | RowState[y / DISPLAY_BUFFER_TYPE_SIZE] |= (1 << (y % DISPLAY_BUFFER_TYPE_SIZE)); |
star297 | 0:0a76610c48a1 | 209 | } |
star297 | 0:0a76610c48a1 | 210 | } |
star297 | 0:0a76610c48a1 | 211 | |
star297 | 0:0a76610c48a1 | 212 | int SharpLCD::_putc(int value) { |
star297 | 0:0a76610c48a1 | 213 | if(value == '\n') { |
star297 | 0:0a76610c48a1 | 214 | _column = 0; |
star297 | 0:0a76610c48a1 | 215 | _row++; |
star297 | 0:0a76610c48a1 | 216 | if(_row >= rows()) { |
star297 | 0:0a76610c48a1 | 217 | _row = 0; |
star297 | 0:0a76610c48a1 | 218 | } |
star297 | 0:0a76610c48a1 | 219 | } else { |
star297 | 0:0a76610c48a1 | 220 | character(_column, _row, value); |
star297 | 0:0a76610c48a1 | 221 | _column++; |
star297 | 0:0a76610c48a1 | 222 | if(_column >= columns()) { |
star297 | 0:0a76610c48a1 | 223 | _column = 0; |
star297 | 0:0a76610c48a1 | 224 | _row++; |
star297 | 0:0a76610c48a1 | 225 | if(_row >= rows()) { |
star297 | 0:0a76610c48a1 | 226 | _row = 0; |
star297 | 0:0a76610c48a1 | 227 | } |
star297 | 0:0a76610c48a1 | 228 | } |
star297 | 0:0a76610c48a1 | 229 | } |
star297 | 0:0a76610c48a1 | 230 | return value; |
star297 | 0:0a76610c48a1 | 231 | } |
star297 | 0:0a76610c48a1 | 232 | |
star297 | 0:0a76610c48a1 | 233 | void SharpLCD::set_font(const unsigned char * f) { |
star297 | 0:0a76610c48a1 | 234 | font = f; |
star297 | 0:0a76610c48a1 | 235 | if (font==NULL){externalfont=0;} // set display.font |
star297 | 0:0a76610c48a1 | 236 | else{externalfont=1;} |
star297 | 0:0a76610c48a1 | 237 | } |
star297 | 0:0a76610c48a1 | 238 | |
star297 | 0:0a76610c48a1 | 239 | void SharpLCD::locate(int column, int row) { |
star297 | 0:0a76610c48a1 | 240 | _column = column; |
star297 | 0:0a76610c48a1 | 241 | _row = row; |
star297 | 0:0a76610c48a1 | 242 | char_x = column; |
star297 | 0:0a76610c48a1 | 243 | char_y = row; |
star297 | 0:0a76610c48a1 | 244 | } |
star297 | 0:0a76610c48a1 | 245 | |
star297 | 0:0a76610c48a1 | 246 | int SharpLCD::_getc() { |
star297 | 0:0a76610c48a1 | 247 | return -1; |
star297 | 0:0a76610c48a1 | 248 | } |
star297 | 0:0a76610c48a1 | 249 | |
star297 | 0:0a76610c48a1 | 250 | void SharpLCD::printf(const char* format, ...) { |
star297 | 0:0a76610c48a1 | 251 | char buffer[MAX_PRINTF_CHARS + 1] = { 0 }; |
star297 | 0:0a76610c48a1 | 252 | uint32_t iterator = 0; |
star297 | 0:0a76610c48a1 | 253 | va_list args; |
star297 | 0:0a76610c48a1 | 254 | va_start(args, format); |
star297 | 0:0a76610c48a1 | 255 | vsprintf(buffer, format, args); |
star297 | 0:0a76610c48a1 | 256 | va_end(args); |
star297 | 0:0a76610c48a1 | 257 | |
star297 | 0:0a76610c48a1 | 258 | while((buffer[iterator] != 0) && (iterator < MAX_PRINTF_CHARS)) { |
star297 | 0:0a76610c48a1 | 259 | _putc(buffer[iterator++]); |
star297 | 0:0a76610c48a1 | 260 | } |
star297 | 0:0a76610c48a1 | 261 | } |
star297 | 0:0a76610c48a1 | 262 | |
star297 | 0:0a76610c48a1 | 263 | void SharpLCD::character(int column, int row, int value) { |
star297 | 0:0a76610c48a1 | 264 | if(externalfont){ // send external font |
star297 | 0:0a76610c48a1 | 265 | unsigned int hor,vert,offset,bpl,j,i,b; |
star297 | 0:0a76610c48a1 | 266 | const unsigned char* sign; |
star297 | 0:0a76610c48a1 | 267 | unsigned char z,w; |
star297 | 0:0a76610c48a1 | 268 | if ((value < 31) || (value > 127)) return; // test char range |
star297 | 0:0a76610c48a1 | 269 | // read font parameter from start of array |
star297 | 0:0a76610c48a1 | 270 | offset = font[0]; // bytes / char |
star297 | 0:0a76610c48a1 | 271 | hor = font[1]; // get hor size of font |
star297 | 0:0a76610c48a1 | 272 | vert = font[2]; // get vert size of font |
star297 | 0:0a76610c48a1 | 273 | bpl = font[3]; // bytes per line |
star297 | 0:0a76610c48a1 | 274 | if (char_x + hor > width()) { |
star297 | 0:0a76610c48a1 | 275 | char_x = 0; |
star297 | 0:0a76610c48a1 | 276 | char_y = char_y + vert; |
star297 | 0:0a76610c48a1 | 277 | if (char_y >= height() - font[2]) { |
star297 | 0:0a76610c48a1 | 278 | char_y = 0; |
star297 | 0:0a76610c48a1 | 279 | } |
star297 | 0:0a76610c48a1 | 280 | } |
star297 | 0:0a76610c48a1 | 281 | window(char_x, char_y,hor,vert); |
star297 | 0:0a76610c48a1 | 282 | sign = &font[((value -32) * offset) + 4]; |
star297 | 0:0a76610c48a1 | 283 | w = sign[0]; |
star297 | 0:0a76610c48a1 | 284 | for (j=0; j<vert; j++) { |
star297 | 0:0a76610c48a1 | 285 | for (i=0; i<hor; i++) { |
star297 | 0:0a76610c48a1 | 286 | z = sign[bpl * i + ((j & 0xF8) >> 3)+1]; |
star297 | 0:0a76610c48a1 | 287 | b = 1 << (j & 0x07); |
star297 | 0:0a76610c48a1 | 288 | if (( z & b ) == 0x00) { |
star297 | 0:0a76610c48a1 | 289 | putp(foreground); |
star297 | 0:0a76610c48a1 | 290 | } |
star297 | 0:0a76610c48a1 | 291 | else { |
star297 | 0:0a76610c48a1 | 292 | putp(background); |
star297 | 0:0a76610c48a1 | 293 | } |
star297 | 0:0a76610c48a1 | 294 | } |
star297 | 0:0a76610c48a1 | 295 | } |
star297 | 0:0a76610c48a1 | 296 | if ((w + 2) < hor) { // x offset to next char |
star297 | 0:0a76610c48a1 | 297 | char_x += w + 2; |
star297 | 0:0a76610c48a1 | 298 | } |
star297 | 0:0a76610c48a1 | 299 | else char_x += hor; |
star297 | 0:0a76610c48a1 | 300 | } |
star297 | 0:0a76610c48a1 | 301 | // send default font using blitbit function |
star297 | 0:0a76610c48a1 | 302 | else{ |
star297 | 0:0a76610c48a1 | 303 | blitbit(column * 8, row * 8, 8, 8, (char*)&(FONT8x8[value - 0x1F][0])); |
star297 | 0:0a76610c48a1 | 304 | } |
star297 | 0:0a76610c48a1 | 305 | } |
star297 | 0:0a76610c48a1 | 306 | |
star297 | 0:0a76610c48a1 | 307 | void SharpLCD::window(int x, int y, int w, int h) { |
star297 | 0:0a76610c48a1 | 308 | // current pixel location |
star297 | 0:0a76610c48a1 | 309 | _x = x; |
star297 | 0:0a76610c48a1 | 310 | _y = y; |
star297 | 0:0a76610c48a1 | 311 | // window settings |
star297 | 0:0a76610c48a1 | 312 | _x1 = x; |
star297 | 0:0a76610c48a1 | 313 | _x2 = x + w - 1; |
star297 | 0:0a76610c48a1 | 314 | _y1 = y; |
star297 | 0:0a76610c48a1 | 315 | _y2 = y + h - 1; |
star297 | 0:0a76610c48a1 | 316 | } |
star297 | 0:0a76610c48a1 | 317 | |
star297 | 0:0a76610c48a1 | 318 | void SharpLCD::putp(int colour) { |
star297 | 0:0a76610c48a1 | 319 | pixel(_x, _y, colour); |
star297 | 0:0a76610c48a1 | 320 | _x++; |
star297 | 0:0a76610c48a1 | 321 | if(_x > _x2) { |
star297 | 0:0a76610c48a1 | 322 | _x = _x1; |
star297 | 0:0a76610c48a1 | 323 | _y++; |
star297 | 0:0a76610c48a1 | 324 | if(_y > _y2) { |
star297 | 0:0a76610c48a1 | 325 | _y = _y1; |
star297 | 0:0a76610c48a1 | 326 | } |
star297 | 0:0a76610c48a1 | 327 | } |
star297 | 0:0a76610c48a1 | 328 | } |
star297 | 0:0a76610c48a1 | 329 | |
star297 | 0:0a76610c48a1 | 330 | void SharpLCD::rect(int x0, int y0, int x1, int y1, int color) { |
star297 | 0:0a76610c48a1 | 331 | if (x1 > x0) hline(x0,x1,y0,color); |
star297 | 0:0a76610c48a1 | 332 | else hline(x1,x0,y0,color); |
star297 | 0:0a76610c48a1 | 333 | if (y1 > y0) vline(x0,y0,y1,color); |
star297 | 0:0a76610c48a1 | 334 | else vline(x0,y1,y0,color); |
star297 | 0:0a76610c48a1 | 335 | if (x1 > x0) hline(x0,x1,y1,color); |
star297 | 0:0a76610c48a1 | 336 | else hline(x1,x0,y1,color); |
star297 | 0:0a76610c48a1 | 337 | if (y1 > y0) vline(x1,y0,y1,color); |
star297 | 0:0a76610c48a1 | 338 | else vline(x1,y1,y0,color); |
star297 | 0:0a76610c48a1 | 339 | return; |
star297 | 0:0a76610c48a1 | 340 | } |
star297 | 0:0a76610c48a1 | 341 | |
star297 | 0:0a76610c48a1 | 342 | void SharpLCD::fillrect(int x0, int y0, int w, int h, int colour) { |
star297 | 0:0a76610c48a1 | 343 | unsigned long int index=0; |
star297 | 0:0a76610c48a1 | 344 | if (w < 0) { |
star297 | 0:0a76610c48a1 | 345 | x0 = x0 + w; |
star297 | 0:0a76610c48a1 | 346 | w = -w; |
star297 | 0:0a76610c48a1 | 347 | } |
star297 | 0:0a76610c48a1 | 348 | if (h < 0) { |
star297 | 0:0a76610c48a1 | 349 | y0 = y0 + h; |
star297 | 0:0a76610c48a1 | 350 | h = -h; |
star297 | 0:0a76610c48a1 | 351 | } |
star297 | 0:0a76610c48a1 | 352 | window(x0,y0,w,h); |
star297 | 0:0a76610c48a1 | 353 | int num = h*w; |
star297 | 0:0a76610c48a1 | 354 | for( index = 0; index<num; index++ ) { |
star297 | 0:0a76610c48a1 | 355 | putp(colour); |
star297 | 0:0a76610c48a1 | 356 | } |
star297 | 0:0a76610c48a1 | 357 | return; |
star297 | 0:0a76610c48a1 | 358 | } |
star297 | 0:0a76610c48a1 | 359 | |
star297 | 0:0a76610c48a1 | 360 | void SharpLCD::circle(int x, int y, int r,int colour){ |
star297 | 0:0a76610c48a1 | 361 | int ce = -r; |
star297 | 0:0a76610c48a1 | 362 | int cx = r; |
star297 | 0:0a76610c48a1 | 363 | int cy = 0; |
star297 | 0:0a76610c48a1 | 364 | while(cx >= cy){ |
star297 | 0:0a76610c48a1 | 365 | pixel(x+cx,y+cy,colour); |
star297 | 0:0a76610c48a1 | 366 | pixel(x-cx,y-cy,colour); |
star297 | 0:0a76610c48a1 | 367 | pixel(x-cx,y+cy,colour); |
star297 | 0:0a76610c48a1 | 368 | pixel(x+cx,y-cy,colour); |
star297 | 0:0a76610c48a1 | 369 | pixel(x+cy,y+cx,colour); |
star297 | 0:0a76610c48a1 | 370 | pixel(x-cy,y+cx,colour); |
star297 | 0:0a76610c48a1 | 371 | pixel(x-cy,y-cx,colour); |
star297 | 0:0a76610c48a1 | 372 | pixel(x+cy,y-cx,colour); |
star297 | 0:0a76610c48a1 | 373 | ce += 2*cy++ + 1; |
star297 | 0:0a76610c48a1 | 374 | if(ce >= 0){ |
star297 | 0:0a76610c48a1 | 375 | ce -= 2*cx---1; |
star297 | 0:0a76610c48a1 | 376 | } |
star297 | 0:0a76610c48a1 | 377 | } |
star297 | 0:0a76610c48a1 | 378 | } |
star297 | 0:0a76610c48a1 | 379 | |
star297 | 0:0a76610c48a1 | 380 | void SharpLCD::ellipse(int xc, int yc, int a, int b, unsigned int colour) |
star297 | 0:0a76610c48a1 | 381 | { |
star297 | 0:0a76610c48a1 | 382 | int x = 0, y = b; |
star297 | 0:0a76610c48a1 | 383 | long a2 = (long)a*a, b2 = (long)b*b; |
star297 | 0:0a76610c48a1 | 384 | long crit1 = -(a2/4 + a%2 + b2); |
star297 | 0:0a76610c48a1 | 385 | long crit2 = -(b2/4 + b%2 + a2); |
star297 | 0:0a76610c48a1 | 386 | long crit3 = -(b2/4 + b%2); |
star297 | 0:0a76610c48a1 | 387 | long t = -a2*y; |
star297 | 0:0a76610c48a1 | 388 | long dxt = 2*b2*x, dyt = -2*a2*y; |
star297 | 0:0a76610c48a1 | 389 | long d2xt = 2*b2, d2yt = 2*a2; |
star297 | 0:0a76610c48a1 | 390 | while (y>=0 && x<=a) { |
star297 | 0:0a76610c48a1 | 391 | pixel(xc+x, yc+y, colour); |
star297 | 0:0a76610c48a1 | 392 | if (x!=0 || y!=0) |
star297 | 0:0a76610c48a1 | 393 | pixel(xc-x, yc-y, colour); |
star297 | 0:0a76610c48a1 | 394 | if (x!=0 && y!=0) { |
star297 | 0:0a76610c48a1 | 395 | pixel(xc+x, yc-y, colour); |
star297 | 0:0a76610c48a1 | 396 | pixel(xc-x, yc+y, colour); |
star297 | 0:0a76610c48a1 | 397 | } |
star297 | 0:0a76610c48a1 | 398 | if (t + b2*x <= crit1 || |
star297 | 0:0a76610c48a1 | 399 | t + a2*y <= crit3) |
star297 | 0:0a76610c48a1 | 400 | incx(); |
star297 | 0:0a76610c48a1 | 401 | else if (t - a2*y > crit2) |
star297 | 0:0a76610c48a1 | 402 | incy(); |
star297 | 0:0a76610c48a1 | 403 | else { |
star297 | 0:0a76610c48a1 | 404 | incx(); |
star297 | 0:0a76610c48a1 | 405 | incy(); |
star297 | 0:0a76610c48a1 | 406 | } |
star297 | 0:0a76610c48a1 | 407 | } |
star297 | 0:0a76610c48a1 | 408 | } |
star297 | 0:0a76610c48a1 | 409 | |
star297 | 0:0a76610c48a1 | 410 | void SharpLCD::fillellipse(int xc, int yc, int a, int b, unsigned int colour) |
star297 | 0:0a76610c48a1 | 411 | { |
star297 | 0:0a76610c48a1 | 412 | int x = 0, y = b; |
star297 | 0:0a76610c48a1 | 413 | int rx = x, ry = y; |
star297 | 0:0a76610c48a1 | 414 | unsigned int width = 1; |
star297 | 0:0a76610c48a1 | 415 | unsigned int height = 1; |
star297 | 0:0a76610c48a1 | 416 | long a2 = (long)a*a, b2 = (long)b*b; |
star297 | 0:0a76610c48a1 | 417 | long crit1 = -(a2/4 + a%2 + b2); |
star297 | 0:0a76610c48a1 | 418 | long crit2 = -(b2/4 + b%2 + a2); |
star297 | 0:0a76610c48a1 | 419 | long crit3 = -(b2/4 + b%2); |
star297 | 0:0a76610c48a1 | 420 | long t = -a2*y; |
star297 | 0:0a76610c48a1 | 421 | long dxt = 2*b2*x, dyt = -2*a2*y; |
star297 | 0:0a76610c48a1 | 422 | long d2xt = 2*b2, d2yt = 2*a2; |
star297 | 0:0a76610c48a1 | 423 | if (b == 0) { |
star297 | 0:0a76610c48a1 | 424 | fillrect(xc-a, yc, 2*a+1, 1, colour); |
star297 | 0:0a76610c48a1 | 425 | return; |
star297 | 0:0a76610c48a1 | 426 | } |
star297 | 0:0a76610c48a1 | 427 | while (y>=0 && x<=a) { |
star297 | 0:0a76610c48a1 | 428 | if (t + b2*x <= crit1 || |
star297 | 0:0a76610c48a1 | 429 | t + a2*y <= crit3) { |
star297 | 0:0a76610c48a1 | 430 | if (height == 1) |
star297 | 0:0a76610c48a1 | 431 | ; |
star297 | 0:0a76610c48a1 | 432 | else if (ry*2+1 > (height-1)*2) { |
star297 | 0:0a76610c48a1 | 433 | fillrect(xc-rx, yc-ry, width, height-1, colour); |
star297 | 0:0a76610c48a1 | 434 | fillrect(xc-rx, yc+ry+1, width, 1-height, colour); |
star297 | 0:0a76610c48a1 | 435 | ry -= height-1; |
star297 | 0:0a76610c48a1 | 436 | height = 1; |
star297 | 0:0a76610c48a1 | 437 | } else { |
star297 | 0:0a76610c48a1 | 438 | fillrect(xc-rx, yc-ry, width, ry*2+1, colour); |
star297 | 0:0a76610c48a1 | 439 | ry -= ry; |
star297 | 0:0a76610c48a1 | 440 | height = 1; |
star297 | 0:0a76610c48a1 | 441 | } |
star297 | 0:0a76610c48a1 | 442 | incx(); |
star297 | 0:0a76610c48a1 | 443 | rx++; |
star297 | 0:0a76610c48a1 | 444 | width += 2; |
star297 | 0:0a76610c48a1 | 445 | } else if (t - a2*y > crit2) { |
star297 | 0:0a76610c48a1 | 446 | incy(); |
star297 | 0:0a76610c48a1 | 447 | height++; |
star297 | 0:0a76610c48a1 | 448 | } else { |
star297 | 0:0a76610c48a1 | 449 | if (ry*2+1 > height*2) { |
star297 | 0:0a76610c48a1 | 450 | fillrect(xc-rx, yc-ry, width, height, colour); |
star297 | 0:0a76610c48a1 | 451 | fillrect(xc-rx, yc+ry+1, width, -height, colour); |
star297 | 0:0a76610c48a1 | 452 | } else { |
star297 | 0:0a76610c48a1 | 453 | fillrect(xc-rx, yc-ry, width, ry*2+1, colour); |
star297 | 0:0a76610c48a1 | 454 | } |
star297 | 0:0a76610c48a1 | 455 | incx(); |
star297 | 0:0a76610c48a1 | 456 | incy(); |
star297 | 0:0a76610c48a1 | 457 | rx++; |
star297 | 0:0a76610c48a1 | 458 | width += 2; |
star297 | 0:0a76610c48a1 | 459 | ry -= height; |
star297 | 0:0a76610c48a1 | 460 | height = 1; |
star297 | 0:0a76610c48a1 | 461 | } |
star297 | 0:0a76610c48a1 | 462 | } |
star297 | 0:0a76610c48a1 | 463 | if (ry > height) { |
star297 | 0:0a76610c48a1 | 464 | fillrect(xc-rx, yc-ry, width, height, colour); |
star297 | 0:0a76610c48a1 | 465 | fillrect(xc-rx, yc+ry+1, width, -height, colour); |
star297 | 0:0a76610c48a1 | 466 | } else { |
star297 | 0:0a76610c48a1 | 467 | fillrect(xc-rx, yc-ry, width, ry*2+1, colour); |
star297 | 0:0a76610c48a1 | 468 | } |
star297 | 0:0a76610c48a1 | 469 | } |
star297 | 0:0a76610c48a1 | 470 | |
star297 | 0:0a76610c48a1 | 471 | void SharpLCD::line(int x0, int y0, int x1, int y1, int colour) { |
star297 | 0:0a76610c48a1 | 472 | int dx = 0, dy = 0; |
star297 | 0:0a76610c48a1 | 473 | int dx_sym = 0, dy_sym = 0; |
star297 | 0:0a76610c48a1 | 474 | int dx_x2 = 0, dy_x2 = 0; |
star297 | 0:0a76610c48a1 | 475 | int di = 0; |
star297 | 0:0a76610c48a1 | 476 | dx = x1-x0; |
star297 | 0:0a76610c48a1 | 477 | dy = y1-y0; |
star297 | 0:0a76610c48a1 | 478 | |
star297 | 0:0a76610c48a1 | 479 | if (dx == 0) { |
star297 | 0:0a76610c48a1 | 480 | if (y1 > y0) vline(x0,y0,y1,colour); |
star297 | 0:0a76610c48a1 | 481 | else vline(x0,y1,y0,colour); |
star297 | 0:0a76610c48a1 | 482 | return; |
star297 | 0:0a76610c48a1 | 483 | } |
star297 | 0:0a76610c48a1 | 484 | if (dx > 0) { |
star297 | 0:0a76610c48a1 | 485 | dx_sym = 1; |
star297 | 0:0a76610c48a1 | 486 | } else { |
star297 | 0:0a76610c48a1 | 487 | dx_sym = -1; |
star297 | 0:0a76610c48a1 | 488 | } |
star297 | 0:0a76610c48a1 | 489 | if (dy == 0) { |
star297 | 0:0a76610c48a1 | 490 | if (x1 > x0) hline(x0,x1,y0,colour); |
star297 | 0:0a76610c48a1 | 491 | else hline(x1,x0,y0,colour); |
star297 | 0:0a76610c48a1 | 492 | return; |
star297 | 0:0a76610c48a1 | 493 | } |
star297 | 0:0a76610c48a1 | 494 | if (dy > 0) { |
star297 | 0:0a76610c48a1 | 495 | dy_sym = 1; |
star297 | 0:0a76610c48a1 | 496 | } else { |
star297 | 0:0a76610c48a1 | 497 | dy_sym = -1; |
star297 | 0:0a76610c48a1 | 498 | } |
star297 | 0:0a76610c48a1 | 499 | dx = dx_sym*dx; |
star297 | 0:0a76610c48a1 | 500 | dy = dy_sym*dy; |
star297 | 0:0a76610c48a1 | 501 | dx_x2 = dx*2; |
star297 | 0:0a76610c48a1 | 502 | dy_x2 = dy*2; |
star297 | 0:0a76610c48a1 | 503 | if (dx >= dy) { |
star297 | 0:0a76610c48a1 | 504 | di = dy_x2 - dx; |
star297 | 0:0a76610c48a1 | 505 | while (x0 != x1) { |
star297 | 0:0a76610c48a1 | 506 | |
star297 | 0:0a76610c48a1 | 507 | pixel(x0, y0, colour); |
star297 | 0:0a76610c48a1 | 508 | x0 += dx_sym; |
star297 | 0:0a76610c48a1 | 509 | if (di<0) { |
star297 | 0:0a76610c48a1 | 510 | di += dy_x2; |
star297 | 0:0a76610c48a1 | 511 | } else { |
star297 | 0:0a76610c48a1 | 512 | di += dy_x2 - dx_x2; |
star297 | 0:0a76610c48a1 | 513 | y0 += dy_sym; |
star297 | 0:0a76610c48a1 | 514 | } |
star297 | 0:0a76610c48a1 | 515 | } |
star297 | 0:0a76610c48a1 | 516 | pixel(x0, y0, colour); |
star297 | 0:0a76610c48a1 | 517 | } else { |
star297 | 0:0a76610c48a1 | 518 | di = dx_x2 - dy; |
star297 | 0:0a76610c48a1 | 519 | while (y0 != y1) { |
star297 | 0:0a76610c48a1 | 520 | pixel(x0, y0, colour); |
star297 | 0:0a76610c48a1 | 521 | y0 += dy_sym; |
star297 | 0:0a76610c48a1 | 522 | if (di < 0) { |
star297 | 0:0a76610c48a1 | 523 | di += dx_x2; |
star297 | 0:0a76610c48a1 | 524 | } else { |
star297 | 0:0a76610c48a1 | 525 | di += dx_x2 - dy_x2; |
star297 | 0:0a76610c48a1 | 526 | x0 += dx_sym; |
star297 | 0:0a76610c48a1 | 527 | } |
star297 | 0:0a76610c48a1 | 528 | } |
star297 | 0:0a76610c48a1 | 529 | pixel(x0, y0, colour); |
star297 | 0:0a76610c48a1 | 530 | } |
star297 | 0:0a76610c48a1 | 531 | return; |
star297 | 0:0a76610c48a1 | 532 | } |
star297 | 0:0a76610c48a1 | 533 | |
star297 | 0:0a76610c48a1 | 534 | void SharpLCD::hline(int x0, int x1, int y, int colour) { |
star297 | 0:0a76610c48a1 | 535 | int w; |
star297 | 0:0a76610c48a1 | 536 | w = x1 - x0 + 1; |
star297 | 0:0a76610c48a1 | 537 | window(x0,y,w,1); |
star297 | 0:0a76610c48a1 | 538 | for (int x=0; x<w; x++) { |
star297 | 0:0a76610c48a1 | 539 | putp(colour); |
star297 | 0:0a76610c48a1 | 540 | } |
star297 | 0:0a76610c48a1 | 541 | return; |
star297 | 0:0a76610c48a1 | 542 | } |
star297 | 0:0a76610c48a1 | 543 | |
star297 | 0:0a76610c48a1 | 544 | void SharpLCD::vline(int x, int y0, int y1, int colour) { |
star297 | 0:0a76610c48a1 | 545 | int h; |
star297 | 0:0a76610c48a1 | 546 | h = y1 - y0 + 1; |
star297 | 0:0a76610c48a1 | 547 | window(x,y0,1,h); |
star297 | 0:0a76610c48a1 | 548 | for (int y=0; y<h; y++) { |
star297 | 0:0a76610c48a1 | 549 | putp(colour); |
star297 | 0:0a76610c48a1 | 550 | } |
star297 | 0:0a76610c48a1 | 551 | return; |
star297 | 0:0a76610c48a1 | 552 | } |
star297 | 0:0a76610c48a1 | 553 | |
star297 | 0:0a76610c48a1 | 554 | void SharpLCD::blit(int x, int y, int w, int h, const int *colour) { |
star297 | 0:0a76610c48a1 | 555 | window(x, y, w, h); |
star297 | 0:0a76610c48a1 | 556 | for(int i=0; i<w*h; i++) { |
star297 | 0:0a76610c48a1 | 557 | putp(colour[i]); |
star297 | 0:0a76610c48a1 | 558 | } |
star297 | 0:0a76610c48a1 | 559 | } |
star297 | 0:0a76610c48a1 | 560 | |
star297 | 0:0a76610c48a1 | 561 | void SharpLCD::blitbit(int x, int y, int w, int h, const char* colour) { |
star297 | 0:0a76610c48a1 | 562 | window(x, y, w, h); |
star297 | 0:0a76610c48a1 | 563 | for(int i = 0; i < w*h; i++) { |
star297 | 0:0a76610c48a1 | 564 | char byte = colour[i >> 3]; |
star297 | 0:0a76610c48a1 | 565 | int offset = i & 0x7; |
star297 | 0:0a76610c48a1 | 566 | int c = ((byte << (offset)) & 0x80) ? background : foreground; |
star297 | 0:0a76610c48a1 | 567 | putp(c); |
star297 | 0:0a76610c48a1 | 568 | } |
star297 | 0:0a76610c48a1 | 569 | } |
star297 | 0:0a76610c48a1 | 570 | |
star297 | 0:0a76610c48a1 | 571 | int SharpLCD::columns() { |
star297 | 0:0a76610c48a1 | 572 | return width() / 8; |
star297 | 0:0a76610c48a1 | 573 | } |
star297 | 0:0a76610c48a1 | 574 | |
star297 | 0:0a76610c48a1 | 575 | int SharpLCD::rows() { |
star297 | 0:0a76610c48a1 | 576 | return height() / 8; |
star297 | 0:0a76610c48a1 | 577 | } |
star297 | 0:0a76610c48a1 | 578 | |
star297 | 0:0a76610c48a1 | 579 | int SharpLCD::width() { |
star297 | 0:0a76610c48a1 | 580 | return DISPLAY_WIDTH; |
star297 | 0:0a76610c48a1 | 581 | } |
star297 | 0:0a76610c48a1 | 582 | |
star297 | 0:0a76610c48a1 | 583 | int SharpLCD::height() { |
star297 | 0:0a76610c48a1 | 584 | return DISPLAY_HEIGHT; |
star297 | 0:0a76610c48a1 | 585 | } |
star297 | 0:0a76610c48a1 | 586 | |
star297 | 0:0a76610c48a1 | 587 | void SharpLCD::showBMP(const uint8_t* bitmap, const uint32_t bmpWidth, const uint32_t bmpHeight, const uint32_t startX, const uint32_t startY) { |
star297 | 0:0a76610c48a1 | 588 | uint32_t bitmapLine = 0, y = startY, bytesPerLine = ((bmpWidth >= (DISPLAY_WIDTH - startX)) ? (DISPLAY_WIDTH - startX) : bmpWidth) / 8; |
star297 | 0:0a76610c48a1 | 589 | |
star297 | 0:0a76610c48a1 | 590 | // Apply constraints |
star297 | 0:0a76610c48a1 | 591 | if((bmpWidth & 0x07) != 0) return; |
star297 | 0:0a76610c48a1 | 592 | if(startX >= DISPLAY_WIDTH) return; |
star297 | 0:0a76610c48a1 | 593 | |
star297 | 0:0a76610c48a1 | 594 | // Copy over bytes to pixel buffer |
star297 | 0:0a76610c48a1 | 595 | for(; y < startY + bmpHeight; y++) { |
star297 | 0:0a76610c48a1 | 596 | memcpy( (void*) &(((uint8_t*)pixelBuffer)[((y * DISPLAY_WIDTH) + startX) / 8]), |
star297 | 0:0a76610c48a1 | 597 | (const void*) &(bitmap[bitmapLine * (bmpWidth / 8)]), |
star297 | 0:0a76610c48a1 | 598 | bytesPerLine); |
star297 | 0:0a76610c48a1 | 599 | RowState[y / DISPLAY_BUFFER_TYPE_SIZE] |= (1 << (y % DISPLAY_BUFFER_TYPE_SIZE)); |
star297 | 0:0a76610c48a1 | 600 | bitmapLine++; |
star297 | 0:0a76610c48a1 | 601 | } |
star297 | 0:0a76610c48a1 | 602 | return; |
star297 | 0:0a76610c48a1 | 603 | } |
star297 | 0:0a76610c48a1 | 604 |