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 Paul Staron

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?

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