Contains example code to connect the mbed LPC1768 or FRDM-K64F devices to the IBM Internet of Things Cloud service via ethernet.

Dependencies:   C12832 MQTT LM75B MMA7660

Dependents:   MFT_IoT_demo_USB400 IBM_RFID

Committer:
samdanbury
Date:
Wed Aug 20 12:45:14 2014 +0000
Revision:
6:37b6d0d56190
Code completely changed to improve the structure, flow and memory usage of the application

Who changed what in which revision?

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