Sharp Memory LCD library

Dependencies:   Fonts Images BurstSPI

Committer:
star297
Date:
Sun Aug 23 16:21:57 2015 +0000
Revision:
0:0a76610c48a1
Added Font and Image files

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
star297 0:0a76610c48a1 115 spi.frequency(3500000);// 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
star297 0:0a76610c48a1 144 void SharpLCD::clearImmediate() {
star297 0:0a76610c48a1 145 // Clear out the pixel buffer
star297 0:0a76610c48a1 146 memset((void*)pixelBuffer, foreground, sizeof(pixelBuffer));
star297 0:0a76610c48a1 147 memset((void*)RowState, 0, sizeof(RowState));
star297 0:0a76610c48a1 148 chipSelect = 1;
star297 0:0a76610c48a1 149 // send clear command to display
star297 0:0a76610c48a1 150 cmd[0] = (uint8_t)(SWAP8(SharpLCD_CMD_ALL_CLEAR | lcdPolarity));
star297 0:0a76610c48a1 151 cmd[1] = 0;
star297 0:0a76610c48a1 152 spi.fastWrite(cmd[0]);
star297 0:0a76610c48a1 153 spi.fastWrite(cmd[1]);
star297 0:0a76610c48a1 154 spi.clearRX();
star297 0:0a76610c48a1 155 chipSelect = 0;
star297 0:0a76610c48a1 156 }
star297 0:0a76610c48a1 157
star297 0:0a76610c48a1 158 void SharpLCD::update() {
star297 0:0a76610c48a1 159 //Initialize the command vector
star297 0:0a76610c48a1 160 cmd[0] = (uint8_t)SWAP8(SharpLCD_CMD_UPDATE);
star297 0:0a76610c48a1 161 cmd[1] = SWAP8(1);
star297 0:0a76610c48a1 162 chipSelect=1;
star297 0:0a76610c48a1 163 rowCount = 0;
star297 0:0a76610c48a1 164 display_write();
star297 0:0a76610c48a1 165 }
star297 0:0a76610c48a1 166
star297 0:0a76610c48a1 167 void SharpLCD::display_write() {
star297 0:0a76610c48a1 168 while(rowCount < DISPLAY_HEIGHT) {
star297 0:0a76610c48a1 169 // Determine the next line to send
star297 0:0a76610c48a1 170 if((RowState[rowCount / DISPLAY_BUFFER_TYPE_SIZE] & (1 << (rowCount % DISPLAY_BUFFER_TYPE_SIZE))) != 0) {
star297 0:0a76610c48a1 171 // Row has pixel changes, send this row to the display
star297 0:0a76610c48a1 172 cmd[1] = (uint8_t)SWAP8(rowCount+1);
star297 0:0a76610c48a1 173
star297 0:0a76610c48a1 174 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 175
star297 0:0a76610c48a1 176 int len=sizeof(cmd);
star297 0:0a76610c48a1 177 for(int i=0; i<len; i++) {
star297 0:0a76610c48a1 178 spi.fastWrite(cmd[i]);
star297 0:0a76610c48a1 179 }
star297 0:0a76610c48a1 180 // update pixel change status of this line as sent
star297 0:0a76610c48a1 181 RowState[rowCount / DISPLAY_BUFFER_TYPE_SIZE] &= ~(1 << (rowCount % DISPLAY_BUFFER_TYPE_SIZE));
star297 0:0a76610c48a1 182 }
star297 0:0a76610c48a1 183 rowCount++;
star297 0:0a76610c48a1 184 }
star297 0:0a76610c48a1 185 // send end of transfer bytes
star297 0:0a76610c48a1 186 spi.fastWrite(cmd[0]);
star297 0:0a76610c48a1 187 spi.fastWrite(0xFF);
star297 0:0a76610c48a1 188 // clear SPI RX buffer
star297 0:0a76610c48a1 189 spi.clearRX();
star297 0:0a76610c48a1 190 chipSelect = 0;
star297 0:0a76610c48a1 191 }
star297 0:0a76610c48a1 192
star297 0:0a76610c48a1 193 void SharpLCD::pixel(int x, int y, int colour) {
star297 0:0a76610c48a1 194 uint8_t swapx = 7 - ((unsigned int)x & 0x07);
star297 0:0a76610c48a1 195 x = ((unsigned int)x & 0xFFFFFFF8) | swapx;
star297 0:0a76610c48a1 196 // determine if row has pixel changes
star297 0:0a76610c48a1 197 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 198 if(change) {
star297 0:0a76610c48a1 199 // xor operation
star297 0:0a76610c48a1 200 pixelBuffer[((y * DISPLAY_WIDTH) + x) / DISPLAY_BUFFER_TYPE_SIZE] ^= (1 << (x % DISPLAY_BUFFER_TYPE_SIZE));
star297 0:0a76610c48a1 201 // update pixel change status of this line
star297 0:0a76610c48a1 202 RowState[y / DISPLAY_BUFFER_TYPE_SIZE] |= (1 << (y % DISPLAY_BUFFER_TYPE_SIZE));
star297 0:0a76610c48a1 203 }
star297 0:0a76610c48a1 204 }
star297 0:0a76610c48a1 205
star297 0:0a76610c48a1 206 int SharpLCD::_putc(int value) {
star297 0:0a76610c48a1 207 if(value == '\n') {
star297 0:0a76610c48a1 208 _column = 0;
star297 0:0a76610c48a1 209 _row++;
star297 0:0a76610c48a1 210 if(_row >= rows()) {
star297 0:0a76610c48a1 211 _row = 0;
star297 0:0a76610c48a1 212 }
star297 0:0a76610c48a1 213 } else {
star297 0:0a76610c48a1 214 character(_column, _row, value);
star297 0:0a76610c48a1 215 _column++;
star297 0:0a76610c48a1 216 if(_column >= columns()) {
star297 0:0a76610c48a1 217 _column = 0;
star297 0:0a76610c48a1 218 _row++;
star297 0:0a76610c48a1 219 if(_row >= rows()) {
star297 0:0a76610c48a1 220 _row = 0;
star297 0:0a76610c48a1 221 }
star297 0:0a76610c48a1 222 }
star297 0:0a76610c48a1 223 }
star297 0:0a76610c48a1 224 return value;
star297 0:0a76610c48a1 225 }
star297 0:0a76610c48a1 226
star297 0:0a76610c48a1 227 void SharpLCD::set_font(const unsigned char * f) {
star297 0:0a76610c48a1 228 font = f;
star297 0:0a76610c48a1 229 if (font==NULL){externalfont=0;} // set display.font
star297 0:0a76610c48a1 230 else{externalfont=1;}
star297 0:0a76610c48a1 231 }
star297 0:0a76610c48a1 232
star297 0:0a76610c48a1 233 void SharpLCD::locate(int column, int row) {
star297 0:0a76610c48a1 234 _column = column;
star297 0:0a76610c48a1 235 _row = row;
star297 0:0a76610c48a1 236 char_x = column;
star297 0:0a76610c48a1 237 char_y = row;
star297 0:0a76610c48a1 238 }
star297 0:0a76610c48a1 239
star297 0:0a76610c48a1 240 int SharpLCD::_getc() {
star297 0:0a76610c48a1 241 return -1;
star297 0:0a76610c48a1 242 }
star297 0:0a76610c48a1 243
star297 0:0a76610c48a1 244 void SharpLCD::printf(const char* format, ...) {
star297 0:0a76610c48a1 245 char buffer[MAX_PRINTF_CHARS + 1] = { 0 };
star297 0:0a76610c48a1 246 uint32_t iterator = 0;
star297 0:0a76610c48a1 247 va_list args;
star297 0:0a76610c48a1 248 va_start(args, format);
star297 0:0a76610c48a1 249 vsprintf(buffer, format, args);
star297 0:0a76610c48a1 250 va_end(args);
star297 0:0a76610c48a1 251
star297 0:0a76610c48a1 252 while((buffer[iterator] != 0) && (iterator < MAX_PRINTF_CHARS)) {
star297 0:0a76610c48a1 253 _putc(buffer[iterator++]);
star297 0:0a76610c48a1 254 }
star297 0:0a76610c48a1 255 }
star297 0:0a76610c48a1 256
star297 0:0a76610c48a1 257 void SharpLCD::character(int column, int row, int value) {
star297 0:0a76610c48a1 258 if(externalfont){ // send external font
star297 0:0a76610c48a1 259 unsigned int hor,vert,offset,bpl,j,i,b;
star297 0:0a76610c48a1 260 const unsigned char* sign;
star297 0:0a76610c48a1 261 unsigned char z,w;
star297 0:0a76610c48a1 262 if ((value < 31) || (value > 127)) return; // test char range
star297 0:0a76610c48a1 263 // read font parameter from start of array
star297 0:0a76610c48a1 264 offset = font[0]; // bytes / char
star297 0:0a76610c48a1 265 hor = font[1]; // get hor size of font
star297 0:0a76610c48a1 266 vert = font[2]; // get vert size of font
star297 0:0a76610c48a1 267 bpl = font[3]; // bytes per line
star297 0:0a76610c48a1 268 if (char_x + hor > width()) {
star297 0:0a76610c48a1 269 char_x = 0;
star297 0:0a76610c48a1 270 char_y = char_y + vert;
star297 0:0a76610c48a1 271 if (char_y >= height() - font[2]) {
star297 0:0a76610c48a1 272 char_y = 0;
star297 0:0a76610c48a1 273 }
star297 0:0a76610c48a1 274 }
star297 0:0a76610c48a1 275 window(char_x, char_y,hor,vert);
star297 0:0a76610c48a1 276 sign = &font[((value -32) * offset) + 4];
star297 0:0a76610c48a1 277 w = sign[0];
star297 0:0a76610c48a1 278 for (j=0; j<vert; j++) {
star297 0:0a76610c48a1 279 for (i=0; i<hor; i++) {
star297 0:0a76610c48a1 280 z = sign[bpl * i + ((j & 0xF8) >> 3)+1];
star297 0:0a76610c48a1 281 b = 1 << (j & 0x07);
star297 0:0a76610c48a1 282 if (( z & b ) == 0x00) {
star297 0:0a76610c48a1 283 putp(foreground);
star297 0:0a76610c48a1 284 }
star297 0:0a76610c48a1 285 else {
star297 0:0a76610c48a1 286 putp(background);
star297 0:0a76610c48a1 287 }
star297 0:0a76610c48a1 288 }
star297 0:0a76610c48a1 289 }
star297 0:0a76610c48a1 290 if ((w + 2) < hor) { // x offset to next char
star297 0:0a76610c48a1 291 char_x += w + 2;
star297 0:0a76610c48a1 292 }
star297 0:0a76610c48a1 293 else char_x += hor;
star297 0:0a76610c48a1 294 }
star297 0:0a76610c48a1 295 // send default font using blitbit function
star297 0:0a76610c48a1 296 else{
star297 0:0a76610c48a1 297 blitbit(column * 8, row * 8, 8, 8, (char*)&(FONT8x8[value - 0x1F][0]));
star297 0:0a76610c48a1 298 }
star297 0:0a76610c48a1 299 }
star297 0:0a76610c48a1 300
star297 0:0a76610c48a1 301 void SharpLCD::window(int x, int y, int w, int h) {
star297 0:0a76610c48a1 302 // current pixel location
star297 0:0a76610c48a1 303 _x = x;
star297 0:0a76610c48a1 304 _y = y;
star297 0:0a76610c48a1 305 // window settings
star297 0:0a76610c48a1 306 _x1 = x;
star297 0:0a76610c48a1 307 _x2 = x + w - 1;
star297 0:0a76610c48a1 308 _y1 = y;
star297 0:0a76610c48a1 309 _y2 = y + h - 1;
star297 0:0a76610c48a1 310 }
star297 0:0a76610c48a1 311
star297 0:0a76610c48a1 312 void SharpLCD::putp(int colour) {
star297 0:0a76610c48a1 313 pixel(_x, _y, colour);
star297 0:0a76610c48a1 314 _x++;
star297 0:0a76610c48a1 315 if(_x > _x2) {
star297 0:0a76610c48a1 316 _x = _x1;
star297 0:0a76610c48a1 317 _y++;
star297 0:0a76610c48a1 318 if(_y > _y2) {
star297 0:0a76610c48a1 319 _y = _y1;
star297 0:0a76610c48a1 320 }
star297 0:0a76610c48a1 321 }
star297 0:0a76610c48a1 322 }
star297 0:0a76610c48a1 323
star297 0:0a76610c48a1 324 void SharpLCD::rect(int x0, int y0, int x1, int y1, int color) {
star297 0:0a76610c48a1 325 if (x1 > x0) hline(x0,x1,y0,color);
star297 0:0a76610c48a1 326 else hline(x1,x0,y0,color);
star297 0:0a76610c48a1 327 if (y1 > y0) vline(x0,y0,y1,color);
star297 0:0a76610c48a1 328 else vline(x0,y1,y0,color);
star297 0:0a76610c48a1 329 if (x1 > x0) hline(x0,x1,y1,color);
star297 0:0a76610c48a1 330 else hline(x1,x0,y1,color);
star297 0:0a76610c48a1 331 if (y1 > y0) vline(x1,y0,y1,color);
star297 0:0a76610c48a1 332 else vline(x1,y1,y0,color);
star297 0:0a76610c48a1 333 return;
star297 0:0a76610c48a1 334 }
star297 0:0a76610c48a1 335
star297 0:0a76610c48a1 336 void SharpLCD::fillrect(int x0, int y0, int w, int h, int colour) {
star297 0:0a76610c48a1 337 unsigned long int index=0;
star297 0:0a76610c48a1 338 if (w < 0) {
star297 0:0a76610c48a1 339 x0 = x0 + w;
star297 0:0a76610c48a1 340 w = -w;
star297 0:0a76610c48a1 341 }
star297 0:0a76610c48a1 342 if (h < 0) {
star297 0:0a76610c48a1 343 y0 = y0 + h;
star297 0:0a76610c48a1 344 h = -h;
star297 0:0a76610c48a1 345 }
star297 0:0a76610c48a1 346 window(x0,y0,w,h);
star297 0:0a76610c48a1 347 int num = h*w;
star297 0:0a76610c48a1 348 for( index = 0; index<num; index++ ) {
star297 0:0a76610c48a1 349 putp(colour);
star297 0:0a76610c48a1 350 }
star297 0:0a76610c48a1 351 return;
star297 0:0a76610c48a1 352 }
star297 0:0a76610c48a1 353
star297 0:0a76610c48a1 354 void SharpLCD::circle(int x, int y, int r,int colour){
star297 0:0a76610c48a1 355 int ce = -r;
star297 0:0a76610c48a1 356 int cx = r;
star297 0:0a76610c48a1 357 int cy = 0;
star297 0:0a76610c48a1 358 while(cx >= cy){
star297 0:0a76610c48a1 359 pixel(x+cx,y+cy,colour);
star297 0:0a76610c48a1 360 pixel(x-cx,y-cy,colour);
star297 0:0a76610c48a1 361 pixel(x-cx,y+cy,colour);
star297 0:0a76610c48a1 362 pixel(x+cx,y-cy,colour);
star297 0:0a76610c48a1 363 pixel(x+cy,y+cx,colour);
star297 0:0a76610c48a1 364 pixel(x-cy,y+cx,colour);
star297 0:0a76610c48a1 365 pixel(x-cy,y-cx,colour);
star297 0:0a76610c48a1 366 pixel(x+cy,y-cx,colour);
star297 0:0a76610c48a1 367 ce += 2*cy++ + 1;
star297 0:0a76610c48a1 368 if(ce >= 0){
star297 0:0a76610c48a1 369 ce -= 2*cx---1;
star297 0:0a76610c48a1 370 }
star297 0:0a76610c48a1 371 }
star297 0:0a76610c48a1 372 }
star297 0:0a76610c48a1 373
star297 0:0a76610c48a1 374 void SharpLCD::ellipse(int xc, int yc, int a, int b, unsigned int colour)
star297 0:0a76610c48a1 375 {
star297 0:0a76610c48a1 376 int x = 0, y = b;
star297 0:0a76610c48a1 377 long a2 = (long)a*a, b2 = (long)b*b;
star297 0:0a76610c48a1 378 long crit1 = -(a2/4 + a%2 + b2);
star297 0:0a76610c48a1 379 long crit2 = -(b2/4 + b%2 + a2);
star297 0:0a76610c48a1 380 long crit3 = -(b2/4 + b%2);
star297 0:0a76610c48a1 381 long t = -a2*y;
star297 0:0a76610c48a1 382 long dxt = 2*b2*x, dyt = -2*a2*y;
star297 0:0a76610c48a1 383 long d2xt = 2*b2, d2yt = 2*a2;
star297 0:0a76610c48a1 384 while (y>=0 && x<=a) {
star297 0:0a76610c48a1 385 pixel(xc+x, yc+y, colour);
star297 0:0a76610c48a1 386 if (x!=0 || y!=0)
star297 0:0a76610c48a1 387 pixel(xc-x, yc-y, colour);
star297 0:0a76610c48a1 388 if (x!=0 && y!=0) {
star297 0:0a76610c48a1 389 pixel(xc+x, yc-y, colour);
star297 0:0a76610c48a1 390 pixel(xc-x, yc+y, colour);
star297 0:0a76610c48a1 391 }
star297 0:0a76610c48a1 392 if (t + b2*x <= crit1 ||
star297 0:0a76610c48a1 393 t + a2*y <= crit3)
star297 0:0a76610c48a1 394 incx();
star297 0:0a76610c48a1 395 else if (t - a2*y > crit2)
star297 0:0a76610c48a1 396 incy();
star297 0:0a76610c48a1 397 else {
star297 0:0a76610c48a1 398 incx();
star297 0:0a76610c48a1 399 incy();
star297 0:0a76610c48a1 400 }
star297 0:0a76610c48a1 401 }
star297 0:0a76610c48a1 402 }
star297 0:0a76610c48a1 403
star297 0:0a76610c48a1 404 void SharpLCD::fillellipse(int xc, int yc, int a, int b, unsigned int colour)
star297 0:0a76610c48a1 405 {
star297 0:0a76610c48a1 406 int x = 0, y = b;
star297 0:0a76610c48a1 407 int rx = x, ry = y;
star297 0:0a76610c48a1 408 unsigned int width = 1;
star297 0:0a76610c48a1 409 unsigned int height = 1;
star297 0:0a76610c48a1 410 long a2 = (long)a*a, b2 = (long)b*b;
star297 0:0a76610c48a1 411 long crit1 = -(a2/4 + a%2 + b2);
star297 0:0a76610c48a1 412 long crit2 = -(b2/4 + b%2 + a2);
star297 0:0a76610c48a1 413 long crit3 = -(b2/4 + b%2);
star297 0:0a76610c48a1 414 long t = -a2*y;
star297 0:0a76610c48a1 415 long dxt = 2*b2*x, dyt = -2*a2*y;
star297 0:0a76610c48a1 416 long d2xt = 2*b2, d2yt = 2*a2;
star297 0:0a76610c48a1 417 if (b == 0) {
star297 0:0a76610c48a1 418 fillrect(xc-a, yc, 2*a+1, 1, colour);
star297 0:0a76610c48a1 419 return;
star297 0:0a76610c48a1 420 }
star297 0:0a76610c48a1 421 while (y>=0 && x<=a) {
star297 0:0a76610c48a1 422 if (t + b2*x <= crit1 ||
star297 0:0a76610c48a1 423 t + a2*y <= crit3) {
star297 0:0a76610c48a1 424 if (height == 1)
star297 0:0a76610c48a1 425 ;
star297 0:0a76610c48a1 426 else if (ry*2+1 > (height-1)*2) {
star297 0:0a76610c48a1 427 fillrect(xc-rx, yc-ry, width, height-1, colour);
star297 0:0a76610c48a1 428 fillrect(xc-rx, yc+ry+1, width, 1-height, colour);
star297 0:0a76610c48a1 429 ry -= height-1;
star297 0:0a76610c48a1 430 height = 1;
star297 0:0a76610c48a1 431 } else {
star297 0:0a76610c48a1 432 fillrect(xc-rx, yc-ry, width, ry*2+1, colour);
star297 0:0a76610c48a1 433 ry -= ry;
star297 0:0a76610c48a1 434 height = 1;
star297 0:0a76610c48a1 435 }
star297 0:0a76610c48a1 436 incx();
star297 0:0a76610c48a1 437 rx++;
star297 0:0a76610c48a1 438 width += 2;
star297 0:0a76610c48a1 439 } else if (t - a2*y > crit2) {
star297 0:0a76610c48a1 440 incy();
star297 0:0a76610c48a1 441 height++;
star297 0:0a76610c48a1 442 } else {
star297 0:0a76610c48a1 443 if (ry*2+1 > height*2) {
star297 0:0a76610c48a1 444 fillrect(xc-rx, yc-ry, width, height, colour);
star297 0:0a76610c48a1 445 fillrect(xc-rx, yc+ry+1, width, -height, colour);
star297 0:0a76610c48a1 446 } else {
star297 0:0a76610c48a1 447 fillrect(xc-rx, yc-ry, width, ry*2+1, colour);
star297 0:0a76610c48a1 448 }
star297 0:0a76610c48a1 449 incx();
star297 0:0a76610c48a1 450 incy();
star297 0:0a76610c48a1 451 rx++;
star297 0:0a76610c48a1 452 width += 2;
star297 0:0a76610c48a1 453 ry -= height;
star297 0:0a76610c48a1 454 height = 1;
star297 0:0a76610c48a1 455 }
star297 0:0a76610c48a1 456 }
star297 0:0a76610c48a1 457 if (ry > height) {
star297 0:0a76610c48a1 458 fillrect(xc-rx, yc-ry, width, height, colour);
star297 0:0a76610c48a1 459 fillrect(xc-rx, yc+ry+1, width, -height, colour);
star297 0:0a76610c48a1 460 } else {
star297 0:0a76610c48a1 461 fillrect(xc-rx, yc-ry, width, ry*2+1, colour);
star297 0:0a76610c48a1 462 }
star297 0:0a76610c48a1 463 }
star297 0:0a76610c48a1 464
star297 0:0a76610c48a1 465 void SharpLCD::line(int x0, int y0, int x1, int y1, int colour) {
star297 0:0a76610c48a1 466 int dx = 0, dy = 0;
star297 0:0a76610c48a1 467 int dx_sym = 0, dy_sym = 0;
star297 0:0a76610c48a1 468 int dx_x2 = 0, dy_x2 = 0;
star297 0:0a76610c48a1 469 int di = 0;
star297 0:0a76610c48a1 470 dx = x1-x0;
star297 0:0a76610c48a1 471 dy = y1-y0;
star297 0:0a76610c48a1 472
star297 0:0a76610c48a1 473 if (dx == 0) {
star297 0:0a76610c48a1 474 if (y1 > y0) vline(x0,y0,y1,colour);
star297 0:0a76610c48a1 475 else vline(x0,y1,y0,colour);
star297 0:0a76610c48a1 476 return;
star297 0:0a76610c48a1 477 }
star297 0:0a76610c48a1 478 if (dx > 0) {
star297 0:0a76610c48a1 479 dx_sym = 1;
star297 0:0a76610c48a1 480 } else {
star297 0:0a76610c48a1 481 dx_sym = -1;
star297 0:0a76610c48a1 482 }
star297 0:0a76610c48a1 483 if (dy == 0) {
star297 0:0a76610c48a1 484 if (x1 > x0) hline(x0,x1,y0,colour);
star297 0:0a76610c48a1 485 else hline(x1,x0,y0,colour);
star297 0:0a76610c48a1 486 return;
star297 0:0a76610c48a1 487 }
star297 0:0a76610c48a1 488 if (dy > 0) {
star297 0:0a76610c48a1 489 dy_sym = 1;
star297 0:0a76610c48a1 490 } else {
star297 0:0a76610c48a1 491 dy_sym = -1;
star297 0:0a76610c48a1 492 }
star297 0:0a76610c48a1 493 dx = dx_sym*dx;
star297 0:0a76610c48a1 494 dy = dy_sym*dy;
star297 0:0a76610c48a1 495 dx_x2 = dx*2;
star297 0:0a76610c48a1 496 dy_x2 = dy*2;
star297 0:0a76610c48a1 497 if (dx >= dy) {
star297 0:0a76610c48a1 498 di = dy_x2 - dx;
star297 0:0a76610c48a1 499 while (x0 != x1) {
star297 0:0a76610c48a1 500
star297 0:0a76610c48a1 501 pixel(x0, y0, colour);
star297 0:0a76610c48a1 502 x0 += dx_sym;
star297 0:0a76610c48a1 503 if (di<0) {
star297 0:0a76610c48a1 504 di += dy_x2;
star297 0:0a76610c48a1 505 } else {
star297 0:0a76610c48a1 506 di += dy_x2 - dx_x2;
star297 0:0a76610c48a1 507 y0 += dy_sym;
star297 0:0a76610c48a1 508 }
star297 0:0a76610c48a1 509 }
star297 0:0a76610c48a1 510 pixel(x0, y0, colour);
star297 0:0a76610c48a1 511 } else {
star297 0:0a76610c48a1 512 di = dx_x2 - dy;
star297 0:0a76610c48a1 513 while (y0 != y1) {
star297 0:0a76610c48a1 514 pixel(x0, y0, colour);
star297 0:0a76610c48a1 515 y0 += dy_sym;
star297 0:0a76610c48a1 516 if (di < 0) {
star297 0:0a76610c48a1 517 di += dx_x2;
star297 0:0a76610c48a1 518 } else {
star297 0:0a76610c48a1 519 di += dx_x2 - dy_x2;
star297 0:0a76610c48a1 520 x0 += dx_sym;
star297 0:0a76610c48a1 521 }
star297 0:0a76610c48a1 522 }
star297 0:0a76610c48a1 523 pixel(x0, y0, colour);
star297 0:0a76610c48a1 524 }
star297 0:0a76610c48a1 525 return;
star297 0:0a76610c48a1 526 }
star297 0:0a76610c48a1 527
star297 0:0a76610c48a1 528 void SharpLCD::hline(int x0, int x1, int y, int colour) {
star297 0:0a76610c48a1 529 int w;
star297 0:0a76610c48a1 530 w = x1 - x0 + 1;
star297 0:0a76610c48a1 531 window(x0,y,w,1);
star297 0:0a76610c48a1 532 for (int x=0; x<w; x++) {
star297 0:0a76610c48a1 533 putp(colour);
star297 0:0a76610c48a1 534 }
star297 0:0a76610c48a1 535 return;
star297 0:0a76610c48a1 536 }
star297 0:0a76610c48a1 537
star297 0:0a76610c48a1 538 void SharpLCD::vline(int x, int y0, int y1, int colour) {
star297 0:0a76610c48a1 539 int h;
star297 0:0a76610c48a1 540 h = y1 - y0 + 1;
star297 0:0a76610c48a1 541 window(x,y0,1,h);
star297 0:0a76610c48a1 542 for (int y=0; y<h; y++) {
star297 0:0a76610c48a1 543 putp(colour);
star297 0:0a76610c48a1 544 }
star297 0:0a76610c48a1 545 return;
star297 0:0a76610c48a1 546 }
star297 0:0a76610c48a1 547
star297 0:0a76610c48a1 548 void SharpLCD::blit(int x, int y, int w, int h, const int *colour) {
star297 0:0a76610c48a1 549 window(x, y, w, h);
star297 0:0a76610c48a1 550 for(int i=0; i<w*h; i++) {
star297 0:0a76610c48a1 551 putp(colour[i]);
star297 0:0a76610c48a1 552 }
star297 0:0a76610c48a1 553 }
star297 0:0a76610c48a1 554
star297 0:0a76610c48a1 555 void SharpLCD::blitbit(int x, int y, int w, int h, const char* colour) {
star297 0:0a76610c48a1 556 window(x, y, w, h);
star297 0:0a76610c48a1 557 for(int i = 0; i < w*h; i++) {
star297 0:0a76610c48a1 558 char byte = colour[i >> 3];
star297 0:0a76610c48a1 559 int offset = i & 0x7;
star297 0:0a76610c48a1 560 int c = ((byte << (offset)) & 0x80) ? background : foreground;
star297 0:0a76610c48a1 561 putp(c);
star297 0:0a76610c48a1 562 }
star297 0:0a76610c48a1 563 }
star297 0:0a76610c48a1 564
star297 0:0a76610c48a1 565 int SharpLCD::columns() {
star297 0:0a76610c48a1 566 return width() / 8;
star297 0:0a76610c48a1 567 }
star297 0:0a76610c48a1 568
star297 0:0a76610c48a1 569 int SharpLCD::rows() {
star297 0:0a76610c48a1 570 return height() / 8;
star297 0:0a76610c48a1 571 }
star297 0:0a76610c48a1 572
star297 0:0a76610c48a1 573 int SharpLCD::width() {
star297 0:0a76610c48a1 574 return DISPLAY_WIDTH;
star297 0:0a76610c48a1 575 }
star297 0:0a76610c48a1 576
star297 0:0a76610c48a1 577 int SharpLCD::height() {
star297 0:0a76610c48a1 578 return DISPLAY_HEIGHT;
star297 0:0a76610c48a1 579 }
star297 0:0a76610c48a1 580
star297 0:0a76610c48a1 581 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 582 uint32_t bitmapLine = 0, y = startY, bytesPerLine = ((bmpWidth >= (DISPLAY_WIDTH - startX)) ? (DISPLAY_WIDTH - startX) : bmpWidth) / 8;
star297 0:0a76610c48a1 583
star297 0:0a76610c48a1 584 // Apply constraints
star297 0:0a76610c48a1 585 if((bmpWidth & 0x07) != 0) return;
star297 0:0a76610c48a1 586 if(startX >= DISPLAY_WIDTH) return;
star297 0:0a76610c48a1 587
star297 0:0a76610c48a1 588 // Copy over bytes to pixel buffer
star297 0:0a76610c48a1 589 for(; y < startY + bmpHeight; y++) {
star297 0:0a76610c48a1 590 memcpy( (void*) &(((uint8_t*)pixelBuffer)[((y * DISPLAY_WIDTH) + startX) / 8]),
star297 0:0a76610c48a1 591 (const void*) &(bitmap[bitmapLine * (bmpWidth / 8)]),
star297 0:0a76610c48a1 592 bytesPerLine);
star297 0:0a76610c48a1 593 RowState[y / DISPLAY_BUFFER_TYPE_SIZE] |= (1 << (y % DISPLAY_BUFFER_TYPE_SIZE));
star297 0:0a76610c48a1 594 bitmapLine++;
star297 0:0a76610c48a1 595 }
star297 0:0a76610c48a1 596 return;
star297 0:0a76610c48a1 597 }
star297 0:0a76610c48a1 598