to extend font size
Fork of sharp_mlcd by
sharp_mlcd.cpp@1:f8ba3b236d12, 2014-05-11 (annotated)
- Committer:
- masato
- Date:
- Sun May 11 14:03:39 2014 +0000
- Revision:
- 1:f8ba3b236d12
- Parent:
- 0:c99dda90f834
- Child:
- 2:9898a647e88b
RC1
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
masato | 0:c99dda90f834 | 1 | /* |
masato | 0:c99dda90f834 | 2 | * mbed library for the Sharp memory LCD LS027BDH01 / LS013B4DN04 |
masato | 0:c99dda90f834 | 3 | * derived from C12832_lcd |
masato | 0:c99dda90f834 | 4 | * Copyright (c) 2014 Masato YAMANISHI |
masato | 0:c99dda90f834 | 5 | * Released under the MIT License: http://mbed.org/license/mit |
masato | 0:c99dda90f834 | 6 | */ |
masato | 0:c99dda90f834 | 7 | |
masato | 0:c99dda90f834 | 8 | /* mbed library for the mbed Lab Board 128*32 pixel LCD |
masato | 0:c99dda90f834 | 9 | * use C12832 controller |
masato | 0:c99dda90f834 | 10 | * Copyright (c) 2012 Peter Drescher - DC2PD |
masato | 0:c99dda90f834 | 11 | * Released under the MIT License: http://mbed.org/license/mit |
masato | 0:c99dda90f834 | 12 | * |
masato | 0:c99dda90f834 | 13 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
masato | 0:c99dda90f834 | 14 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
masato | 0:c99dda90f834 | 15 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
masato | 0:c99dda90f834 | 16 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
masato | 0:c99dda90f834 | 17 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
masato | 0:c99dda90f834 | 18 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
masato | 0:c99dda90f834 | 19 | * THE SOFTWARE. |
masato | 0:c99dda90f834 | 20 | */ |
masato | 0:c99dda90f834 | 21 | |
masato | 0:c99dda90f834 | 22 | // 13.10.12 initial design |
masato | 0:c99dda90f834 | 23 | // 25.10.12 add autorefresh of screen |
masato | 0:c99dda90f834 | 24 | // 25.10.12 add standart font |
masato | 0:c99dda90f834 | 25 | // 20.12.12 add bitmap graphics |
masato | 0:c99dda90f834 | 26 | |
masato | 0:c99dda90f834 | 27 | // optional defines : |
masato | 0:c99dda90f834 | 28 | // #define debug_lcd 1 |
masato | 0:c99dda90f834 | 29 | |
masato | 0:c99dda90f834 | 30 | // #include "mbed.h" |
masato | 0:c99dda90f834 | 31 | #include "sharp_mlcd.h" |
masato | 0:c99dda90f834 | 32 | #include "stdio.h" |
masato | 0:c99dda90f834 | 33 | #include "Small_7.h" |
masato | 0:c99dda90f834 | 34 | |
masato | 0:c99dda90f834 | 35 | sharp_mlcd::sharp_mlcd(const char* name) |
masato | 0:c99dda90f834 | 36 | : _spi(D11,NC,D13),_EXTCOM(D9),_DISP(D8),_CS(D10), GraphicsDisplay(name) // for nucleo L152RE or other |
masato | 0:c99dda90f834 | 37 | { |
masato | 0:c99dda90f834 | 38 | draw_mode = NORMAL; |
masato | 0:c99dda90f834 | 39 | char_x = 0; |
masato | 0:c99dda90f834 | 40 | lcd_reset(); |
masato | 0:c99dda90f834 | 41 | } |
masato | 0:c99dda90f834 | 42 | |
masato | 0:c99dda90f834 | 43 | int sharp_mlcd::width() |
masato | 0:c99dda90f834 | 44 | { |
masato | 0:c99dda90f834 | 45 | return WIDTH; |
masato | 0:c99dda90f834 | 46 | } |
masato | 0:c99dda90f834 | 47 | |
masato | 0:c99dda90f834 | 48 | int sharp_mlcd::height() |
masato | 0:c99dda90f834 | 49 | { |
masato | 0:c99dda90f834 | 50 | return HEIGHT; // 32; |
masato | 0:c99dda90f834 | 51 | } |
masato | 0:c99dda90f834 | 52 | |
masato | 0:c99dda90f834 | 53 | // write command to lcd controller |
masato | 0:c99dda90f834 | 54 | |
masato | 0:c99dda90f834 | 55 | |
masato | 0:c99dda90f834 | 56 | // reset and init the lcd controller |
masato | 0:c99dda90f834 | 57 | |
masato | 0:c99dda90f834 | 58 | void sharp_mlcd::lcd_reset() |
masato | 0:c99dda90f834 | 59 | { |
masato | 0:c99dda90f834 | 60 | _CS = 0; |
masato | 1:f8ba3b236d12 | 61 | _spi.format(8, 0); // 8 bit spi mode 0 |
masato | 0:c99dda90f834 | 62 | _spi.frequency(2000000); // 2 Mhz SPI clock |
masato | 0:c99dda90f834 | 63 | _DISP = 1; |
masato | 0:c99dda90f834 | 64 | flip = 0; |
masato | 1:f8ba3b236d12 | 65 | set_reverse_mode(0); |
masato | 0:c99dda90f834 | 66 | // timer.attach(attime, 0.5); // 1KHz |
masato | 0:c99dda90f834 | 67 | |
masato | 0:c99dda90f834 | 68 | _CS = 1; |
masato | 0:c99dda90f834 | 69 | wait_us(4); |
masato | 0:c99dda90f834 | 70 | _spi.write(0x20); // 0x20:clear 0x00:run |
masato | 0:c99dda90f834 | 71 | _spi.write(0); // dummy |
masato | 0:c99dda90f834 | 72 | wait_us(2); |
masato | 0:c99dda90f834 | 73 | _CS = 0; |
masato | 0:c99dda90f834 | 74 | |
masato | 0:c99dda90f834 | 75 | // clear and update LCD |
masato | 0:c99dda90f834 | 76 | cls(); |
masato | 0:c99dda90f834 | 77 | // memset(buffer,0xff,BUFFER_SIZE); // clear display buffer |
masato | 0:c99dda90f834 | 78 | // copy_to_lcd(); |
masato | 0:c99dda90f834 | 79 | auto_up = 1; // switch on auto update |
masato | 0:c99dda90f834 | 80 | // dont do this by default. Make the user call |
masato | 0:c99dda90f834 | 81 | //claim(stdout); // redirekt printf to lcd |
masato | 0:c99dda90f834 | 82 | locate(0,0); |
masato | 0:c99dda90f834 | 83 | set_font((unsigned char*)Small_7); // standart font |
masato | 0:c99dda90f834 | 84 | } |
masato | 0:c99dda90f834 | 85 | |
masato | 1:f8ba3b236d12 | 86 | void sharp_mlcd::set_reverse_mode(unsigned int r = 0) |
masato | 1:f8ba3b236d12 | 87 | { |
masato | 1:f8ba3b236d12 | 88 | reverse = r; |
masato | 1:f8ba3b236d12 | 89 | } |
masato | 1:f8ba3b236d12 | 90 | |
masato | 0:c99dda90f834 | 91 | // set one pixel in buffer |
masato | 0:c99dda90f834 | 92 | |
masato | 0:c99dda90f834 | 93 | void sharp_mlcd::pixel(int x, int y, int color) |
masato | 0:c99dda90f834 | 94 | { |
masato | 0:c99dda90f834 | 95 | // first check parameter |
masato | 0:c99dda90f834 | 96 | if(x > WIDTH || y > HEIGHT || x < 0 || y < 0) return; |
masato | 0:c99dda90f834 | 97 | |
masato | 0:c99dda90f834 | 98 | if(draw_mode == NORMAL) { |
masato | 1:f8ba3b236d12 | 99 | if(color != reverse) |
masato | 0:c99dda90f834 | 100 | buffer[x/8 + (y*WIDTH/8)] &= ~(1 << (7-(x%8))); // set pixel |
masato | 0:c99dda90f834 | 101 | else |
masato | 0:c99dda90f834 | 102 | buffer[x/8 + (y*WIDTH/8)] |= (1 << (7-(x%8))); // erase pixel |
masato | 0:c99dda90f834 | 103 | } else { // XOR mode |
masato | 1:f8ba3b236d12 | 104 | if(color != reverse) |
masato | 0:c99dda90f834 | 105 | buffer[x/8 + (y*WIDTH/8)] ^= (1 << (7-(x%8))); // xor pixel |
masato | 0:c99dda90f834 | 106 | } |
masato | 0:c99dda90f834 | 107 | } |
masato | 0:c99dda90f834 | 108 | |
masato | 0:c99dda90f834 | 109 | // update lcd |
masato | 0:c99dda90f834 | 110 | |
masato | 0:c99dda90f834 | 111 | void sharp_mlcd::attime() { |
masato | 0:c99dda90f834 | 112 | flip = !flip; |
masato | 0:c99dda90f834 | 113 | _EXTCOM = flip; |
masato | 0:c99dda90f834 | 114 | } |
masato | 0:c99dda90f834 | 115 | |
masato | 0:c99dda90f834 | 116 | unsigned char sharp_mlcd::bit_reverse(unsigned char c) { |
masato | 0:c99dda90f834 | 117 | unsigned char u=0; // c = TESTVALUE; |
masato | 0:c99dda90f834 | 118 | int i; |
masato | 0:c99dda90f834 | 119 | |
masato | 0:c99dda90f834 | 120 | for (i=0 ; i<4 ; i++) |
masato | 0:c99dda90f834 | 121 | u |= ((c & (1 << i)) << (7-2*i)) | ((c & (1 << 7-i)) >> (7-2*i)); |
masato | 0:c99dda90f834 | 122 | return u; |
masato | 0:c99dda90f834 | 123 | } |
masato | 0:c99dda90f834 | 124 | |
masato | 0:c99dda90f834 | 125 | void sharp_mlcd::copy_to_lcd(void) |
masato | 0:c99dda90f834 | 126 | { |
masato | 0:c99dda90f834 | 127 | const int start = 0; |
masato | 0:c99dda90f834 | 128 | int x, y; |
masato | 0:c99dda90f834 | 129 | unsigned char *p = (unsigned char*)buffer; // image; |
masato | 0:c99dda90f834 | 130 | |
masato | 0:c99dda90f834 | 131 | _CS = 1; |
masato | 0:c99dda90f834 | 132 | wait_us(4); // min 3us |
masato | 0:c99dda90f834 | 133 | // |
masato | 0:c99dda90f834 | 134 | for (y = 0; y < HEIGHT; y++) { |
masato | 0:c99dda90f834 | 135 | _spi.write(0x80); // update mode (multi line) |
masato | 0:c99dda90f834 | 136 | _spi.write(bit_reverse((y + 1 + start) % HEIGHT)); // set gate line address |
masato | 0:c99dda90f834 | 137 | for (x = 0; x < (WIDTH / 8); x++) { |
masato | 0:c99dda90f834 | 138 | _spi.write(*p++); // (((y / 8) + x + mode) % 2)? 0xff: 0); |
masato | 0:c99dda90f834 | 139 | } |
masato | 0:c99dda90f834 | 140 | } |
masato | 0:c99dda90f834 | 141 | // |
masato | 0:c99dda90f834 | 142 | wait_us(2); // min 1us |
masato | 0:c99dda90f834 | 143 | _CS = 0; |
masato | 0:c99dda90f834 | 144 | } |
masato | 0:c99dda90f834 | 145 | |
masato | 0:c99dda90f834 | 146 | void sharp_mlcd::cls(void) |
masato | 0:c99dda90f834 | 147 | { |
masato | 1:f8ba3b236d12 | 148 | memset(buffer, reverse? 0x00: 0xff, BUFFER_SIZE); // clear display buffer |
masato | 0:c99dda90f834 | 149 | copy_to_lcd(); |
masato | 0:c99dda90f834 | 150 | } |
masato | 0:c99dda90f834 | 151 | |
masato | 0:c99dda90f834 | 152 | |
masato | 0:c99dda90f834 | 153 | void sharp_mlcd::line(int x0, int y0, int x1, int y1, int color) |
masato | 0:c99dda90f834 | 154 | { |
masato | 0:c99dda90f834 | 155 | int dx = 0, dy = 0; |
masato | 0:c99dda90f834 | 156 | int dx_sym = 0, dy_sym = 0; |
masato | 0:c99dda90f834 | 157 | int dx_x2 = 0, dy_x2 = 0; |
masato | 0:c99dda90f834 | 158 | int di = 0; |
masato | 0:c99dda90f834 | 159 | |
masato | 0:c99dda90f834 | 160 | dx = x1-x0; |
masato | 0:c99dda90f834 | 161 | dy = y1-y0; |
masato | 0:c99dda90f834 | 162 | |
masato | 0:c99dda90f834 | 163 | // if (dx == 0) { /* vertical line */ |
masato | 0:c99dda90f834 | 164 | // if (y1 > y0) vline(x0,y0,y1,color); |
masato | 0:c99dda90f834 | 165 | // else vline(x0,y1,y0,color); |
masato | 0:c99dda90f834 | 166 | // return; |
masato | 0:c99dda90f834 | 167 | // } |
masato | 0:c99dda90f834 | 168 | |
masato | 0:c99dda90f834 | 169 | if (dx > 0) { |
masato | 0:c99dda90f834 | 170 | dx_sym = 1; |
masato | 0:c99dda90f834 | 171 | } else { |
masato | 0:c99dda90f834 | 172 | dx_sym = -1; |
masato | 0:c99dda90f834 | 173 | } |
masato | 0:c99dda90f834 | 174 | // if (dy == 0) { /* horizontal line */ |
masato | 0:c99dda90f834 | 175 | // if (x1 > x0) hline(x0,x1,y0,color); |
masato | 0:c99dda90f834 | 176 | // else hline(x1,x0,y0,color); |
masato | 0:c99dda90f834 | 177 | // return; |
masato | 0:c99dda90f834 | 178 | // } |
masato | 0:c99dda90f834 | 179 | |
masato | 0:c99dda90f834 | 180 | if (dy > 0) { |
masato | 0:c99dda90f834 | 181 | dy_sym = 1; |
masato | 0:c99dda90f834 | 182 | } else { |
masato | 0:c99dda90f834 | 183 | dy_sym = -1; |
masato | 0:c99dda90f834 | 184 | } |
masato | 0:c99dda90f834 | 185 | |
masato | 0:c99dda90f834 | 186 | dx = dx_sym*dx; |
masato | 0:c99dda90f834 | 187 | dy = dy_sym*dy; |
masato | 0:c99dda90f834 | 188 | |
masato | 0:c99dda90f834 | 189 | dx_x2 = dx*2; |
masato | 0:c99dda90f834 | 190 | dy_x2 = dy*2; |
masato | 0:c99dda90f834 | 191 | |
masato | 0:c99dda90f834 | 192 | if (dx >= dy) { |
masato | 0:c99dda90f834 | 193 | di = dy_x2 - dx; |
masato | 0:c99dda90f834 | 194 | while (x0 != x1) { |
masato | 0:c99dda90f834 | 195 | |
masato | 0:c99dda90f834 | 196 | pixel(x0, y0, color); |
masato | 0:c99dda90f834 | 197 | x0 += dx_sym; |
masato | 0:c99dda90f834 | 198 | if (di<0) { |
masato | 0:c99dda90f834 | 199 | di += dy_x2; |
masato | 0:c99dda90f834 | 200 | } else { |
masato | 0:c99dda90f834 | 201 | di += dy_x2 - dx_x2; |
masato | 0:c99dda90f834 | 202 | y0 += dy_sym; |
masato | 0:c99dda90f834 | 203 | } |
masato | 0:c99dda90f834 | 204 | } |
masato | 0:c99dda90f834 | 205 | pixel(x0, y0, color); |
masato | 0:c99dda90f834 | 206 | } else { |
masato | 0:c99dda90f834 | 207 | di = dx_x2 - dy; |
masato | 0:c99dda90f834 | 208 | while (y0 != y1) { |
masato | 0:c99dda90f834 | 209 | pixel(x0, y0, color); |
masato | 0:c99dda90f834 | 210 | y0 += dy_sym; |
masato | 0:c99dda90f834 | 211 | if (di < 0) { |
masato | 0:c99dda90f834 | 212 | di += dx_x2; |
masato | 0:c99dda90f834 | 213 | } else { |
masato | 0:c99dda90f834 | 214 | di += dx_x2 - dy_x2; |
masato | 0:c99dda90f834 | 215 | x0 += dx_sym; |
masato | 0:c99dda90f834 | 216 | } |
masato | 0:c99dda90f834 | 217 | } |
masato | 0:c99dda90f834 | 218 | pixel(x0, y0, color); |
masato | 0:c99dda90f834 | 219 | } |
masato | 0:c99dda90f834 | 220 | if(auto_up) copy_to_lcd(); |
masato | 0:c99dda90f834 | 221 | } |
masato | 0:c99dda90f834 | 222 | |
masato | 0:c99dda90f834 | 223 | void sharp_mlcd::rect(int x0, int y0, int x1, int y1, int color) |
masato | 0:c99dda90f834 | 224 | { |
masato | 0:c99dda90f834 | 225 | |
masato | 0:c99dda90f834 | 226 | if (x1 > x0) line(x0,y0,x1,y0,color); |
masato | 0:c99dda90f834 | 227 | else line(x1,y0,x0,y0,color); |
masato | 0:c99dda90f834 | 228 | |
masato | 0:c99dda90f834 | 229 | if (y1 > y0) line(x0,y0,x0,y1,color); |
masato | 0:c99dda90f834 | 230 | else line(x0,y1,x0,y0,color); |
masato | 0:c99dda90f834 | 231 | |
masato | 0:c99dda90f834 | 232 | if (x1 > x0) line(x0,y1,x1,y1,color); |
masato | 0:c99dda90f834 | 233 | else line(x1,y1,x0,y1,color); |
masato | 0:c99dda90f834 | 234 | |
masato | 0:c99dda90f834 | 235 | if (y1 > y0) line(x1,y0,x1,y1,color); |
masato | 0:c99dda90f834 | 236 | else line(x1,y1,x1,y0,color); |
masato | 0:c99dda90f834 | 237 | |
masato | 0:c99dda90f834 | 238 | if(auto_up) copy_to_lcd(); |
masato | 0:c99dda90f834 | 239 | } |
masato | 0:c99dda90f834 | 240 | |
masato | 0:c99dda90f834 | 241 | void sharp_mlcd::fillrect(int x0, int y0, int x1, int y1, int color) |
masato | 0:c99dda90f834 | 242 | { |
masato | 0:c99dda90f834 | 243 | int l,c,i; |
masato | 0:c99dda90f834 | 244 | if(x0 > x1) { |
masato | 0:c99dda90f834 | 245 | i = x0; |
masato | 0:c99dda90f834 | 246 | x0 = x1; |
masato | 0:c99dda90f834 | 247 | x1 = i; |
masato | 0:c99dda90f834 | 248 | } |
masato | 0:c99dda90f834 | 249 | |
masato | 0:c99dda90f834 | 250 | if(y0 > y1) { |
masato | 0:c99dda90f834 | 251 | i = y0; |
masato | 0:c99dda90f834 | 252 | y0 = y1; |
masato | 0:c99dda90f834 | 253 | y1 = i; |
masato | 0:c99dda90f834 | 254 | } |
masato | 0:c99dda90f834 | 255 | |
masato | 0:c99dda90f834 | 256 | for(l = x0; l<= x1; l ++) { |
masato | 0:c99dda90f834 | 257 | for(c = y0; c<= y1; c++) { |
masato | 0:c99dda90f834 | 258 | pixel(l,c,color); |
masato | 0:c99dda90f834 | 259 | } |
masato | 0:c99dda90f834 | 260 | } |
masato | 0:c99dda90f834 | 261 | if(auto_up) copy_to_lcd(); |
masato | 0:c99dda90f834 | 262 | } |
masato | 0:c99dda90f834 | 263 | |
masato | 0:c99dda90f834 | 264 | |
masato | 0:c99dda90f834 | 265 | |
masato | 0:c99dda90f834 | 266 | void sharp_mlcd::circle(int x0, int y0, int r, int color) |
masato | 0:c99dda90f834 | 267 | { |
masato | 0:c99dda90f834 | 268 | |
masato | 0:c99dda90f834 | 269 | int draw_x0, draw_y0; |
masato | 0:c99dda90f834 | 270 | int draw_x1, draw_y1; |
masato | 0:c99dda90f834 | 271 | int draw_x2, draw_y2; |
masato | 0:c99dda90f834 | 272 | int draw_x3, draw_y3; |
masato | 0:c99dda90f834 | 273 | int draw_x4, draw_y4; |
masato | 0:c99dda90f834 | 274 | int draw_x5, draw_y5; |
masato | 0:c99dda90f834 | 275 | int draw_x6, draw_y6; |
masato | 0:c99dda90f834 | 276 | int draw_x7, draw_y7; |
masato | 0:c99dda90f834 | 277 | int xx, yy; |
masato | 0:c99dda90f834 | 278 | int di; |
masato | 0:c99dda90f834 | 279 | //WindowMax(); |
masato | 0:c99dda90f834 | 280 | if (r == 0) { /* no radius */ |
masato | 0:c99dda90f834 | 281 | return; |
masato | 0:c99dda90f834 | 282 | } |
masato | 0:c99dda90f834 | 283 | |
masato | 0:c99dda90f834 | 284 | draw_x0 = draw_x1 = x0; |
masato | 0:c99dda90f834 | 285 | draw_y0 = draw_y1 = y0 + r; |
masato | 0:c99dda90f834 | 286 | if (draw_y0 < height()) { |
masato | 0:c99dda90f834 | 287 | pixel(draw_x0, draw_y0, color); /* 90 degree */ |
masato | 0:c99dda90f834 | 288 | } |
masato | 0:c99dda90f834 | 289 | |
masato | 0:c99dda90f834 | 290 | draw_x2 = draw_x3 = x0; |
masato | 0:c99dda90f834 | 291 | draw_y2 = draw_y3 = y0 - r; |
masato | 0:c99dda90f834 | 292 | if (draw_y2 >= 0) { |
masato | 0:c99dda90f834 | 293 | pixel(draw_x2, draw_y2, color); /* 270 degree */ |
masato | 0:c99dda90f834 | 294 | } |
masato | 0:c99dda90f834 | 295 | |
masato | 0:c99dda90f834 | 296 | draw_x4 = draw_x6 = x0 + r; |
masato | 0:c99dda90f834 | 297 | draw_y4 = draw_y6 = y0; |
masato | 0:c99dda90f834 | 298 | if (draw_x4 < width()) { |
masato | 0:c99dda90f834 | 299 | pixel(draw_x4, draw_y4, color); /* 0 degree */ |
masato | 0:c99dda90f834 | 300 | } |
masato | 0:c99dda90f834 | 301 | |
masato | 0:c99dda90f834 | 302 | draw_x5 = draw_x7 = x0 - r; |
masato | 0:c99dda90f834 | 303 | draw_y5 = draw_y7 = y0; |
masato | 0:c99dda90f834 | 304 | if (draw_x5>=0) { |
masato | 0:c99dda90f834 | 305 | pixel(draw_x5, draw_y5, color); /* 180 degree */ |
masato | 0:c99dda90f834 | 306 | } |
masato | 0:c99dda90f834 | 307 | |
masato | 0:c99dda90f834 | 308 | if (r == 1) { |
masato | 0:c99dda90f834 | 309 | return; |
masato | 0:c99dda90f834 | 310 | } |
masato | 0:c99dda90f834 | 311 | |
masato | 0:c99dda90f834 | 312 | di = 3 - 2*r; |
masato | 0:c99dda90f834 | 313 | xx = 0; |
masato | 0:c99dda90f834 | 314 | yy = r; |
masato | 0:c99dda90f834 | 315 | while (xx < yy) { |
masato | 0:c99dda90f834 | 316 | |
masato | 0:c99dda90f834 | 317 | if (di < 0) { |
masato | 0:c99dda90f834 | 318 | di += 4*xx + 6; |
masato | 0:c99dda90f834 | 319 | } else { |
masato | 0:c99dda90f834 | 320 | di += 4*(xx - yy) + 10; |
masato | 0:c99dda90f834 | 321 | yy--; |
masato | 0:c99dda90f834 | 322 | draw_y0--; |
masato | 0:c99dda90f834 | 323 | draw_y1--; |
masato | 0:c99dda90f834 | 324 | draw_y2++; |
masato | 0:c99dda90f834 | 325 | draw_y3++; |
masato | 0:c99dda90f834 | 326 | draw_x4--; |
masato | 0:c99dda90f834 | 327 | draw_x5++; |
masato | 0:c99dda90f834 | 328 | draw_x6--; |
masato | 0:c99dda90f834 | 329 | draw_x7++; |
masato | 0:c99dda90f834 | 330 | } |
masato | 0:c99dda90f834 | 331 | xx++; |
masato | 0:c99dda90f834 | 332 | draw_x0++; |
masato | 0:c99dda90f834 | 333 | draw_x1--; |
masato | 0:c99dda90f834 | 334 | draw_x2++; |
masato | 0:c99dda90f834 | 335 | draw_x3--; |
masato | 0:c99dda90f834 | 336 | draw_y4++; |
masato | 0:c99dda90f834 | 337 | draw_y5++; |
masato | 0:c99dda90f834 | 338 | draw_y6--; |
masato | 0:c99dda90f834 | 339 | draw_y7--; |
masato | 0:c99dda90f834 | 340 | |
masato | 0:c99dda90f834 | 341 | if ( (draw_x0 <= width()) && (draw_y0>=0) ) { |
masato | 0:c99dda90f834 | 342 | pixel(draw_x0, draw_y0, color); |
masato | 0:c99dda90f834 | 343 | } |
masato | 0:c99dda90f834 | 344 | |
masato | 0:c99dda90f834 | 345 | if ( (draw_x1 >= 0) && (draw_y1 >= 0) ) { |
masato | 0:c99dda90f834 | 346 | pixel(draw_x1, draw_y1, color); |
masato | 0:c99dda90f834 | 347 | } |
masato | 0:c99dda90f834 | 348 | |
masato | 0:c99dda90f834 | 349 | if ( (draw_x2 <= width()) && (draw_y2 <= height()) ) { |
masato | 0:c99dda90f834 | 350 | pixel(draw_x2, draw_y2, color); |
masato | 0:c99dda90f834 | 351 | } |
masato | 0:c99dda90f834 | 352 | |
masato | 0:c99dda90f834 | 353 | if ( (draw_x3 >=0 ) && (draw_y3 <= height()) ) { |
masato | 0:c99dda90f834 | 354 | pixel(draw_x3, draw_y3, color); |
masato | 0:c99dda90f834 | 355 | } |
masato | 0:c99dda90f834 | 356 | |
masato | 0:c99dda90f834 | 357 | if ( (draw_x4 <= width()) && (draw_y4 >= 0) ) { |
masato | 0:c99dda90f834 | 358 | pixel(draw_x4, draw_y4, color); |
masato | 0:c99dda90f834 | 359 | } |
masato | 0:c99dda90f834 | 360 | |
masato | 0:c99dda90f834 | 361 | if ( (draw_x5 >= 0) && (draw_y5 >= 0) ) { |
masato | 0:c99dda90f834 | 362 | pixel(draw_x5, draw_y5, color); |
masato | 0:c99dda90f834 | 363 | } |
masato | 0:c99dda90f834 | 364 | if ( (draw_x6 <=width()) && (draw_y6 <= height()) ) { |
masato | 0:c99dda90f834 | 365 | pixel(draw_x6, draw_y6, color); |
masato | 0:c99dda90f834 | 366 | } |
masato | 0:c99dda90f834 | 367 | if ( (draw_x7 >= 0) && (draw_y7 <= height()) ) { |
masato | 0:c99dda90f834 | 368 | pixel(draw_x7, draw_y7, color); |
masato | 0:c99dda90f834 | 369 | } |
masato | 0:c99dda90f834 | 370 | } |
masato | 0:c99dda90f834 | 371 | if(auto_up) copy_to_lcd(); |
masato | 0:c99dda90f834 | 372 | } |
masato | 0:c99dda90f834 | 373 | |
masato | 0:c99dda90f834 | 374 | void sharp_mlcd::fillcircle(int x, int y, int r, int color) |
masato | 0:c99dda90f834 | 375 | { |
masato | 0:c99dda90f834 | 376 | int i,up; |
masato | 0:c99dda90f834 | 377 | up = auto_up; |
masato | 0:c99dda90f834 | 378 | auto_up = 0; // off |
masato | 0:c99dda90f834 | 379 | for (i = 0; i <= r; i++) |
masato | 0:c99dda90f834 | 380 | circle(x,y,i,color); |
masato | 0:c99dda90f834 | 381 | auto_up = up; |
masato | 0:c99dda90f834 | 382 | if(auto_up) copy_to_lcd(); |
masato | 0:c99dda90f834 | 383 | } |
masato | 0:c99dda90f834 | 384 | |
masato | 0:c99dda90f834 | 385 | void sharp_mlcd::setmode(int mode) |
masato | 0:c99dda90f834 | 386 | { |
masato | 0:c99dda90f834 | 387 | draw_mode = mode; |
masato | 0:c99dda90f834 | 388 | } |
masato | 0:c99dda90f834 | 389 | |
masato | 0:c99dda90f834 | 390 | void sharp_mlcd::locate(int x, int y) |
masato | 0:c99dda90f834 | 391 | { |
masato | 0:c99dda90f834 | 392 | char_x = x; |
masato | 0:c99dda90f834 | 393 | char_y = y; |
masato | 0:c99dda90f834 | 394 | } |
masato | 0:c99dda90f834 | 395 | |
masato | 0:c99dda90f834 | 396 | |
masato | 0:c99dda90f834 | 397 | |
masato | 0:c99dda90f834 | 398 | int sharp_mlcd::columns() |
masato | 0:c99dda90f834 | 399 | { |
masato | 0:c99dda90f834 | 400 | return width() / font[1]; |
masato | 0:c99dda90f834 | 401 | } |
masato | 0:c99dda90f834 | 402 | |
masato | 0:c99dda90f834 | 403 | |
masato | 0:c99dda90f834 | 404 | |
masato | 0:c99dda90f834 | 405 | int sharp_mlcd::rows() |
masato | 0:c99dda90f834 | 406 | { |
masato | 0:c99dda90f834 | 407 | return height() / font[2]; |
masato | 0:c99dda90f834 | 408 | } |
masato | 0:c99dda90f834 | 409 | |
masato | 0:c99dda90f834 | 410 | |
masato | 0:c99dda90f834 | 411 | |
masato | 0:c99dda90f834 | 412 | int sharp_mlcd::_putc(int value) |
masato | 0:c99dda90f834 | 413 | { |
masato | 0:c99dda90f834 | 414 | if (value == '\n') { // new line |
masato | 0:c99dda90f834 | 415 | char_x = 0; |
masato | 0:c99dda90f834 | 416 | char_y = char_y + font[2]; |
masato | 0:c99dda90f834 | 417 | if (char_y >= height() - font[2]) { |
masato | 0:c99dda90f834 | 418 | char_y = 0; |
masato | 0:c99dda90f834 | 419 | } |
masato | 0:c99dda90f834 | 420 | } else { |
masato | 0:c99dda90f834 | 421 | character(char_x, char_y, value); |
masato | 0:c99dda90f834 | 422 | if(auto_up) copy_to_lcd(); |
masato | 0:c99dda90f834 | 423 | } |
masato | 0:c99dda90f834 | 424 | return value; |
masato | 0:c99dda90f834 | 425 | } |
masato | 0:c99dda90f834 | 426 | |
masato | 0:c99dda90f834 | 427 | void sharp_mlcd::character(int x, int y, int c) |
masato | 0:c99dda90f834 | 428 | { |
masato | 0:c99dda90f834 | 429 | unsigned int hor,vert,offset,bpl,j,i,b; |
masato | 0:c99dda90f834 | 430 | unsigned char* zeichen; |
masato | 0:c99dda90f834 | 431 | unsigned char z,w; |
masato | 0:c99dda90f834 | 432 | |
masato | 0:c99dda90f834 | 433 | if ((c < 31) || (c > 127)) return; // test char range |
masato | 0:c99dda90f834 | 434 | |
masato | 0:c99dda90f834 | 435 | // read font parameter from start of array |
masato | 0:c99dda90f834 | 436 | offset = font[0]; // bytes / char |
masato | 0:c99dda90f834 | 437 | hor = font[1]; // get hor size of font |
masato | 0:c99dda90f834 | 438 | vert = font[2]; // get vert size of font |
masato | 0:c99dda90f834 | 439 | bpl = font[3]; // bytes per line |
masato | 0:c99dda90f834 | 440 | |
masato | 0:c99dda90f834 | 441 | if (char_x + hor > width()) { |
masato | 0:c99dda90f834 | 442 | char_x = 0; |
masato | 0:c99dda90f834 | 443 | char_y = char_y + vert; |
masato | 0:c99dda90f834 | 444 | if (char_y >= height() - font[2]) { |
masato | 0:c99dda90f834 | 445 | char_y = 0; |
masato | 0:c99dda90f834 | 446 | } |
masato | 0:c99dda90f834 | 447 | } |
masato | 0:c99dda90f834 | 448 | |
masato | 0:c99dda90f834 | 449 | zeichen = &font[((c -32) * offset) + 4]; // start of char bitmap |
masato | 0:c99dda90f834 | 450 | w = zeichen[0]; // width of actual char |
masato | 0:c99dda90f834 | 451 | // construct the char into the buffer |
masato | 0:c99dda90f834 | 452 | for (j=0; j<vert; j++) { // vert line |
masato | 0:c99dda90f834 | 453 | for (i=0; i<hor; i++) { // horz line |
masato | 0:c99dda90f834 | 454 | z = zeichen[bpl * i + ((j & 0xF8) >> 3)+1]; |
masato | 0:c99dda90f834 | 455 | b = 1 << (j & 0x07); |
masato | 0:c99dda90f834 | 456 | if (( z & b ) == 0x00) { |
masato | 0:c99dda90f834 | 457 | pixel(x+i,y+j,0); |
masato | 0:c99dda90f834 | 458 | } else { |
masato | 0:c99dda90f834 | 459 | pixel(x+i,y+j,1); |
masato | 0:c99dda90f834 | 460 | } |
masato | 0:c99dda90f834 | 461 | |
masato | 0:c99dda90f834 | 462 | } |
masato | 0:c99dda90f834 | 463 | } |
masato | 0:c99dda90f834 | 464 | |
masato | 0:c99dda90f834 | 465 | char_x += w; |
masato | 0:c99dda90f834 | 466 | } |
masato | 0:c99dda90f834 | 467 | |
masato | 0:c99dda90f834 | 468 | void sharp_mlcd::set_font(unsigned char* f) |
masato | 0:c99dda90f834 | 469 | { |
masato | 0:c99dda90f834 | 470 | font = f; |
masato | 0:c99dda90f834 | 471 | } |
masato | 0:c99dda90f834 | 472 | |
masato | 0:c99dda90f834 | 473 | void sharp_mlcd::set_auto_up(unsigned int up) |
masato | 0:c99dda90f834 | 474 | { |
masato | 0:c99dda90f834 | 475 | if(up ) auto_up = 1; |
masato | 0:c99dda90f834 | 476 | else auto_up = 0; |
masato | 0:c99dda90f834 | 477 | } |
masato | 0:c99dda90f834 | 478 | |
masato | 0:c99dda90f834 | 479 | unsigned int sharp_mlcd::get_auto_up(void) |
masato | 0:c99dda90f834 | 480 | { |
masato | 0:c99dda90f834 | 481 | return (auto_up); |
masato | 0:c99dda90f834 | 482 | } |
masato | 0:c99dda90f834 | 483 | |
masato | 1:f8ba3b236d12 | 484 | void sharp_mlcd::print_bm(Bitmap bm, int x, int y, int color = 1) |
masato | 0:c99dda90f834 | 485 | { |
masato | 0:c99dda90f834 | 486 | int h,v,b; |
masato | 0:c99dda90f834 | 487 | char d; |
masato | 0:c99dda90f834 | 488 | |
masato | 0:c99dda90f834 | 489 | for(v=0; v < bm.ySize; v++) { // lines |
masato | 0:c99dda90f834 | 490 | for(h=0; h < bm.xSize; h++) { // pixel |
masato | 0:c99dda90f834 | 491 | if(h + x > WIDTH-1) break; |
masato | 0:c99dda90f834 | 492 | if(v + y > HEIGHT-1) break; |
masato | 0:c99dda90f834 | 493 | d = bm.data[bm.Byte_in_Line * v + ((h & 0xF8) >> 3)]; |
masato | 0:c99dda90f834 | 494 | b = 0x80 >> (h & 0x07); |
masato | 0:c99dda90f834 | 495 | if((d & b) == 0) { |
masato | 1:f8ba3b236d12 | 496 | pixel(x+h,y+v,!color); |
masato | 0:c99dda90f834 | 497 | } else { |
masato | 1:f8ba3b236d12 | 498 | pixel(x+h,y+v,color); |
masato | 0:c99dda90f834 | 499 | } |
masato | 0:c99dda90f834 | 500 | } |
masato | 0:c99dda90f834 | 501 | } |
masato | 0:c99dda90f834 | 502 | } |
masato | 0:c99dda90f834 | 503 |