to extend font size
Fork of sharp_mlcd by
sharp_mlcd.cpp@0:c99dda90f834, 2014-05-10 (annotated)
- Committer:
- masato
- Date:
- Sat May 10 15:32:38 2014 +0000
- Revision:
- 0:c99dda90f834
- Child:
- 1:f8ba3b236d12
working
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 | 0:c99dda90f834 | 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 | 0:c99dda90f834 | 65 | // timer.attach(attime, 0.5); // 1KHz |
masato | 0:c99dda90f834 | 66 | |
masato | 0:c99dda90f834 | 67 | _CS = 1; |
masato | 0:c99dda90f834 | 68 | wait_us(4); |
masato | 0:c99dda90f834 | 69 | _spi.write(0x20); // 0x20:clear 0x00:run |
masato | 0:c99dda90f834 | 70 | _spi.write(0); // dummy |
masato | 0:c99dda90f834 | 71 | wait_us(2); |
masato | 0:c99dda90f834 | 72 | _CS = 0; |
masato | 0:c99dda90f834 | 73 | |
masato | 0:c99dda90f834 | 74 | // clear and update LCD |
masato | 0:c99dda90f834 | 75 | cls(); |
masato | 0:c99dda90f834 | 76 | // memset(buffer,0xff,BUFFER_SIZE); // clear display buffer |
masato | 0:c99dda90f834 | 77 | // copy_to_lcd(); |
masato | 0:c99dda90f834 | 78 | auto_up = 1; // switch on auto update |
masato | 0:c99dda90f834 | 79 | // dont do this by default. Make the user call |
masato | 0:c99dda90f834 | 80 | //claim(stdout); // redirekt printf to lcd |
masato | 0:c99dda90f834 | 81 | locate(0,0); |
masato | 0:c99dda90f834 | 82 | set_font((unsigned char*)Small_7); // standart font |
masato | 0:c99dda90f834 | 83 | } |
masato | 0:c99dda90f834 | 84 | |
masato | 0:c99dda90f834 | 85 | // set one pixel in buffer |
masato | 0:c99dda90f834 | 86 | |
masato | 0:c99dda90f834 | 87 | void sharp_mlcd::pixel(int x, int y, int color) |
masato | 0:c99dda90f834 | 88 | { |
masato | 0:c99dda90f834 | 89 | // first check parameter |
masato | 0:c99dda90f834 | 90 | if(x > WIDTH || y > HEIGHT || x < 0 || y < 0) return; |
masato | 0:c99dda90f834 | 91 | |
masato | 0:c99dda90f834 | 92 | if(draw_mode == NORMAL) { |
masato | 0:c99dda90f834 | 93 | if(color == 0) |
masato | 0:c99dda90f834 | 94 | buffer[x/8 + (y*WIDTH/8)] &= ~(1 << (7-(x%8))); // set pixel |
masato | 0:c99dda90f834 | 95 | else |
masato | 0:c99dda90f834 | 96 | buffer[x/8 + (y*WIDTH/8)] |= (1 << (7-(x%8))); // erase pixel |
masato | 0:c99dda90f834 | 97 | } else { // XOR mode |
masato | 0:c99dda90f834 | 98 | if(color == 1) |
masato | 0:c99dda90f834 | 99 | buffer[x/8 + (y*WIDTH/8)] ^= (1 << (7-(x%8))); // xor pixel |
masato | 0:c99dda90f834 | 100 | } |
masato | 0:c99dda90f834 | 101 | } |
masato | 0:c99dda90f834 | 102 | |
masato | 0:c99dda90f834 | 103 | // update lcd |
masato | 0:c99dda90f834 | 104 | |
masato | 0:c99dda90f834 | 105 | void sharp_mlcd::attime() { |
masato | 0:c99dda90f834 | 106 | flip = !flip; |
masato | 0:c99dda90f834 | 107 | _EXTCOM = flip; |
masato | 0:c99dda90f834 | 108 | } |
masato | 0:c99dda90f834 | 109 | |
masato | 0:c99dda90f834 | 110 | unsigned char sharp_mlcd::bit_reverse(unsigned char c) { |
masato | 0:c99dda90f834 | 111 | unsigned char u=0; // c = TESTVALUE; |
masato | 0:c99dda90f834 | 112 | int i; |
masato | 0:c99dda90f834 | 113 | |
masato | 0:c99dda90f834 | 114 | for (i=0 ; i<4 ; i++) |
masato | 0:c99dda90f834 | 115 | u |= ((c & (1 << i)) << (7-2*i)) | ((c & (1 << 7-i)) >> (7-2*i)); |
masato | 0:c99dda90f834 | 116 | return u; |
masato | 0:c99dda90f834 | 117 | } |
masato | 0:c99dda90f834 | 118 | |
masato | 0:c99dda90f834 | 119 | void sharp_mlcd::copy_to_lcd(void) |
masato | 0:c99dda90f834 | 120 | { |
masato | 0:c99dda90f834 | 121 | const int start = 0; |
masato | 0:c99dda90f834 | 122 | int x, y; |
masato | 0:c99dda90f834 | 123 | unsigned char *p = (unsigned char*)buffer; // image; |
masato | 0:c99dda90f834 | 124 | |
masato | 0:c99dda90f834 | 125 | _CS = 1; |
masato | 0:c99dda90f834 | 126 | wait_us(4); // min 3us |
masato | 0:c99dda90f834 | 127 | // |
masato | 0:c99dda90f834 | 128 | for (y = 0; y < HEIGHT; y++) { |
masato | 0:c99dda90f834 | 129 | _spi.write(0x80); // update mode (multi line) |
masato | 0:c99dda90f834 | 130 | _spi.write(bit_reverse((y + 1 + start) % HEIGHT)); // set gate line address |
masato | 0:c99dda90f834 | 131 | for (x = 0; x < (WIDTH / 8); x++) { |
masato | 0:c99dda90f834 | 132 | _spi.write(*p++); // (((y / 8) + x + mode) % 2)? 0xff: 0); |
masato | 0:c99dda90f834 | 133 | } |
masato | 0:c99dda90f834 | 134 | } |
masato | 0:c99dda90f834 | 135 | // |
masato | 0:c99dda90f834 | 136 | wait_us(2); // min 1us |
masato | 0:c99dda90f834 | 137 | _CS = 0; |
masato | 0:c99dda90f834 | 138 | } |
masato | 0:c99dda90f834 | 139 | |
masato | 0:c99dda90f834 | 140 | void sharp_mlcd::cls(void) |
masato | 0:c99dda90f834 | 141 | { |
masato | 0:c99dda90f834 | 142 | memset(buffer,0x00,BUFFER_SIZE); // clear display buffer |
masato | 0:c99dda90f834 | 143 | copy_to_lcd(); |
masato | 0:c99dda90f834 | 144 | } |
masato | 0:c99dda90f834 | 145 | |
masato | 0:c99dda90f834 | 146 | |
masato | 0:c99dda90f834 | 147 | void sharp_mlcd::line(int x0, int y0, int x1, int y1, int color) |
masato | 0:c99dda90f834 | 148 | { |
masato | 0:c99dda90f834 | 149 | int dx = 0, dy = 0; |
masato | 0:c99dda90f834 | 150 | int dx_sym = 0, dy_sym = 0; |
masato | 0:c99dda90f834 | 151 | int dx_x2 = 0, dy_x2 = 0; |
masato | 0:c99dda90f834 | 152 | int di = 0; |
masato | 0:c99dda90f834 | 153 | |
masato | 0:c99dda90f834 | 154 | dx = x1-x0; |
masato | 0:c99dda90f834 | 155 | dy = y1-y0; |
masato | 0:c99dda90f834 | 156 | |
masato | 0:c99dda90f834 | 157 | // if (dx == 0) { /* vertical line */ |
masato | 0:c99dda90f834 | 158 | // if (y1 > y0) vline(x0,y0,y1,color); |
masato | 0:c99dda90f834 | 159 | // else vline(x0,y1,y0,color); |
masato | 0:c99dda90f834 | 160 | // return; |
masato | 0:c99dda90f834 | 161 | // } |
masato | 0:c99dda90f834 | 162 | |
masato | 0:c99dda90f834 | 163 | if (dx > 0) { |
masato | 0:c99dda90f834 | 164 | dx_sym = 1; |
masato | 0:c99dda90f834 | 165 | } else { |
masato | 0:c99dda90f834 | 166 | dx_sym = -1; |
masato | 0:c99dda90f834 | 167 | } |
masato | 0:c99dda90f834 | 168 | // if (dy == 0) { /* horizontal line */ |
masato | 0:c99dda90f834 | 169 | // if (x1 > x0) hline(x0,x1,y0,color); |
masato | 0:c99dda90f834 | 170 | // else hline(x1,x0,y0,color); |
masato | 0:c99dda90f834 | 171 | // return; |
masato | 0:c99dda90f834 | 172 | // } |
masato | 0:c99dda90f834 | 173 | |
masato | 0:c99dda90f834 | 174 | if (dy > 0) { |
masato | 0:c99dda90f834 | 175 | dy_sym = 1; |
masato | 0:c99dda90f834 | 176 | } else { |
masato | 0:c99dda90f834 | 177 | dy_sym = -1; |
masato | 0:c99dda90f834 | 178 | } |
masato | 0:c99dda90f834 | 179 | |
masato | 0:c99dda90f834 | 180 | dx = dx_sym*dx; |
masato | 0:c99dda90f834 | 181 | dy = dy_sym*dy; |
masato | 0:c99dda90f834 | 182 | |
masato | 0:c99dda90f834 | 183 | dx_x2 = dx*2; |
masato | 0:c99dda90f834 | 184 | dy_x2 = dy*2; |
masato | 0:c99dda90f834 | 185 | |
masato | 0:c99dda90f834 | 186 | if (dx >= dy) { |
masato | 0:c99dda90f834 | 187 | di = dy_x2 - dx; |
masato | 0:c99dda90f834 | 188 | while (x0 != x1) { |
masato | 0:c99dda90f834 | 189 | |
masato | 0:c99dda90f834 | 190 | pixel(x0, y0, color); |
masato | 0:c99dda90f834 | 191 | x0 += dx_sym; |
masato | 0:c99dda90f834 | 192 | if (di<0) { |
masato | 0:c99dda90f834 | 193 | di += dy_x2; |
masato | 0:c99dda90f834 | 194 | } else { |
masato | 0:c99dda90f834 | 195 | di += dy_x2 - dx_x2; |
masato | 0:c99dda90f834 | 196 | y0 += dy_sym; |
masato | 0:c99dda90f834 | 197 | } |
masato | 0:c99dda90f834 | 198 | } |
masato | 0:c99dda90f834 | 199 | pixel(x0, y0, color); |
masato | 0:c99dda90f834 | 200 | } else { |
masato | 0:c99dda90f834 | 201 | di = dx_x2 - dy; |
masato | 0:c99dda90f834 | 202 | while (y0 != y1) { |
masato | 0:c99dda90f834 | 203 | pixel(x0, y0, color); |
masato | 0:c99dda90f834 | 204 | y0 += dy_sym; |
masato | 0:c99dda90f834 | 205 | if (di < 0) { |
masato | 0:c99dda90f834 | 206 | di += dx_x2; |
masato | 0:c99dda90f834 | 207 | } else { |
masato | 0:c99dda90f834 | 208 | di += dx_x2 - dy_x2; |
masato | 0:c99dda90f834 | 209 | x0 += dx_sym; |
masato | 0:c99dda90f834 | 210 | } |
masato | 0:c99dda90f834 | 211 | } |
masato | 0:c99dda90f834 | 212 | pixel(x0, y0, color); |
masato | 0:c99dda90f834 | 213 | } |
masato | 0:c99dda90f834 | 214 | if(auto_up) copy_to_lcd(); |
masato | 0:c99dda90f834 | 215 | } |
masato | 0:c99dda90f834 | 216 | |
masato | 0:c99dda90f834 | 217 | void sharp_mlcd::rect(int x0, int y0, int x1, int y1, int color) |
masato | 0:c99dda90f834 | 218 | { |
masato | 0:c99dda90f834 | 219 | |
masato | 0:c99dda90f834 | 220 | if (x1 > x0) line(x0,y0,x1,y0,color); |
masato | 0:c99dda90f834 | 221 | else line(x1,y0,x0,y0,color); |
masato | 0:c99dda90f834 | 222 | |
masato | 0:c99dda90f834 | 223 | if (y1 > y0) line(x0,y0,x0,y1,color); |
masato | 0:c99dda90f834 | 224 | else line(x0,y1,x0,y0,color); |
masato | 0:c99dda90f834 | 225 | |
masato | 0:c99dda90f834 | 226 | if (x1 > x0) line(x0,y1,x1,y1,color); |
masato | 0:c99dda90f834 | 227 | else line(x1,y1,x0,y1,color); |
masato | 0:c99dda90f834 | 228 | |
masato | 0:c99dda90f834 | 229 | if (y1 > y0) line(x1,y0,x1,y1,color); |
masato | 0:c99dda90f834 | 230 | else line(x1,y1,x1,y0,color); |
masato | 0:c99dda90f834 | 231 | |
masato | 0:c99dda90f834 | 232 | if(auto_up) copy_to_lcd(); |
masato | 0:c99dda90f834 | 233 | } |
masato | 0:c99dda90f834 | 234 | |
masato | 0:c99dda90f834 | 235 | void sharp_mlcd::fillrect(int x0, int y0, int x1, int y1, int color) |
masato | 0:c99dda90f834 | 236 | { |
masato | 0:c99dda90f834 | 237 | int l,c,i; |
masato | 0:c99dda90f834 | 238 | if(x0 > x1) { |
masato | 0:c99dda90f834 | 239 | i = x0; |
masato | 0:c99dda90f834 | 240 | x0 = x1; |
masato | 0:c99dda90f834 | 241 | x1 = i; |
masato | 0:c99dda90f834 | 242 | } |
masato | 0:c99dda90f834 | 243 | |
masato | 0:c99dda90f834 | 244 | if(y0 > y1) { |
masato | 0:c99dda90f834 | 245 | i = y0; |
masato | 0:c99dda90f834 | 246 | y0 = y1; |
masato | 0:c99dda90f834 | 247 | y1 = i; |
masato | 0:c99dda90f834 | 248 | } |
masato | 0:c99dda90f834 | 249 | |
masato | 0:c99dda90f834 | 250 | for(l = x0; l<= x1; l ++) { |
masato | 0:c99dda90f834 | 251 | for(c = y0; c<= y1; c++) { |
masato | 0:c99dda90f834 | 252 | pixel(l,c,color); |
masato | 0:c99dda90f834 | 253 | } |
masato | 0:c99dda90f834 | 254 | } |
masato | 0:c99dda90f834 | 255 | if(auto_up) copy_to_lcd(); |
masato | 0:c99dda90f834 | 256 | } |
masato | 0:c99dda90f834 | 257 | |
masato | 0:c99dda90f834 | 258 | |
masato | 0:c99dda90f834 | 259 | |
masato | 0:c99dda90f834 | 260 | void sharp_mlcd::circle(int x0, int y0, int r, int color) |
masato | 0:c99dda90f834 | 261 | { |
masato | 0:c99dda90f834 | 262 | |
masato | 0:c99dda90f834 | 263 | int draw_x0, draw_y0; |
masato | 0:c99dda90f834 | 264 | int draw_x1, draw_y1; |
masato | 0:c99dda90f834 | 265 | int draw_x2, draw_y2; |
masato | 0:c99dda90f834 | 266 | int draw_x3, draw_y3; |
masato | 0:c99dda90f834 | 267 | int draw_x4, draw_y4; |
masato | 0:c99dda90f834 | 268 | int draw_x5, draw_y5; |
masato | 0:c99dda90f834 | 269 | int draw_x6, draw_y6; |
masato | 0:c99dda90f834 | 270 | int draw_x7, draw_y7; |
masato | 0:c99dda90f834 | 271 | int xx, yy; |
masato | 0:c99dda90f834 | 272 | int di; |
masato | 0:c99dda90f834 | 273 | //WindowMax(); |
masato | 0:c99dda90f834 | 274 | if (r == 0) { /* no radius */ |
masato | 0:c99dda90f834 | 275 | return; |
masato | 0:c99dda90f834 | 276 | } |
masato | 0:c99dda90f834 | 277 | |
masato | 0:c99dda90f834 | 278 | draw_x0 = draw_x1 = x0; |
masato | 0:c99dda90f834 | 279 | draw_y0 = draw_y1 = y0 + r; |
masato | 0:c99dda90f834 | 280 | if (draw_y0 < height()) { |
masato | 0:c99dda90f834 | 281 | pixel(draw_x0, draw_y0, color); /* 90 degree */ |
masato | 0:c99dda90f834 | 282 | } |
masato | 0:c99dda90f834 | 283 | |
masato | 0:c99dda90f834 | 284 | draw_x2 = draw_x3 = x0; |
masato | 0:c99dda90f834 | 285 | draw_y2 = draw_y3 = y0 - r; |
masato | 0:c99dda90f834 | 286 | if (draw_y2 >= 0) { |
masato | 0:c99dda90f834 | 287 | pixel(draw_x2, draw_y2, color); /* 270 degree */ |
masato | 0:c99dda90f834 | 288 | } |
masato | 0:c99dda90f834 | 289 | |
masato | 0:c99dda90f834 | 290 | draw_x4 = draw_x6 = x0 + r; |
masato | 0:c99dda90f834 | 291 | draw_y4 = draw_y6 = y0; |
masato | 0:c99dda90f834 | 292 | if (draw_x4 < width()) { |
masato | 0:c99dda90f834 | 293 | pixel(draw_x4, draw_y4, color); /* 0 degree */ |
masato | 0:c99dda90f834 | 294 | } |
masato | 0:c99dda90f834 | 295 | |
masato | 0:c99dda90f834 | 296 | draw_x5 = draw_x7 = x0 - r; |
masato | 0:c99dda90f834 | 297 | draw_y5 = draw_y7 = y0; |
masato | 0:c99dda90f834 | 298 | if (draw_x5>=0) { |
masato | 0:c99dda90f834 | 299 | pixel(draw_x5, draw_y5, color); /* 180 degree */ |
masato | 0:c99dda90f834 | 300 | } |
masato | 0:c99dda90f834 | 301 | |
masato | 0:c99dda90f834 | 302 | if (r == 1) { |
masato | 0:c99dda90f834 | 303 | return; |
masato | 0:c99dda90f834 | 304 | } |
masato | 0:c99dda90f834 | 305 | |
masato | 0:c99dda90f834 | 306 | di = 3 - 2*r; |
masato | 0:c99dda90f834 | 307 | xx = 0; |
masato | 0:c99dda90f834 | 308 | yy = r; |
masato | 0:c99dda90f834 | 309 | while (xx < yy) { |
masato | 0:c99dda90f834 | 310 | |
masato | 0:c99dda90f834 | 311 | if (di < 0) { |
masato | 0:c99dda90f834 | 312 | di += 4*xx + 6; |
masato | 0:c99dda90f834 | 313 | } else { |
masato | 0:c99dda90f834 | 314 | di += 4*(xx - yy) + 10; |
masato | 0:c99dda90f834 | 315 | yy--; |
masato | 0:c99dda90f834 | 316 | draw_y0--; |
masato | 0:c99dda90f834 | 317 | draw_y1--; |
masato | 0:c99dda90f834 | 318 | draw_y2++; |
masato | 0:c99dda90f834 | 319 | draw_y3++; |
masato | 0:c99dda90f834 | 320 | draw_x4--; |
masato | 0:c99dda90f834 | 321 | draw_x5++; |
masato | 0:c99dda90f834 | 322 | draw_x6--; |
masato | 0:c99dda90f834 | 323 | draw_x7++; |
masato | 0:c99dda90f834 | 324 | } |
masato | 0:c99dda90f834 | 325 | xx++; |
masato | 0:c99dda90f834 | 326 | draw_x0++; |
masato | 0:c99dda90f834 | 327 | draw_x1--; |
masato | 0:c99dda90f834 | 328 | draw_x2++; |
masato | 0:c99dda90f834 | 329 | draw_x3--; |
masato | 0:c99dda90f834 | 330 | draw_y4++; |
masato | 0:c99dda90f834 | 331 | draw_y5++; |
masato | 0:c99dda90f834 | 332 | draw_y6--; |
masato | 0:c99dda90f834 | 333 | draw_y7--; |
masato | 0:c99dda90f834 | 334 | |
masato | 0:c99dda90f834 | 335 | if ( (draw_x0 <= width()) && (draw_y0>=0) ) { |
masato | 0:c99dda90f834 | 336 | pixel(draw_x0, draw_y0, color); |
masato | 0:c99dda90f834 | 337 | } |
masato | 0:c99dda90f834 | 338 | |
masato | 0:c99dda90f834 | 339 | if ( (draw_x1 >= 0) && (draw_y1 >= 0) ) { |
masato | 0:c99dda90f834 | 340 | pixel(draw_x1, draw_y1, color); |
masato | 0:c99dda90f834 | 341 | } |
masato | 0:c99dda90f834 | 342 | |
masato | 0:c99dda90f834 | 343 | if ( (draw_x2 <= width()) && (draw_y2 <= height()) ) { |
masato | 0:c99dda90f834 | 344 | pixel(draw_x2, draw_y2, color); |
masato | 0:c99dda90f834 | 345 | } |
masato | 0:c99dda90f834 | 346 | |
masato | 0:c99dda90f834 | 347 | if ( (draw_x3 >=0 ) && (draw_y3 <= height()) ) { |
masato | 0:c99dda90f834 | 348 | pixel(draw_x3, draw_y3, color); |
masato | 0:c99dda90f834 | 349 | } |
masato | 0:c99dda90f834 | 350 | |
masato | 0:c99dda90f834 | 351 | if ( (draw_x4 <= width()) && (draw_y4 >= 0) ) { |
masato | 0:c99dda90f834 | 352 | pixel(draw_x4, draw_y4, color); |
masato | 0:c99dda90f834 | 353 | } |
masato | 0:c99dda90f834 | 354 | |
masato | 0:c99dda90f834 | 355 | if ( (draw_x5 >= 0) && (draw_y5 >= 0) ) { |
masato | 0:c99dda90f834 | 356 | pixel(draw_x5, draw_y5, color); |
masato | 0:c99dda90f834 | 357 | } |
masato | 0:c99dda90f834 | 358 | if ( (draw_x6 <=width()) && (draw_y6 <= height()) ) { |
masato | 0:c99dda90f834 | 359 | pixel(draw_x6, draw_y6, color); |
masato | 0:c99dda90f834 | 360 | } |
masato | 0:c99dda90f834 | 361 | if ( (draw_x7 >= 0) && (draw_y7 <= height()) ) { |
masato | 0:c99dda90f834 | 362 | pixel(draw_x7, draw_y7, color); |
masato | 0:c99dda90f834 | 363 | } |
masato | 0:c99dda90f834 | 364 | } |
masato | 0:c99dda90f834 | 365 | if(auto_up) copy_to_lcd(); |
masato | 0:c99dda90f834 | 366 | } |
masato | 0:c99dda90f834 | 367 | |
masato | 0:c99dda90f834 | 368 | void sharp_mlcd::fillcircle(int x, int y, int r, int color) |
masato | 0:c99dda90f834 | 369 | { |
masato | 0:c99dda90f834 | 370 | int i,up; |
masato | 0:c99dda90f834 | 371 | up = auto_up; |
masato | 0:c99dda90f834 | 372 | auto_up = 0; // off |
masato | 0:c99dda90f834 | 373 | for (i = 0; i <= r; i++) |
masato | 0:c99dda90f834 | 374 | circle(x,y,i,color); |
masato | 0:c99dda90f834 | 375 | auto_up = up; |
masato | 0:c99dda90f834 | 376 | if(auto_up) copy_to_lcd(); |
masato | 0:c99dda90f834 | 377 | } |
masato | 0:c99dda90f834 | 378 | |
masato | 0:c99dda90f834 | 379 | void sharp_mlcd::setmode(int mode) |
masato | 0:c99dda90f834 | 380 | { |
masato | 0:c99dda90f834 | 381 | draw_mode = mode; |
masato | 0:c99dda90f834 | 382 | } |
masato | 0:c99dda90f834 | 383 | |
masato | 0:c99dda90f834 | 384 | void sharp_mlcd::locate(int x, int y) |
masato | 0:c99dda90f834 | 385 | { |
masato | 0:c99dda90f834 | 386 | char_x = x; |
masato | 0:c99dda90f834 | 387 | char_y = y; |
masato | 0:c99dda90f834 | 388 | } |
masato | 0:c99dda90f834 | 389 | |
masato | 0:c99dda90f834 | 390 | |
masato | 0:c99dda90f834 | 391 | |
masato | 0:c99dda90f834 | 392 | int sharp_mlcd::columns() |
masato | 0:c99dda90f834 | 393 | { |
masato | 0:c99dda90f834 | 394 | return width() / font[1]; |
masato | 0:c99dda90f834 | 395 | } |
masato | 0:c99dda90f834 | 396 | |
masato | 0:c99dda90f834 | 397 | |
masato | 0:c99dda90f834 | 398 | |
masato | 0:c99dda90f834 | 399 | int sharp_mlcd::rows() |
masato | 0:c99dda90f834 | 400 | { |
masato | 0:c99dda90f834 | 401 | return height() / font[2]; |
masato | 0:c99dda90f834 | 402 | } |
masato | 0:c99dda90f834 | 403 | |
masato | 0:c99dda90f834 | 404 | |
masato | 0:c99dda90f834 | 405 | |
masato | 0:c99dda90f834 | 406 | int sharp_mlcd::_putc(int value) |
masato | 0:c99dda90f834 | 407 | { |
masato | 0:c99dda90f834 | 408 | if (value == '\n') { // new line |
masato | 0:c99dda90f834 | 409 | char_x = 0; |
masato | 0:c99dda90f834 | 410 | char_y = char_y + font[2]; |
masato | 0:c99dda90f834 | 411 | if (char_y >= height() - font[2]) { |
masato | 0:c99dda90f834 | 412 | char_y = 0; |
masato | 0:c99dda90f834 | 413 | } |
masato | 0:c99dda90f834 | 414 | } else { |
masato | 0:c99dda90f834 | 415 | character(char_x, char_y, value); |
masato | 0:c99dda90f834 | 416 | if(auto_up) copy_to_lcd(); |
masato | 0:c99dda90f834 | 417 | } |
masato | 0:c99dda90f834 | 418 | return value; |
masato | 0:c99dda90f834 | 419 | } |
masato | 0:c99dda90f834 | 420 | |
masato | 0:c99dda90f834 | 421 | void sharp_mlcd::character(int x, int y, int c) |
masato | 0:c99dda90f834 | 422 | { |
masato | 0:c99dda90f834 | 423 | unsigned int hor,vert,offset,bpl,j,i,b; |
masato | 0:c99dda90f834 | 424 | unsigned char* zeichen; |
masato | 0:c99dda90f834 | 425 | unsigned char z,w; |
masato | 0:c99dda90f834 | 426 | |
masato | 0:c99dda90f834 | 427 | if ((c < 31) || (c > 127)) return; // test char range |
masato | 0:c99dda90f834 | 428 | |
masato | 0:c99dda90f834 | 429 | // read font parameter from start of array |
masato | 0:c99dda90f834 | 430 | offset = font[0]; // bytes / char |
masato | 0:c99dda90f834 | 431 | hor = font[1]; // get hor size of font |
masato | 0:c99dda90f834 | 432 | vert = font[2]; // get vert size of font |
masato | 0:c99dda90f834 | 433 | bpl = font[3]; // bytes per line |
masato | 0:c99dda90f834 | 434 | |
masato | 0:c99dda90f834 | 435 | if (char_x + hor > width()) { |
masato | 0:c99dda90f834 | 436 | char_x = 0; |
masato | 0:c99dda90f834 | 437 | char_y = char_y + vert; |
masato | 0:c99dda90f834 | 438 | if (char_y >= height() - font[2]) { |
masato | 0:c99dda90f834 | 439 | char_y = 0; |
masato | 0:c99dda90f834 | 440 | } |
masato | 0:c99dda90f834 | 441 | } |
masato | 0:c99dda90f834 | 442 | |
masato | 0:c99dda90f834 | 443 | zeichen = &font[((c -32) * offset) + 4]; // start of char bitmap |
masato | 0:c99dda90f834 | 444 | w = zeichen[0]; // width of actual char |
masato | 0:c99dda90f834 | 445 | // construct the char into the buffer |
masato | 0:c99dda90f834 | 446 | for (j=0; j<vert; j++) { // vert line |
masato | 0:c99dda90f834 | 447 | for (i=0; i<hor; i++) { // horz line |
masato | 0:c99dda90f834 | 448 | z = zeichen[bpl * i + ((j & 0xF8) >> 3)+1]; |
masato | 0:c99dda90f834 | 449 | b = 1 << (j & 0x07); |
masato | 0:c99dda90f834 | 450 | if (( z & b ) == 0x00) { |
masato | 0:c99dda90f834 | 451 | pixel(x+i,y+j,0); |
masato | 0:c99dda90f834 | 452 | } else { |
masato | 0:c99dda90f834 | 453 | pixel(x+i,y+j,1); |
masato | 0:c99dda90f834 | 454 | } |
masato | 0:c99dda90f834 | 455 | |
masato | 0:c99dda90f834 | 456 | } |
masato | 0:c99dda90f834 | 457 | } |
masato | 0:c99dda90f834 | 458 | |
masato | 0:c99dda90f834 | 459 | char_x += w; |
masato | 0:c99dda90f834 | 460 | } |
masato | 0:c99dda90f834 | 461 | |
masato | 0:c99dda90f834 | 462 | void sharp_mlcd::set_font(unsigned char* f) |
masato | 0:c99dda90f834 | 463 | { |
masato | 0:c99dda90f834 | 464 | font = f; |
masato | 0:c99dda90f834 | 465 | } |
masato | 0:c99dda90f834 | 466 | |
masato | 0:c99dda90f834 | 467 | void sharp_mlcd::set_auto_up(unsigned int up) |
masato | 0:c99dda90f834 | 468 | { |
masato | 0:c99dda90f834 | 469 | if(up ) auto_up = 1; |
masato | 0:c99dda90f834 | 470 | else auto_up = 0; |
masato | 0:c99dda90f834 | 471 | } |
masato | 0:c99dda90f834 | 472 | |
masato | 0:c99dda90f834 | 473 | unsigned int sharp_mlcd::get_auto_up(void) |
masato | 0:c99dda90f834 | 474 | { |
masato | 0:c99dda90f834 | 475 | return (auto_up); |
masato | 0:c99dda90f834 | 476 | } |
masato | 0:c99dda90f834 | 477 | |
masato | 0:c99dda90f834 | 478 | void sharp_mlcd::print_bm(Bitmap bm, int x, int y) |
masato | 0:c99dda90f834 | 479 | { |
masato | 0:c99dda90f834 | 480 | int h,v,b; |
masato | 0:c99dda90f834 | 481 | char d; |
masato | 0:c99dda90f834 | 482 | |
masato | 0:c99dda90f834 | 483 | for(v=0; v < bm.ySize; v++) { // lines |
masato | 0:c99dda90f834 | 484 | for(h=0; h < bm.xSize; h++) { // pixel |
masato | 0:c99dda90f834 | 485 | if(h + x > WIDTH-1) break; |
masato | 0:c99dda90f834 | 486 | if(v + y > HEIGHT-1) break; |
masato | 0:c99dda90f834 | 487 | d = bm.data[bm.Byte_in_Line * v + ((h & 0xF8) >> 3)]; |
masato | 0:c99dda90f834 | 488 | b = 0x80 >> (h & 0x07); |
masato | 0:c99dda90f834 | 489 | if((d & b) == 0) { |
masato | 0:c99dda90f834 | 490 | pixel(x+h,y+v,0); |
masato | 0:c99dda90f834 | 491 | } else { |
masato | 0:c99dda90f834 | 492 | pixel(x+h,y+v,1); |
masato | 0:c99dda90f834 | 493 | } |
masato | 0:c99dda90f834 | 494 | } |
masato | 0:c99dda90f834 | 495 | } |
masato | 0:c99dda90f834 | 496 | } |
masato | 0:c99dda90f834 | 497 |