LPC General Purpose Shield (OM13082) LCD module library

Dependents:   OM13082-LCD OM13082-test LPCXpresso4337_OM13082_test lpc4337_acc_demo ... more

Fork of KT7567 by Toyomasa Watarai

Committer:
MACRUM
Date:
Thu Jul 30 01:08:10 2015 +0000
Revision:
18:743aff4786ba
Parent:
K7567.cpp@17:6153719b6d99
Corrected class/library naming

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MACRUM 17:6153719b6d99 1 /* mbed library for the mbed Lab Board 128*32 pixel LCD
MACRUM 17:6153719b6d99 2 * use C12832 controller
MACRUM 17:6153719b6d99 3 * Copyright (c) 2012 Peter Drescher - DC2PD
MACRUM 17:6153719b6d99 4 * Released under the MIT License: http://mbed.org/license/mit
MACRUM 17:6153719b6d99 5 *
MACRUM 17:6153719b6d99 6 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
MACRUM 17:6153719b6d99 7 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
MACRUM 17:6153719b6d99 8 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
MACRUM 17:6153719b6d99 9 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
MACRUM 17:6153719b6d99 10 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
MACRUM 17:6153719b6d99 11 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
MACRUM 17:6153719b6d99 12 * THE SOFTWARE.
MACRUM 17:6153719b6d99 13 */
MACRUM 17:6153719b6d99 14
MACRUM 17:6153719b6d99 15 /*
MACRUM 17:6153719b6d99 16 * Modified for the LPC General Purpose Shield 128*64 pixel LCD
MACRUM 17:6153719b6d99 17 * use ST7567 controller
MACRUM 17:6153719b6d99 18 *
MACRUM 17:6153719b6d99 19 * Copyright (c) 2015 Toyomasa Watarai
MACRUM 17:6153719b6d99 20 */
MACRUM 17:6153719b6d99 21
MACRUM 17:6153719b6d99 22
MACRUM 17:6153719b6d99 23 // 13.10.12 initial design
MACRUM 17:6153719b6d99 24 // 25.10.12 add autorefresh of screen
MACRUM 17:6153719b6d99 25 // 25.10.12 add standart font
MACRUM 17:6153719b6d99 26 // 20.12.12 add bitmap graphics
MACRUM 17:6153719b6d99 27 // 27.07.15 modified to 128x64 ST7567 contoller
MACRUM 17:6153719b6d99 28
MACRUM 18:743aff4786ba 29 #include "ST7567.h"
MACRUM 17:6153719b6d99 30 #include "mbed.h"
MACRUM 17:6153719b6d99 31 #include "Small_7.h"
MACRUM 17:6153719b6d99 32
MACRUM 17:6153719b6d99 33
MACRUM 18:743aff4786ba 34 ST7567::ST7567(PinName mosi, PinName sck, PinName reset, PinName a0, PinName ncs, const char* name)
MACRUM 17:6153719b6d99 35 : GraphicsDisplay(name), _spi(mosi, NC, sck), _reset(reset), _A0(a0), _CS(ncs)
MACRUM 17:6153719b6d99 36 {
MACRUM 17:6153719b6d99 37 orientation = 1;
MACRUM 17:6153719b6d99 38 draw_mode = LCD_NORMAL;
MACRUM 17:6153719b6d99 39 char_x = 0;
MACRUM 17:6153719b6d99 40 lcd_reset();
MACRUM 17:6153719b6d99 41 }
MACRUM 17:6153719b6d99 42
MACRUM 17:6153719b6d99 43
MACRUM 18:743aff4786ba 44 int ST7567::width()
MACRUM 17:6153719b6d99 45 {
MACRUM 17:6153719b6d99 46 if (orientation == 0 || orientation == 2)
MACRUM 17:6153719b6d99 47 return MAX_PIXEL_Y;
MACRUM 17:6153719b6d99 48 else
MACRUM 17:6153719b6d99 49 return MAX_PIXEL_X;
MACRUM 17:6153719b6d99 50 }
MACRUM 17:6153719b6d99 51
MACRUM 18:743aff4786ba 52 int ST7567::height()
MACRUM 17:6153719b6d99 53 {
MACRUM 17:6153719b6d99 54 if (orientation == 0 || orientation == 2)
MACRUM 17:6153719b6d99 55 return MAX_PIXEL_X;
MACRUM 17:6153719b6d99 56 else
MACRUM 17:6153719b6d99 57 return MAX_PIXEL_Y;
MACRUM 17:6153719b6d99 58 }
MACRUM 17:6153719b6d99 59
MACRUM 17:6153719b6d99 60
MACRUM 18:743aff4786ba 61 void ST7567::invert(unsigned int o)
MACRUM 17:6153719b6d99 62 {
MACRUM 17:6153719b6d99 63 if(o == 0)
MACRUM 17:6153719b6d99 64 wr_cmd(0xA6);
MACRUM 17:6153719b6d99 65 else
MACRUM 17:6153719b6d99 66 wr_cmd(0xA7);
MACRUM 17:6153719b6d99 67 }
MACRUM 17:6153719b6d99 68
MACRUM 17:6153719b6d99 69
MACRUM 18:743aff4786ba 70 void ST7567::set_contrast(unsigned int o)
MACRUM 17:6153719b6d99 71 {
MACRUM 17:6153719b6d99 72 contrast = o;
MACRUM 17:6153719b6d99 73 wr_cmd(0x81); // set volume
MACRUM 17:6153719b6d99 74 wr_cmd(o & 0x3F);
MACRUM 17:6153719b6d99 75 }
MACRUM 17:6153719b6d99 76
MACRUM 18:743aff4786ba 77 unsigned int ST7567::get_contrast(void)
MACRUM 17:6153719b6d99 78 {
MACRUM 17:6153719b6d99 79 return(contrast);
MACRUM 17:6153719b6d99 80 }
MACRUM 17:6153719b6d99 81
MACRUM 17:6153719b6d99 82
MACRUM 17:6153719b6d99 83 // write command to lcd controller
MACRUM 17:6153719b6d99 84
MACRUM 18:743aff4786ba 85 void ST7567::wr_cmd(unsigned char cmd)
MACRUM 17:6153719b6d99 86 {
MACRUM 17:6153719b6d99 87 _A0 = 0;
MACRUM 17:6153719b6d99 88 _CS = 0;
MACRUM 17:6153719b6d99 89 _spi.write(cmd);
MACRUM 17:6153719b6d99 90 _CS = 1;
MACRUM 17:6153719b6d99 91 }
MACRUM 17:6153719b6d99 92
MACRUM 17:6153719b6d99 93 // write data to lcd controller
MACRUM 17:6153719b6d99 94
MACRUM 18:743aff4786ba 95 void ST7567::wr_dat(unsigned char dat)
MACRUM 17:6153719b6d99 96 {
MACRUM 17:6153719b6d99 97 _A0 = 1;
MACRUM 17:6153719b6d99 98 _CS = 0;
MACRUM 17:6153719b6d99 99 _spi.write(dat);
MACRUM 17:6153719b6d99 100 _CS = 1;
MACRUM 17:6153719b6d99 101 }
MACRUM 17:6153719b6d99 102
MACRUM 17:6153719b6d99 103 // reset and init the lcd controller
MACRUM 17:6153719b6d99 104
MACRUM 18:743aff4786ba 105 void ST7567::lcd_reset()
MACRUM 17:6153719b6d99 106 {
MACRUM 17:6153719b6d99 107
MACRUM 17:6153719b6d99 108 _spi.format(8,3); // 8 bit spi mode 3
MACRUM 17:6153719b6d99 109 _spi.frequency(10000000); // 10 Mhz SPI clock
MACRUM 17:6153719b6d99 110 _A0 = 0;
MACRUM 17:6153719b6d99 111 _CS = 1;
MACRUM 17:6153719b6d99 112 _reset = 0; // display reset
MACRUM 17:6153719b6d99 113 wait_us(50);
MACRUM 17:6153719b6d99 114 _reset = 1; // end reset
MACRUM 17:6153719b6d99 115 wait_ms(5);
MACRUM 17:6153719b6d99 116
MACRUM 17:6153719b6d99 117 /* Start Initial Sequence ----------------------------------------------------*/
MACRUM 17:6153719b6d99 118
MACRUM 17:6153719b6d99 119 wr_cmd(0xE2); // S/W RESWT
MACRUM 17:6153719b6d99 120 wr_cmd(0xA3); // LCD bias
MACRUM 17:6153719b6d99 121 wr_cmd(0xAF); // Display ON
MACRUM 17:6153719b6d99 122 wr_cmd(0xA0); // segment direction.
MACRUM 17:6153719b6d99 123 wr_cmd(0xC8); // Common Direction.
MACRUM 17:6153719b6d99 124 wr_cmd(0x22); // Regultion resistor select //25
MACRUM 17:6153719b6d99 125
MACRUM 17:6153719b6d99 126 wr_cmd(0x81); // EV Select.
MACRUM 17:6153719b6d99 127 wr_cmd(0x3f); // Select EV value.
MACRUM 17:6153719b6d99 128
MACRUM 17:6153719b6d99 129 wr_cmd(0x2f); // Power control
MACRUM 17:6153719b6d99 130
MACRUM 17:6153719b6d99 131 wr_cmd(0x40); // Initial display line 40
MACRUM 17:6153719b6d99 132 wr_cmd(0xB0); // Set page address
MACRUM 17:6153719b6d99 133 wr_cmd(0x10); // Set coloumn addr MSB
MACRUM 17:6153719b6d99 134 wr_cmd(0x00); // Set coloumn addr LSB
MACRUM 17:6153719b6d99 135 wr_cmd(0xAF); // Display ON
MACRUM 17:6153719b6d99 136 wr_cmd(0xA4); // A5 .Normal display, all pixels OFF.
MACRUM 17:6153719b6d99 137 wr_cmd(0xA6); // A7 .Normal display (Inverse Pixel)
MACRUM 17:6153719b6d99 138
MACRUM 17:6153719b6d99 139 // clear and update LCD
MACRUM 17:6153719b6d99 140 memset(buffer, 0x00, LCD_FB_SIZE); // clear display buffer
MACRUM 17:6153719b6d99 141 copy_to_lcd();
MACRUM 17:6153719b6d99 142 auto_up = 1; // switch on auto update
MACRUM 17:6153719b6d99 143
MACRUM 17:6153719b6d99 144 locate(0,0);
MACRUM 17:6153719b6d99 145 set_font((unsigned char*)Small_7); // standart font
MACRUM 17:6153719b6d99 146 }
MACRUM 17:6153719b6d99 147
MACRUM 17:6153719b6d99 148 // set one pixel in buffer
MACRUM 17:6153719b6d99 149
MACRUM 18:743aff4786ba 150 void ST7567::pixel(int x, int y, int color)
MACRUM 17:6153719b6d99 151 {
MACRUM 17:6153719b6d99 152 // first check parameter
MACRUM 17:6153719b6d99 153 if(x > MAX_PIXEL_X || y > MAX_PIXEL_Y || x < 0 || y < 0) return;
MACRUM 17:6153719b6d99 154
MACRUM 17:6153719b6d99 155 if(draw_mode == LCD_NORMAL) {
MACRUM 17:6153719b6d99 156 if(color == 0)
MACRUM 17:6153719b6d99 157 buffer[x + ((y/8) * 128)] &= ~(1 << (y%8)); // erase pixel
MACRUM 17:6153719b6d99 158 else
MACRUM 17:6153719b6d99 159 buffer[x + ((y/8) * 128)] |= (1 << (y%8)); // set pixel
MACRUM 17:6153719b6d99 160 } else { // XOR mode
MACRUM 17:6153719b6d99 161 if(color == 1)
MACRUM 17:6153719b6d99 162 buffer[x + ((y/8) * 128)] ^= (1 << (y%8)); // xor pixel
MACRUM 17:6153719b6d99 163 }
MACRUM 17:6153719b6d99 164 }
MACRUM 17:6153719b6d99 165
MACRUM 17:6153719b6d99 166 // update lcd
MACRUM 17:6153719b6d99 167
MACRUM 18:743aff4786ba 168 void ST7567::copy_to_lcd(void)
MACRUM 17:6153719b6d99 169 {
MACRUM 17:6153719b6d99 170 for (int page = 0; page < 8; page++) {
MACRUM 17:6153719b6d99 171 wr_cmd(0x00); // set column low nibble 0
MACRUM 17:6153719b6d99 172 wr_cmd(0x10); // set column hi nibble 0
MACRUM 17:6153719b6d99 173 wr_cmd(0xB0|page); // set page address 0
MACRUM 17:6153719b6d99 174 _A0 = 1;
MACRUM 17:6153719b6d99 175
MACRUM 17:6153719b6d99 176 for(int i=page*128; i<(page*128+128); i++) {
MACRUM 17:6153719b6d99 177 wr_dat(buffer[i]);
MACRUM 17:6153719b6d99 178 }
MACRUM 17:6153719b6d99 179 }
MACRUM 17:6153719b6d99 180 }
MACRUM 17:6153719b6d99 181
MACRUM 18:743aff4786ba 182 void ST7567::cls(void)
MACRUM 17:6153719b6d99 183 {
MACRUM 17:6153719b6d99 184 memset(buffer, 0x00, LCD_FB_SIZE); // clear display buffer
MACRUM 17:6153719b6d99 185 copy_to_lcd();
MACRUM 17:6153719b6d99 186 }
MACRUM 17:6153719b6d99 187
MACRUM 17:6153719b6d99 188
MACRUM 18:743aff4786ba 189 void ST7567::line(int x0, int y0, int x1, int y1, int color)
MACRUM 17:6153719b6d99 190 {
MACRUM 17:6153719b6d99 191 int dx = 0, dy = 0;
MACRUM 17:6153719b6d99 192 int dx_sym = 0, dy_sym = 0;
MACRUM 17:6153719b6d99 193 int dx_x2 = 0, dy_x2 = 0;
MACRUM 17:6153719b6d99 194 int di = 0;
MACRUM 17:6153719b6d99 195
MACRUM 17:6153719b6d99 196 dx = x1-x0;
MACRUM 17:6153719b6d99 197 dy = y1-y0;
MACRUM 17:6153719b6d99 198
MACRUM 17:6153719b6d99 199 // if (dx == 0) { /* vertical line */
MACRUM 17:6153719b6d99 200 // if (y1 > y0) vline(x0,y0,y1,color);
MACRUM 17:6153719b6d99 201 // else vline(x0,y1,y0,color);
MACRUM 17:6153719b6d99 202 // return;
MACRUM 17:6153719b6d99 203 // }
MACRUM 17:6153719b6d99 204
MACRUM 17:6153719b6d99 205 if (dx > 0) {
MACRUM 17:6153719b6d99 206 dx_sym = 1;
MACRUM 17:6153719b6d99 207 } else {
MACRUM 17:6153719b6d99 208 dx_sym = -1;
MACRUM 17:6153719b6d99 209 }
MACRUM 17:6153719b6d99 210 // if (dy == 0) { /* horizontal line */
MACRUM 17:6153719b6d99 211 // if (x1 > x0) hline(x0,x1,y0,color);
MACRUM 17:6153719b6d99 212 // else hline(x1,x0,y0,color);
MACRUM 17:6153719b6d99 213 // return;
MACRUM 17:6153719b6d99 214 // }
MACRUM 17:6153719b6d99 215
MACRUM 17:6153719b6d99 216 if (dy > 0) {
MACRUM 17:6153719b6d99 217 dy_sym = 1;
MACRUM 17:6153719b6d99 218 } else {
MACRUM 17:6153719b6d99 219 dy_sym = -1;
MACRUM 17:6153719b6d99 220 }
MACRUM 17:6153719b6d99 221
MACRUM 17:6153719b6d99 222 dx = dx_sym*dx;
MACRUM 17:6153719b6d99 223 dy = dy_sym*dy;
MACRUM 17:6153719b6d99 224
MACRUM 17:6153719b6d99 225 dx_x2 = dx*2;
MACRUM 17:6153719b6d99 226 dy_x2 = dy*2;
MACRUM 17:6153719b6d99 227
MACRUM 17:6153719b6d99 228 if (dx >= dy) {
MACRUM 17:6153719b6d99 229 di = dy_x2 - dx;
MACRUM 17:6153719b6d99 230 while (x0 != x1) {
MACRUM 17:6153719b6d99 231
MACRUM 17:6153719b6d99 232 pixel(x0, y0, color);
MACRUM 17:6153719b6d99 233 x0 += dx_sym;
MACRUM 17:6153719b6d99 234 if (di<0) {
MACRUM 17:6153719b6d99 235 di += dy_x2;
MACRUM 17:6153719b6d99 236 } else {
MACRUM 17:6153719b6d99 237 di += dy_x2 - dx_x2;
MACRUM 17:6153719b6d99 238 y0 += dy_sym;
MACRUM 17:6153719b6d99 239 }
MACRUM 17:6153719b6d99 240 }
MACRUM 17:6153719b6d99 241 pixel(x0, y0, color);
MACRUM 17:6153719b6d99 242 } else {
MACRUM 17:6153719b6d99 243 di = dx_x2 - dy;
MACRUM 17:6153719b6d99 244 while (y0 != y1) {
MACRUM 17:6153719b6d99 245 pixel(x0, y0, color);
MACRUM 17:6153719b6d99 246 y0 += dy_sym;
MACRUM 17:6153719b6d99 247 if (di < 0) {
MACRUM 17:6153719b6d99 248 di += dx_x2;
MACRUM 17:6153719b6d99 249 } else {
MACRUM 17:6153719b6d99 250 di += dx_x2 - dy_x2;
MACRUM 17:6153719b6d99 251 x0 += dx_sym;
MACRUM 17:6153719b6d99 252 }
MACRUM 17:6153719b6d99 253 }
MACRUM 17:6153719b6d99 254 pixel(x0, y0, color);
MACRUM 17:6153719b6d99 255 }
MACRUM 17:6153719b6d99 256 if(auto_up) copy_to_lcd();
MACRUM 17:6153719b6d99 257 }
MACRUM 17:6153719b6d99 258
MACRUM 18:743aff4786ba 259 void ST7567::rect(int x0, int y0, int x1, int y1, int color)
MACRUM 17:6153719b6d99 260 {
MACRUM 17:6153719b6d99 261
MACRUM 17:6153719b6d99 262 if (x1 > x0) line(x0,y0,x1,y0,color);
MACRUM 17:6153719b6d99 263 else line(x1,y0,x0,y0,color);
MACRUM 17:6153719b6d99 264
MACRUM 17:6153719b6d99 265 if (y1 > y0) line(x0,y0,x0,y1,color);
MACRUM 17:6153719b6d99 266 else line(x0,y1,x0,y0,color);
MACRUM 17:6153719b6d99 267
MACRUM 17:6153719b6d99 268 if (x1 > x0) line(x0,y1,x1,y1,color);
MACRUM 17:6153719b6d99 269 else line(x1,y1,x0,y1,color);
MACRUM 17:6153719b6d99 270
MACRUM 17:6153719b6d99 271 if (y1 > y0) line(x1,y0,x1,y1,color);
MACRUM 17:6153719b6d99 272 else line(x1,y1,x1,y0,color);
MACRUM 17:6153719b6d99 273
MACRUM 17:6153719b6d99 274 if(auto_up) copy_to_lcd();
MACRUM 17:6153719b6d99 275 }
MACRUM 17:6153719b6d99 276
MACRUM 18:743aff4786ba 277 void ST7567::fillrect(int x0, int y0, int x1, int y1, int color)
MACRUM 17:6153719b6d99 278 {
MACRUM 17:6153719b6d99 279 int l,c,i;
MACRUM 17:6153719b6d99 280 if(x0 > x1) {
MACRUM 17:6153719b6d99 281 i = x0;
MACRUM 17:6153719b6d99 282 x0 = x1;
MACRUM 17:6153719b6d99 283 x1 = i;
MACRUM 17:6153719b6d99 284 }
MACRUM 17:6153719b6d99 285
MACRUM 17:6153719b6d99 286 if(y0 > y1) {
MACRUM 17:6153719b6d99 287 i = y0;
MACRUM 17:6153719b6d99 288 y0 = y1;
MACRUM 17:6153719b6d99 289 y1 = i;
MACRUM 17:6153719b6d99 290 }
MACRUM 17:6153719b6d99 291
MACRUM 17:6153719b6d99 292 for(l = x0; l<= x1; l ++) {
MACRUM 17:6153719b6d99 293 for(c = y0; c<= y1; c++) {
MACRUM 17:6153719b6d99 294 pixel(l,c,color);
MACRUM 17:6153719b6d99 295 }
MACRUM 17:6153719b6d99 296 }
MACRUM 17:6153719b6d99 297 if(auto_up) copy_to_lcd();
MACRUM 17:6153719b6d99 298 }
MACRUM 17:6153719b6d99 299
MACRUM 17:6153719b6d99 300
MACRUM 17:6153719b6d99 301
MACRUM 18:743aff4786ba 302 void ST7567::circle(int x0, int y0, int r, int color)
MACRUM 17:6153719b6d99 303 {
MACRUM 17:6153719b6d99 304
MACRUM 17:6153719b6d99 305 int draw_x0, draw_y0;
MACRUM 17:6153719b6d99 306 int draw_x1, draw_y1;
MACRUM 17:6153719b6d99 307 int draw_x2, draw_y2;
MACRUM 17:6153719b6d99 308 int draw_x3, draw_y3;
MACRUM 17:6153719b6d99 309 int draw_x4, draw_y4;
MACRUM 17:6153719b6d99 310 int draw_x5, draw_y5;
MACRUM 17:6153719b6d99 311 int draw_x6, draw_y6;
MACRUM 17:6153719b6d99 312 int draw_x7, draw_y7;
MACRUM 17:6153719b6d99 313 int xx, yy;
MACRUM 17:6153719b6d99 314 int di;
MACRUM 17:6153719b6d99 315 //WindowMax();
MACRUM 17:6153719b6d99 316 if (r == 0) { /* no radius */
MACRUM 17:6153719b6d99 317 return;
MACRUM 17:6153719b6d99 318 }
MACRUM 17:6153719b6d99 319
MACRUM 17:6153719b6d99 320 draw_x0 = draw_x1 = x0;
MACRUM 17:6153719b6d99 321 draw_y0 = draw_y1 = y0 + r;
MACRUM 17:6153719b6d99 322 if (draw_y0 < height()) {
MACRUM 17:6153719b6d99 323 pixel(draw_x0, draw_y0, color); /* 90 degree */
MACRUM 17:6153719b6d99 324 }
MACRUM 17:6153719b6d99 325
MACRUM 17:6153719b6d99 326 draw_x2 = draw_x3 = x0;
MACRUM 17:6153719b6d99 327 draw_y2 = draw_y3 = y0 - r;
MACRUM 17:6153719b6d99 328 if (draw_y2 >= 0) {
MACRUM 17:6153719b6d99 329 pixel(draw_x2, draw_y2, color); /* 270 degree */
MACRUM 17:6153719b6d99 330 }
MACRUM 17:6153719b6d99 331
MACRUM 17:6153719b6d99 332 draw_x4 = draw_x6 = x0 + r;
MACRUM 17:6153719b6d99 333 draw_y4 = draw_y6 = y0;
MACRUM 17:6153719b6d99 334 if (draw_x4 < width()) {
MACRUM 17:6153719b6d99 335 pixel(draw_x4, draw_y4, color); /* 0 degree */
MACRUM 17:6153719b6d99 336 }
MACRUM 17:6153719b6d99 337
MACRUM 17:6153719b6d99 338 draw_x5 = draw_x7 = x0 - r;
MACRUM 17:6153719b6d99 339 draw_y5 = draw_y7 = y0;
MACRUM 17:6153719b6d99 340 if (draw_x5>=0) {
MACRUM 17:6153719b6d99 341 pixel(draw_x5, draw_y5, color); /* 180 degree */
MACRUM 17:6153719b6d99 342 }
MACRUM 17:6153719b6d99 343
MACRUM 17:6153719b6d99 344 if (r == 1) {
MACRUM 17:6153719b6d99 345 return;
MACRUM 17:6153719b6d99 346 }
MACRUM 17:6153719b6d99 347
MACRUM 17:6153719b6d99 348 di = 3 - 2*r;
MACRUM 17:6153719b6d99 349 xx = 0;
MACRUM 17:6153719b6d99 350 yy = r;
MACRUM 17:6153719b6d99 351 while (xx < yy) {
MACRUM 17:6153719b6d99 352
MACRUM 17:6153719b6d99 353 if (di < 0) {
MACRUM 17:6153719b6d99 354 di += 4*xx + 6;
MACRUM 17:6153719b6d99 355 } else {
MACRUM 17:6153719b6d99 356 di += 4*(xx - yy) + 10;
MACRUM 17:6153719b6d99 357 yy--;
MACRUM 17:6153719b6d99 358 draw_y0--;
MACRUM 17:6153719b6d99 359 draw_y1--;
MACRUM 17:6153719b6d99 360 draw_y2++;
MACRUM 17:6153719b6d99 361 draw_y3++;
MACRUM 17:6153719b6d99 362 draw_x4--;
MACRUM 17:6153719b6d99 363 draw_x5++;
MACRUM 17:6153719b6d99 364 draw_x6--;
MACRUM 17:6153719b6d99 365 draw_x7++;
MACRUM 17:6153719b6d99 366 }
MACRUM 17:6153719b6d99 367 xx++;
MACRUM 17:6153719b6d99 368 draw_x0++;
MACRUM 17:6153719b6d99 369 draw_x1--;
MACRUM 17:6153719b6d99 370 draw_x2++;
MACRUM 17:6153719b6d99 371 draw_x3--;
MACRUM 17:6153719b6d99 372 draw_y4++;
MACRUM 17:6153719b6d99 373 draw_y5++;
MACRUM 17:6153719b6d99 374 draw_y6--;
MACRUM 17:6153719b6d99 375 draw_y7--;
MACRUM 17:6153719b6d99 376
MACRUM 17:6153719b6d99 377 if ( (draw_x0 <= width()) && (draw_y0>=0) ) {
MACRUM 17:6153719b6d99 378 pixel(draw_x0, draw_y0, color);
MACRUM 17:6153719b6d99 379 }
MACRUM 17:6153719b6d99 380
MACRUM 17:6153719b6d99 381 if ( (draw_x1 >= 0) && (draw_y1 >= 0) ) {
MACRUM 17:6153719b6d99 382 pixel(draw_x1, draw_y1, color);
MACRUM 17:6153719b6d99 383 }
MACRUM 17:6153719b6d99 384
MACRUM 17:6153719b6d99 385 if ( (draw_x2 <= width()) && (draw_y2 <= height()) ) {
MACRUM 17:6153719b6d99 386 pixel(draw_x2, draw_y2, color);
MACRUM 17:6153719b6d99 387 }
MACRUM 17:6153719b6d99 388
MACRUM 17:6153719b6d99 389 if ( (draw_x3 >=0 ) && (draw_y3 <= height()) ) {
MACRUM 17:6153719b6d99 390 pixel(draw_x3, draw_y3, color);
MACRUM 17:6153719b6d99 391 }
MACRUM 17:6153719b6d99 392
MACRUM 17:6153719b6d99 393 if ( (draw_x4 <= width()) && (draw_y4 >= 0) ) {
MACRUM 17:6153719b6d99 394 pixel(draw_x4, draw_y4, color);
MACRUM 17:6153719b6d99 395 }
MACRUM 17:6153719b6d99 396
MACRUM 17:6153719b6d99 397 if ( (draw_x5 >= 0) && (draw_y5 >= 0) ) {
MACRUM 17:6153719b6d99 398 pixel(draw_x5, draw_y5, color);
MACRUM 17:6153719b6d99 399 }
MACRUM 17:6153719b6d99 400 if ( (draw_x6 <=width()) && (draw_y6 <= height()) ) {
MACRUM 17:6153719b6d99 401 pixel(draw_x6, draw_y6, color);
MACRUM 17:6153719b6d99 402 }
MACRUM 17:6153719b6d99 403 if ( (draw_x7 >= 0) && (draw_y7 <= height()) ) {
MACRUM 17:6153719b6d99 404 pixel(draw_x7, draw_y7, color);
MACRUM 17:6153719b6d99 405 }
MACRUM 17:6153719b6d99 406 }
MACRUM 17:6153719b6d99 407 if(auto_up) copy_to_lcd();
MACRUM 17:6153719b6d99 408 }
MACRUM 17:6153719b6d99 409
MACRUM 18:743aff4786ba 410 void ST7567::fillcircle(int x, int y, int r, int color)
MACRUM 17:6153719b6d99 411 {
MACRUM 17:6153719b6d99 412 int i,up;
MACRUM 17:6153719b6d99 413 up = auto_up;
MACRUM 17:6153719b6d99 414 auto_up = 0; // off
MACRUM 17:6153719b6d99 415 for (i = 0; i <= r; i++)
MACRUM 17:6153719b6d99 416 circle(x,y,i,color);
MACRUM 17:6153719b6d99 417 auto_up = up;
MACRUM 17:6153719b6d99 418 if(auto_up) copy_to_lcd();
MACRUM 17:6153719b6d99 419 }
MACRUM 17:6153719b6d99 420
MACRUM 18:743aff4786ba 421 void ST7567::setmode(int mode)
MACRUM 17:6153719b6d99 422 {
MACRUM 17:6153719b6d99 423 draw_mode = mode;
MACRUM 17:6153719b6d99 424 }
MACRUM 17:6153719b6d99 425
MACRUM 18:743aff4786ba 426 void ST7567::locate(int x, int y)
MACRUM 17:6153719b6d99 427 {
MACRUM 17:6153719b6d99 428 char_x = x;
MACRUM 17:6153719b6d99 429 char_y = y;
MACRUM 17:6153719b6d99 430 }
MACRUM 17:6153719b6d99 431
MACRUM 17:6153719b6d99 432
MACRUM 17:6153719b6d99 433
MACRUM 18:743aff4786ba 434 int ST7567::columns()
MACRUM 17:6153719b6d99 435 {
MACRUM 17:6153719b6d99 436 return width() / font[1];
MACRUM 17:6153719b6d99 437 }
MACRUM 17:6153719b6d99 438
MACRUM 17:6153719b6d99 439
MACRUM 17:6153719b6d99 440
MACRUM 18:743aff4786ba 441 int ST7567::rows()
MACRUM 17:6153719b6d99 442 {
MACRUM 17:6153719b6d99 443 return height() / font[2];
MACRUM 17:6153719b6d99 444 }
MACRUM 17:6153719b6d99 445
MACRUM 17:6153719b6d99 446
MACRUM 17:6153719b6d99 447
MACRUM 18:743aff4786ba 448 int ST7567::_putc(int value)
MACRUM 17:6153719b6d99 449 {
MACRUM 17:6153719b6d99 450 if (value == '\n') { // new line
MACRUM 17:6153719b6d99 451 char_x = 0;
MACRUM 17:6153719b6d99 452 char_y = char_y + font[2];
MACRUM 17:6153719b6d99 453 if (char_y >= height() - font[2]) {
MACRUM 17:6153719b6d99 454 char_y = 0;
MACRUM 17:6153719b6d99 455 }
MACRUM 17:6153719b6d99 456 } else {
MACRUM 17:6153719b6d99 457 character(char_x, char_y, value);
MACRUM 17:6153719b6d99 458 if(auto_up) copy_to_lcd();
MACRUM 17:6153719b6d99 459 }
MACRUM 17:6153719b6d99 460 return value;
MACRUM 17:6153719b6d99 461 }
MACRUM 17:6153719b6d99 462
MACRUM 18:743aff4786ba 463 void ST7567::character(int x, int y, int c)
MACRUM 17:6153719b6d99 464 {
MACRUM 17:6153719b6d99 465 unsigned int hor,vert,offset,bpl,j,i,b;
MACRUM 17:6153719b6d99 466 unsigned char* zeichen;
MACRUM 17:6153719b6d99 467 unsigned char z,w;
MACRUM 17:6153719b6d99 468
MACRUM 17:6153719b6d99 469 if ((c < 31) || (c > 127)) return; // test char range
MACRUM 17:6153719b6d99 470
MACRUM 17:6153719b6d99 471 // read font parameter from start of array
MACRUM 17:6153719b6d99 472 offset = font[0]; // bytes / char
MACRUM 17:6153719b6d99 473 hor = font[1]; // get hor size of font
MACRUM 17:6153719b6d99 474 vert = font[2]; // get vert size of font
MACRUM 17:6153719b6d99 475 bpl = font[3]; // bytes per line
MACRUM 17:6153719b6d99 476
MACRUM 17:6153719b6d99 477 if (char_x + hor > width()) {
MACRUM 17:6153719b6d99 478 char_x = 0;
MACRUM 17:6153719b6d99 479 char_y = char_y + vert;
MACRUM 17:6153719b6d99 480 if (char_y >= height() - font[2]) {
MACRUM 17:6153719b6d99 481 char_y = 0;
MACRUM 17:6153719b6d99 482 }
MACRUM 17:6153719b6d99 483 }
MACRUM 17:6153719b6d99 484
MACRUM 17:6153719b6d99 485 zeichen = &font[((c - ' ') * offset) + 4]; // start of char bitmap
MACRUM 17:6153719b6d99 486 w = zeichen[0]; // width of actual char
MACRUM 17:6153719b6d99 487 // construct the char into the buffer
MACRUM 17:6153719b6d99 488 for (j=0; j<vert; j++) { // vert line
MACRUM 17:6153719b6d99 489 for (i=0; i<hor; i++) { // horz line
MACRUM 17:6153719b6d99 490 z = zeichen[bpl * i + ((j & 0xF8) >> 3)+1];
MACRUM 17:6153719b6d99 491 b = 1 << (j & 0x07);
MACRUM 17:6153719b6d99 492 if (( z & b ) == 0x00) {
MACRUM 17:6153719b6d99 493 pixel(x+i,y+j,0);
MACRUM 17:6153719b6d99 494 } else {
MACRUM 17:6153719b6d99 495 pixel(x+i,y+j,1);
MACRUM 17:6153719b6d99 496 }
MACRUM 17:6153719b6d99 497
MACRUM 17:6153719b6d99 498 }
MACRUM 17:6153719b6d99 499 }
MACRUM 17:6153719b6d99 500
MACRUM 17:6153719b6d99 501 char_x += w;
MACRUM 17:6153719b6d99 502 }
MACRUM 17:6153719b6d99 503
MACRUM 17:6153719b6d99 504
MACRUM 18:743aff4786ba 505 void ST7567::set_font(unsigned char* f)
MACRUM 17:6153719b6d99 506 {
MACRUM 17:6153719b6d99 507 font = f;
MACRUM 17:6153719b6d99 508 }
MACRUM 17:6153719b6d99 509
MACRUM 18:743aff4786ba 510 void ST7567::set_auto_up(unsigned int up)
MACRUM 17:6153719b6d99 511 {
MACRUM 17:6153719b6d99 512 if (up)
MACRUM 17:6153719b6d99 513 auto_up = 1;
MACRUM 17:6153719b6d99 514 else
MACRUM 17:6153719b6d99 515 auto_up = 0;
MACRUM 17:6153719b6d99 516 }
MACRUM 17:6153719b6d99 517
MACRUM 18:743aff4786ba 518 unsigned int ST7567::get_auto_up(void)
MACRUM 17:6153719b6d99 519 {
MACRUM 17:6153719b6d99 520 return (auto_up);
MACRUM 17:6153719b6d99 521 }
MACRUM 17:6153719b6d99 522
MACRUM 18:743aff4786ba 523 void ST7567::print_bm(Bitmap bm, int x, int y)
MACRUM 17:6153719b6d99 524 {
MACRUM 17:6153719b6d99 525 int h,v,b;
MACRUM 17:6153719b6d99 526 char d;
MACRUM 17:6153719b6d99 527
MACRUM 17:6153719b6d99 528 for(v=0; v < bm.ySize; v++) { // lines
MACRUM 17:6153719b6d99 529 for(h=0; h < bm.xSize; h++) { // pixel
MACRUM 17:6153719b6d99 530 if(h + x > (MAX_PIXEL_X-1)) break;
MACRUM 17:6153719b6d99 531 if(v + y > (MAX_PIXEL_Y-1)) break;
MACRUM 17:6153719b6d99 532 d = bm.data[bm.Byte_in_Line * v + ((h & 0xF8) >> 3)];
MACRUM 17:6153719b6d99 533 b = 0x80 >> (h & 0x07);
MACRUM 17:6153719b6d99 534 if((d & b) == 0) {
MACRUM 17:6153719b6d99 535 pixel(x+h,y+v,0);
MACRUM 17:6153719b6d99 536 } else {
MACRUM 17:6153719b6d99 537 pixel(x+h,y+v,1);
MACRUM 17:6153719b6d99 538 }
MACRUM 17:6153719b6d99 539 }
MACRUM 17:6153719b6d99 540 }
MACRUM 17:6153719b6d99 541
MACRUM 17:6153719b6d99 542 }