Librarie pour ecran 128x32 de MyLab

Dependents:   MyLab_Lib

Committer:
lucas_favre
Date:
Tue Mar 29 18:26:15 2016 +0000
Revision:
11:c00a727f140f
Child:
12:00bbd42614c7
Modification de la librairie C12832_lcd pour l'utilisation de l'?cran 128x32 pr?sent sur la carte MyLab

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lucas_favre 11:c00a727f140f 1 /* mbed library for MyLab 128*32 pixel LCD
lucas_favre 11:c00a727f140f 2 */
lucas_favre 11:c00a727f140f 3
lucas_favre 11:c00a727f140f 4 // optional defines :
lucas_favre 11:c00a727f140f 5 // #define debug_lcd 1
lucas_favre 11:c00a727f140f 6
lucas_favre 11:c00a727f140f 7 #include "C12832.h"
lucas_favre 11:c00a727f140f 8 #include "mbed.h"
lucas_favre 11:c00a727f140f 9 #include "stdio.h"
lucas_favre 11:c00a727f140f 10 #include "Small_7.h"
lucas_favre 11:c00a727f140f 11 #include "Arial_9.h"
lucas_favre 11:c00a727f140f 12
lucas_favre 11:c00a727f140f 13 #define BPP 1 // Bits per pixel
lucas_favre 11:c00a727f140f 14
lucas_favre 11:c00a727f140f 15
lucas_favre 11:c00a727f140f 16 C12832::C12832(PinName rs, PinName e,PinName rw, PinName a0,PinName cs,PinName d0, PinName d1,
lucas_favre 11:c00a727f140f 17 PinName d2, PinName d3,PinName d4,PinName d5,PinName d6,PinName d7,const char* name) : GraphicsDisplay(name),_rs(rs), _e(e), _a0(a0),_cs(cs),_rw(rw),
lucas_favre 11:c00a727f140f 18 _d(d0, d1, d2, d3,d4,d5,d6,d7) {
lucas_favre 11:c00a727f140f 19
lucas_favre 11:c00a727f140f 20 _cs = 1;
lucas_favre 11:c00a727f140f 21 RESET();
lucas_favre 11:c00a727f140f 22 Delay(1000);
lucas_favre 11:c00a727f140f 23 CLEAR_ADC(); //Normal disrect (SEG0-SEG128)
lucas_favre 11:c00a727f140f 24 SET_SHL(); // SHL 1,COM33-COM0
lucas_favre 11:c00a727f140f 25 SET_BIAS(); // 1/7 BIAS
lucas_favre 11:c00a727f140f 26 Power_Control(0x07); //Booster circuit: ON Voltage regulator circuit: ON Voltage follower circuit: ON
lucas_favre 11:c00a727f140f 27 Regulor_Resistor_Select(0x05); //V0 voltage regulator internal resistance ratio register value and (1 + Rb/Ra) ratio (Reference value) 5.5
lucas_favre 11:c00a727f140f 28 Set_Contrast_Control_Register(19);
lucas_favre 11:c00a727f140f 29 Initial_Dispay_Line(0x00); //Dispay Line 0
lucas_favre 11:c00a727f140f 30 wr_cmd(0xF8); //select booster ratio
lucas_favre 11:c00a727f140f 31 wr_cmd(0x00); //4X
lucas_favre 11:c00a727f140f 32 DISPLAY_ON();
lucas_favre 11:c00a727f140f 33 // clear and update LCD
lucas_favre 11:c00a727f140f 34 memset(buffer,0x00,512); // clear display buffer
lucas_favre 11:c00a727f140f 35 copy_to_lcd();
lucas_favre 11:c00a727f140f 36 auto_up = 1; // switch on auto update
lucas_favre 11:c00a727f140f 37 // dont do this by default. Make the user call
lucas_favre 11:c00a727f140f 38 claim(stdout); // redirekt printf to lcd
lucas_favre 11:c00a727f140f 39 locate(0,0);
lucas_favre 11:c00a727f140f 40 set_font((unsigned char*)Small_7); // standart font
lucas_favre 11:c00a727f140f 41
lucas_favre 11:c00a727f140f 42
lucas_favre 11:c00a727f140f 43
lucas_favre 11:c00a727f140f 44 }
lucas_favre 11:c00a727f140f 45
lucas_favre 11:c00a727f140f 46 void C12832::Delay(uint32_t n)
lucas_favre 11:c00a727f140f 47 {
lucas_favre 11:c00a727f140f 48 uint32_t a;
lucas_favre 11:c00a727f140f 49 for (a = 0; a < n; a++);
lucas_favre 11:c00a727f140f 50 }
lucas_favre 11:c00a727f140f 51 //Specify DDRAM line for COM0 0~63
lucas_favre 11:c00a727f140f 52 void C12832::Initial_Dispay_Line(unsigned char line)
lucas_favre 11:c00a727f140f 53 {
lucas_favre 11:c00a727f140f 54 line|=0x40;
lucas_favre 11:c00a727f140f 55 wr_cmd(line);
lucas_favre 11:c00a727f140f 56 return;
lucas_favre 11:c00a727f140f 57 }
lucas_favre 11:c00a727f140f 58
lucas_favre 11:c00a727f140f 59 void C12832::Power_Control(unsigned char vol)
lucas_favre 11:c00a727f140f 60 {
lucas_favre 11:c00a727f140f 61 wr_cmd((0x28|vol));
lucas_favre 11:c00a727f140f 62 return;
lucas_favre 11:c00a727f140f 63 }
lucas_favre 11:c00a727f140f 64
lucas_favre 11:c00a727f140f 65 /* Regulor resistor select
lucas_favre 11:c00a727f140f 66 ** 1+Rb/Ra Vo=(1+Rb/Ra)Vev Vev=(1-(63-a)/162)Vref 2.1v
lucas_favre 11:c00a727f140f 67 ** 0 3.0 4 5.0(default)
lucas_favre 11:c00a727f140f 68 ** 1 3.5 5 5.5
lucas_favre 11:c00a727f140f 69 ** 2 4 6 6
lucas_favre 11:c00a727f140f 70 ** 3 4.5 7 6.4
lucas_favre 11:c00a727f140f 71 */
lucas_favre 11:c00a727f140f 72 void C12832::Regulor_Resistor_Select(unsigned char r)
lucas_favre 11:c00a727f140f 73 {
lucas_favre 11:c00a727f140f 74 wr_cmd((0x20|r));
lucas_favre 11:c00a727f140f 75 return;
lucas_favre 11:c00a727f140f 76 }
lucas_favre 11:c00a727f140f 77
lucas_favre 11:c00a727f140f 78 //a(0-63) 32default Vev=(1-(63-a)/162)Vref 2.1v
lucas_favre 11:c00a727f140f 79 void C12832::Set_Contrast_Control_Register(unsigned char mod)
lucas_favre 11:c00a727f140f 80 {
lucas_favre 11:c00a727f140f 81 wr_cmd(0x81);
lucas_favre 11:c00a727f140f 82 wr_cmd(mod);
lucas_favre 11:c00a727f140f 83 return;
lucas_favre 11:c00a727f140f 84 }
lucas_favre 11:c00a727f140f 85
lucas_favre 11:c00a727f140f 86 int C12832::width()
lucas_favre 11:c00a727f140f 87 {
lucas_favre 11:c00a727f140f 88 return 128;
lucas_favre 11:c00a727f140f 89 }
lucas_favre 11:c00a727f140f 90
lucas_favre 11:c00a727f140f 91 int C12832::height()
lucas_favre 11:c00a727f140f 92 {
lucas_favre 11:c00a727f140f 93 return 32;
lucas_favre 11:c00a727f140f 94 }
lucas_favre 11:c00a727f140f 95
lucas_favre 11:c00a727f140f 96
lucas_favre 11:c00a727f140f 97 void C12832::invert(unsigned int o)
lucas_favre 11:c00a727f140f 98 {
lucas_favre 11:c00a727f140f 99 if(o == 0) wr_cmd(0xA6);
lucas_favre 11:c00a727f140f 100 else wr_cmd(0xA7);
lucas_favre 11:c00a727f140f 101 }
lucas_favre 11:c00a727f140f 102
lucas_favre 11:c00a727f140f 103
lucas_favre 11:c00a727f140f 104 void C12832::set_contrast(unsigned int o)
lucas_favre 11:c00a727f140f 105 {
lucas_favre 11:c00a727f140f 106 contrast = o;
lucas_favre 11:c00a727f140f 107 wr_cmd(0x81); // set volume
lucas_favre 11:c00a727f140f 108 wr_cmd(o & 0x3F);
lucas_favre 11:c00a727f140f 109 }
lucas_favre 11:c00a727f140f 110
lucas_favre 11:c00a727f140f 111 unsigned int C12832::get_contrast(void)
lucas_favre 11:c00a727f140f 112 {
lucas_favre 11:c00a727f140f 113 return(contrast);
lucas_favre 11:c00a727f140f 114 }
lucas_favre 11:c00a727f140f 115
lucas_favre 11:c00a727f140f 116
lucas_favre 11:c00a727f140f 117 // write command to lcd controller
lucas_favre 11:c00a727f140f 118
lucas_favre 11:c00a727f140f 119 void C12832::wr_cmd(unsigned char cmd)
lucas_favre 11:c00a727f140f 120 {
lucas_favre 11:c00a727f140f 121 _cs =0;
lucas_favre 11:c00a727f140f 122 _a0 = 0;
lucas_favre 11:c00a727f140f 123 _rw = 0;
lucas_favre 11:c00a727f140f 124 _d = cmd;
lucas_favre 11:c00a727f140f 125 LPC_GPIO2->FIODIR |= 0xFF;
lucas_favre 11:c00a727f140f 126 _e = 1;
lucas_favre 11:c00a727f140f 127 asm("nop");
lucas_favre 11:c00a727f140f 128 _e = 0;
lucas_favre 11:c00a727f140f 129 LPC_GPIO2->FIODIR &= ~0xFF;
lucas_favre 11:c00a727f140f 130 _rw=1;
lucas_favre 11:c00a727f140f 131 _cs=1;
lucas_favre 11:c00a727f140f 132 }
lucas_favre 11:c00a727f140f 133
lucas_favre 11:c00a727f140f 134 // write data to lcd controller
lucas_favre 11:c00a727f140f 135
lucas_favre 11:c00a727f140f 136 void C12832::wr_dat(unsigned char dat)
lucas_favre 11:c00a727f140f 137 {
lucas_favre 11:c00a727f140f 138 _cs = 0;
lucas_favre 11:c00a727f140f 139 _a0 = 1;
lucas_favre 11:c00a727f140f 140 _rw = 0;
lucas_favre 11:c00a727f140f 141 _d = dat;
lucas_favre 11:c00a727f140f 142 LPC_GPIO2->FIODIR |= 0xFF;
lucas_favre 11:c00a727f140f 143 _e = 1;
lucas_favre 11:c00a727f140f 144 asm("nop");
lucas_favre 11:c00a727f140f 145 _e = 0;
lucas_favre 11:c00a727f140f 146 LPC_GPIO2->FIODIR &= ~0xFF;
lucas_favre 11:c00a727f140f 147 _rw=1;
lucas_favre 11:c00a727f140f 148 _cs=1;
lucas_favre 11:c00a727f140f 149 }
lucas_favre 11:c00a727f140f 150
lucas_favre 11:c00a727f140f 151 // set one pixel in buffer
lucas_favre 11:c00a727f140f 152
lucas_favre 11:c00a727f140f 153 void C12832::pixel(int x, int y, int color)
lucas_favre 11:c00a727f140f 154 {
lucas_favre 11:c00a727f140f 155 // first check parameter
lucas_favre 11:c00a727f140f 156 if(x > 128 || y > 32 || x < 0 || y < 0) return;
lucas_favre 11:c00a727f140f 157
lucas_favre 11:c00a727f140f 158 if(draw_mode == NORMAL) {
lucas_favre 11:c00a727f140f 159 if(color == 0)
lucas_favre 11:c00a727f140f 160 buffer[x + ((y/8) * 128)] &= ~(1 << (y%8)); // erase pixel
lucas_favre 11:c00a727f140f 161 else
lucas_favre 11:c00a727f140f 162 buffer[x + ((y/8) * 128)] |= (1 << (y%8)); // set pixel
lucas_favre 11:c00a727f140f 163 } else { // XOR mode
lucas_favre 11:c00a727f140f 164 if(color == 1)
lucas_favre 11:c00a727f140f 165 buffer[x + ((y/8) * 128)] ^= (1 << (y%8)); // xor pixel
lucas_favre 11:c00a727f140f 166 }
lucas_favre 11:c00a727f140f 167 }
lucas_favre 11:c00a727f140f 168
lucas_favre 11:c00a727f140f 169 // update lcd
lucas_favre 11:c00a727f140f 170
lucas_favre 11:c00a727f140f 171 void C12832::copy_to_lcd(void)
lucas_favre 11:c00a727f140f 172 {
lucas_favre 11:c00a727f140f 173
lucas_favre 11:c00a727f140f 174 int i=0;
lucas_favre 11:c00a727f140f 175
lucas_favre 11:c00a727f140f 176 //page 0
lucas_favre 11:c00a727f140f 177 wr_cmd(0x00); // set column low nibble 0
lucas_favre 11:c00a727f140f 178 wr_cmd(0x10); // set column hi nibble 0
lucas_favre 11:c00a727f140f 179 wr_cmd(0xB0); // set page address 0
lucas_favre 11:c00a727f140f 180 _a0 = 1;
lucas_favre 11:c00a727f140f 181 for(i=0; i<128; i++) {
lucas_favre 11:c00a727f140f 182 wr_dat(buffer[i]);
lucas_favre 11:c00a727f140f 183 }
lucas_favre 11:c00a727f140f 184
lucas_favre 11:c00a727f140f 185 // page 1
lucas_favre 11:c00a727f140f 186 wr_cmd(0x00); // set column low nibble 0
lucas_favre 11:c00a727f140f 187 wr_cmd(0x10); // set column hi nibble 0
lucas_favre 11:c00a727f140f 188 wr_cmd(0xB1); // set page address 1
lucas_favre 11:c00a727f140f 189 _a0 = 1;
lucas_favre 11:c00a727f140f 190 for(i=128; i<256; i++) {
lucas_favre 11:c00a727f140f 191 wr_dat(buffer[i]);
lucas_favre 11:c00a727f140f 192 }
lucas_favre 11:c00a727f140f 193
lucas_favre 11:c00a727f140f 194 //page 2
lucas_favre 11:c00a727f140f 195 wr_cmd(0x00); // set column low nibble 0
lucas_favre 11:c00a727f140f 196 wr_cmd(0x10); // set column hi nibble 0
lucas_favre 11:c00a727f140f 197 wr_cmd(0xB2); // set page address 2
lucas_favre 11:c00a727f140f 198 _a0 = 1;
lucas_favre 11:c00a727f140f 199 for(i=256; i<384; i++) {
lucas_favre 11:c00a727f140f 200 wr_dat(buffer[i]);
lucas_favre 11:c00a727f140f 201 }
lucas_favre 11:c00a727f140f 202
lucas_favre 11:c00a727f140f 203 //page 3
lucas_favre 11:c00a727f140f 204 wr_cmd(0x00); // set column low nibble 0
lucas_favre 11:c00a727f140f 205 wr_cmd(0x10); // set column hi nibble 0
lucas_favre 11:c00a727f140f 206 wr_cmd(0xB3); // set page address 3
lucas_favre 11:c00a727f140f 207 _a0 = 1;
lucas_favre 11:c00a727f140f 208
lucas_favre 11:c00a727f140f 209 _cs = 0;
lucas_favre 11:c00a727f140f 210
lucas_favre 11:c00a727f140f 211 for(i=384; i<512; i++) {
lucas_favre 11:c00a727f140f 212 wr_dat(buffer[i]);
lucas_favre 11:c00a727f140f 213 }
lucas_favre 11:c00a727f140f 214
lucas_favre 11:c00a727f140f 215 }
lucas_favre 11:c00a727f140f 216
lucas_favre 11:c00a727f140f 217 void C12832::cls(void)
lucas_favre 11:c00a727f140f 218 {
lucas_favre 11:c00a727f140f 219 memset(buffer,0x00,512); // clear display buffer
lucas_favre 11:c00a727f140f 220 copy_to_lcd();
lucas_favre 11:c00a727f140f 221 }
lucas_favre 11:c00a727f140f 222
lucas_favre 11:c00a727f140f 223
lucas_favre 11:c00a727f140f 224 void C12832::line(int x0, int y0, int x1, int y1, int color)
lucas_favre 11:c00a727f140f 225 {
lucas_favre 11:c00a727f140f 226 int dx = 0, dy = 0;
lucas_favre 11:c00a727f140f 227 int dx_sym = 0, dy_sym = 0;
lucas_favre 11:c00a727f140f 228 int dx_x2 = 0, dy_x2 = 0;
lucas_favre 11:c00a727f140f 229 int di = 0;
lucas_favre 11:c00a727f140f 230
lucas_favre 11:c00a727f140f 231 dx = x1-x0;
lucas_favre 11:c00a727f140f 232 dy = y1-y0;
lucas_favre 11:c00a727f140f 233
lucas_favre 11:c00a727f140f 234 // if (dx == 0) { /* vertical line */
lucas_favre 11:c00a727f140f 235 // if (y1 > y0) vline(x0,y0,y1,color);
lucas_favre 11:c00a727f140f 236 // else vline(x0,y1,y0,color);
lucas_favre 11:c00a727f140f 237 // return;
lucas_favre 11:c00a727f140f 238 // }
lucas_favre 11:c00a727f140f 239
lucas_favre 11:c00a727f140f 240 if (dx > 0) {
lucas_favre 11:c00a727f140f 241 dx_sym = 1;
lucas_favre 11:c00a727f140f 242 } else {
lucas_favre 11:c00a727f140f 243 dx_sym = -1;
lucas_favre 11:c00a727f140f 244 }
lucas_favre 11:c00a727f140f 245 // if (dy == 0) { /* horizontal line */
lucas_favre 11:c00a727f140f 246 // if (x1 > x0) hline(x0,x1,y0,color);
lucas_favre 11:c00a727f140f 247 // else hline(x1,x0,y0,color);
lucas_favre 11:c00a727f140f 248 // return;
lucas_favre 11:c00a727f140f 249 // }
lucas_favre 11:c00a727f140f 250
lucas_favre 11:c00a727f140f 251 if (dy > 0) {
lucas_favre 11:c00a727f140f 252 dy_sym = 1;
lucas_favre 11:c00a727f140f 253 } else {
lucas_favre 11:c00a727f140f 254 dy_sym = -1;
lucas_favre 11:c00a727f140f 255 }
lucas_favre 11:c00a727f140f 256
lucas_favre 11:c00a727f140f 257 dx = dx_sym*dx;
lucas_favre 11:c00a727f140f 258 dy = dy_sym*dy;
lucas_favre 11:c00a727f140f 259
lucas_favre 11:c00a727f140f 260 dx_x2 = dx*2;
lucas_favre 11:c00a727f140f 261 dy_x2 = dy*2;
lucas_favre 11:c00a727f140f 262
lucas_favre 11:c00a727f140f 263 if (dx >= dy) {
lucas_favre 11:c00a727f140f 264 di = dy_x2 - dx;
lucas_favre 11:c00a727f140f 265 while (x0 != x1) {
lucas_favre 11:c00a727f140f 266
lucas_favre 11:c00a727f140f 267 pixel(x0, y0, color);
lucas_favre 11:c00a727f140f 268 x0 += dx_sym;
lucas_favre 11:c00a727f140f 269 if (di<0) {
lucas_favre 11:c00a727f140f 270 di += dy_x2;
lucas_favre 11:c00a727f140f 271 } else {
lucas_favre 11:c00a727f140f 272 di += dy_x2 - dx_x2;
lucas_favre 11:c00a727f140f 273 y0 += dy_sym;
lucas_favre 11:c00a727f140f 274 }
lucas_favre 11:c00a727f140f 275 }
lucas_favre 11:c00a727f140f 276 pixel(x0, y0, color);
lucas_favre 11:c00a727f140f 277 } else {
lucas_favre 11:c00a727f140f 278 di = dx_x2 - dy;
lucas_favre 11:c00a727f140f 279 while (y0 != y1) {
lucas_favre 11:c00a727f140f 280 pixel(x0, y0, color);
lucas_favre 11:c00a727f140f 281 y0 += dy_sym;
lucas_favre 11:c00a727f140f 282 if (di < 0) {
lucas_favre 11:c00a727f140f 283 di += dx_x2;
lucas_favre 11:c00a727f140f 284 } else {
lucas_favre 11:c00a727f140f 285 di += dx_x2 - dy_x2;
lucas_favre 11:c00a727f140f 286 x0 += dx_sym;
lucas_favre 11:c00a727f140f 287 }
lucas_favre 11:c00a727f140f 288 }
lucas_favre 11:c00a727f140f 289 pixel(x0, y0, color);
lucas_favre 11:c00a727f140f 290 }
lucas_favre 11:c00a727f140f 291 if(auto_up) copy_to_lcd();
lucas_favre 11:c00a727f140f 292 }
lucas_favre 11:c00a727f140f 293
lucas_favre 11:c00a727f140f 294 void C12832::rect(int x0, int y0, int x1, int y1, int color)
lucas_favre 11:c00a727f140f 295 {
lucas_favre 11:c00a727f140f 296
lucas_favre 11:c00a727f140f 297 if (x1 > x0) line(x0,y0,x1,y0,color);
lucas_favre 11:c00a727f140f 298 else line(x1,y0,x0,y0,color);
lucas_favre 11:c00a727f140f 299
lucas_favre 11:c00a727f140f 300 if (y1 > y0) line(x0,y0,x0,y1,color);
lucas_favre 11:c00a727f140f 301 else line(x0,y1,x0,y0,color);
lucas_favre 11:c00a727f140f 302
lucas_favre 11:c00a727f140f 303 if (x1 > x0) line(x0,y1,x1,y1,color);
lucas_favre 11:c00a727f140f 304 else line(x1,y1,x0,y1,color);
lucas_favre 11:c00a727f140f 305
lucas_favre 11:c00a727f140f 306 if (y1 > y0) line(x1,y0,x1,y1,color);
lucas_favre 11:c00a727f140f 307 else line(x1,y1,x1,y0,color);
lucas_favre 11:c00a727f140f 308
lucas_favre 11:c00a727f140f 309 if(auto_up) copy_to_lcd();
lucas_favre 11:c00a727f140f 310 }
lucas_favre 11:c00a727f140f 311
lucas_favre 11:c00a727f140f 312 void C12832::fillrect(int x0, int y0, int x1, int y1, int color)
lucas_favre 11:c00a727f140f 313 {
lucas_favre 11:c00a727f140f 314 int l,c,i;
lucas_favre 11:c00a727f140f 315 if(x0 > x1) {
lucas_favre 11:c00a727f140f 316 i = x0;
lucas_favre 11:c00a727f140f 317 x0 = x1;
lucas_favre 11:c00a727f140f 318 x1 = i;
lucas_favre 11:c00a727f140f 319 }
lucas_favre 11:c00a727f140f 320
lucas_favre 11:c00a727f140f 321 if(y0 > y1) {
lucas_favre 11:c00a727f140f 322 i = y0;
lucas_favre 11:c00a727f140f 323 y0 = y1;
lucas_favre 11:c00a727f140f 324 y1 = i;
lucas_favre 11:c00a727f140f 325 }
lucas_favre 11:c00a727f140f 326
lucas_favre 11:c00a727f140f 327 for(l = x0; l<= x1; l ++) {
lucas_favre 11:c00a727f140f 328 for(c = y0; c<= y1; c++) {
lucas_favre 11:c00a727f140f 329 pixel(l,c,color);
lucas_favre 11:c00a727f140f 330 }
lucas_favre 11:c00a727f140f 331 }
lucas_favre 11:c00a727f140f 332 if(auto_up) copy_to_lcd();
lucas_favre 11:c00a727f140f 333 }
lucas_favre 11:c00a727f140f 334
lucas_favre 11:c00a727f140f 335
lucas_favre 11:c00a727f140f 336
lucas_favre 11:c00a727f140f 337 void C12832::circle(int x0, int y0, int r, int color)
lucas_favre 11:c00a727f140f 338 {
lucas_favre 11:c00a727f140f 339
lucas_favre 11:c00a727f140f 340 int draw_x0, draw_y0;
lucas_favre 11:c00a727f140f 341 int draw_x1, draw_y1;
lucas_favre 11:c00a727f140f 342 int draw_x2, draw_y2;
lucas_favre 11:c00a727f140f 343 int draw_x3, draw_y3;
lucas_favre 11:c00a727f140f 344 int draw_x4, draw_y4;
lucas_favre 11:c00a727f140f 345 int draw_x5, draw_y5;
lucas_favre 11:c00a727f140f 346 int draw_x6, draw_y6;
lucas_favre 11:c00a727f140f 347 int draw_x7, draw_y7;
lucas_favre 11:c00a727f140f 348 int xx, yy;
lucas_favre 11:c00a727f140f 349 int di;
lucas_favre 11:c00a727f140f 350 //WindowMax();
lucas_favre 11:c00a727f140f 351 if (r == 0) { /* no radius */
lucas_favre 11:c00a727f140f 352 return;
lucas_favre 11:c00a727f140f 353 }
lucas_favre 11:c00a727f140f 354
lucas_favre 11:c00a727f140f 355 draw_x0 = draw_x1 = x0;
lucas_favre 11:c00a727f140f 356 draw_y0 = draw_y1 = y0 + r;
lucas_favre 11:c00a727f140f 357 if (draw_y0 < height()) {
lucas_favre 11:c00a727f140f 358 pixel(draw_x0, draw_y0, color); /* 90 degree */
lucas_favre 11:c00a727f140f 359 }
lucas_favre 11:c00a727f140f 360
lucas_favre 11:c00a727f140f 361 draw_x2 = draw_x3 = x0;
lucas_favre 11:c00a727f140f 362 draw_y2 = draw_y3 = y0 - r;
lucas_favre 11:c00a727f140f 363 if (draw_y2 >= 0) {
lucas_favre 11:c00a727f140f 364 pixel(draw_x2, draw_y2, color); /* 270 degree */
lucas_favre 11:c00a727f140f 365 }
lucas_favre 11:c00a727f140f 366
lucas_favre 11:c00a727f140f 367 draw_x4 = draw_x6 = x0 + r;
lucas_favre 11:c00a727f140f 368 draw_y4 = draw_y6 = y0;
lucas_favre 11:c00a727f140f 369 if (draw_x4 < width()) {
lucas_favre 11:c00a727f140f 370 pixel(draw_x4, draw_y4, color); /* 0 degree */
lucas_favre 11:c00a727f140f 371 }
lucas_favre 11:c00a727f140f 372
lucas_favre 11:c00a727f140f 373 draw_x5 = draw_x7 = x0 - r;
lucas_favre 11:c00a727f140f 374 draw_y5 = draw_y7 = y0;
lucas_favre 11:c00a727f140f 375 if (draw_x5>=0) {
lucas_favre 11:c00a727f140f 376 pixel(draw_x5, draw_y5, color); /* 180 degree */
lucas_favre 11:c00a727f140f 377 }
lucas_favre 11:c00a727f140f 378
lucas_favre 11:c00a727f140f 379 if (r == 1) {
lucas_favre 11:c00a727f140f 380 return;
lucas_favre 11:c00a727f140f 381 }
lucas_favre 11:c00a727f140f 382
lucas_favre 11:c00a727f140f 383 di = 3 - 2*r;
lucas_favre 11:c00a727f140f 384 xx = 0;
lucas_favre 11:c00a727f140f 385 yy = r;
lucas_favre 11:c00a727f140f 386 while (xx < yy) {
lucas_favre 11:c00a727f140f 387
lucas_favre 11:c00a727f140f 388 if (di < 0) {
lucas_favre 11:c00a727f140f 389 di += 4*xx + 6;
lucas_favre 11:c00a727f140f 390 } else {
lucas_favre 11:c00a727f140f 391 di += 4*(xx - yy) + 10;
lucas_favre 11:c00a727f140f 392 yy--;
lucas_favre 11:c00a727f140f 393 draw_y0--;
lucas_favre 11:c00a727f140f 394 draw_y1--;
lucas_favre 11:c00a727f140f 395 draw_y2++;
lucas_favre 11:c00a727f140f 396 draw_y3++;
lucas_favre 11:c00a727f140f 397 draw_x4--;
lucas_favre 11:c00a727f140f 398 draw_x5++;
lucas_favre 11:c00a727f140f 399 draw_x6--;
lucas_favre 11:c00a727f140f 400 draw_x7++;
lucas_favre 11:c00a727f140f 401 }
lucas_favre 11:c00a727f140f 402 xx++;
lucas_favre 11:c00a727f140f 403 draw_x0++;
lucas_favre 11:c00a727f140f 404 draw_x1--;
lucas_favre 11:c00a727f140f 405 draw_x2++;
lucas_favre 11:c00a727f140f 406 draw_x3--;
lucas_favre 11:c00a727f140f 407 draw_y4++;
lucas_favre 11:c00a727f140f 408 draw_y5++;
lucas_favre 11:c00a727f140f 409 draw_y6--;
lucas_favre 11:c00a727f140f 410 draw_y7--;
lucas_favre 11:c00a727f140f 411
lucas_favre 11:c00a727f140f 412 if ( (draw_x0 <= width()) && (draw_y0>=0) ) {
lucas_favre 11:c00a727f140f 413 pixel(draw_x0, draw_y0, color);
lucas_favre 11:c00a727f140f 414 }
lucas_favre 11:c00a727f140f 415
lucas_favre 11:c00a727f140f 416 if ( (draw_x1 >= 0) && (draw_y1 >= 0) ) {
lucas_favre 11:c00a727f140f 417 pixel(draw_x1, draw_y1, color);
lucas_favre 11:c00a727f140f 418 }
lucas_favre 11:c00a727f140f 419
lucas_favre 11:c00a727f140f 420 if ( (draw_x2 <= width()) && (draw_y2 <= height()) ) {
lucas_favre 11:c00a727f140f 421 pixel(draw_x2, draw_y2, color);
lucas_favre 11:c00a727f140f 422 }
lucas_favre 11:c00a727f140f 423
lucas_favre 11:c00a727f140f 424 if ( (draw_x3 >=0 ) && (draw_y3 <= height()) ) {
lucas_favre 11:c00a727f140f 425 pixel(draw_x3, draw_y3, color);
lucas_favre 11:c00a727f140f 426 }
lucas_favre 11:c00a727f140f 427
lucas_favre 11:c00a727f140f 428 if ( (draw_x4 <= width()) && (draw_y4 >= 0) ) {
lucas_favre 11:c00a727f140f 429 pixel(draw_x4, draw_y4, color);
lucas_favre 11:c00a727f140f 430 }
lucas_favre 11:c00a727f140f 431
lucas_favre 11:c00a727f140f 432 if ( (draw_x5 >= 0) && (draw_y5 >= 0) ) {
lucas_favre 11:c00a727f140f 433 pixel(draw_x5, draw_y5, color);
lucas_favre 11:c00a727f140f 434 }
lucas_favre 11:c00a727f140f 435 if ( (draw_x6 <=width()) && (draw_y6 <= height()) ) {
lucas_favre 11:c00a727f140f 436 pixel(draw_x6, draw_y6, color);
lucas_favre 11:c00a727f140f 437 }
lucas_favre 11:c00a727f140f 438 if ( (draw_x7 >= 0) && (draw_y7 <= height()) ) {
lucas_favre 11:c00a727f140f 439 pixel(draw_x7, draw_y7, color);
lucas_favre 11:c00a727f140f 440 }
lucas_favre 11:c00a727f140f 441 }
lucas_favre 11:c00a727f140f 442 if(auto_up) copy_to_lcd();
lucas_favre 11:c00a727f140f 443 }
lucas_favre 11:c00a727f140f 444
lucas_favre 11:c00a727f140f 445 void C12832::fillcircle(int x, int y, int r, int color)
lucas_favre 11:c00a727f140f 446 {
lucas_favre 11:c00a727f140f 447 int i,up;
lucas_favre 11:c00a727f140f 448 up = auto_up;
lucas_favre 11:c00a727f140f 449 auto_up = 0; // off
lucas_favre 11:c00a727f140f 450 for (i = 0; i <= r; i++)
lucas_favre 11:c00a727f140f 451 circle(x,y,i,color);
lucas_favre 11:c00a727f140f 452 auto_up = up;
lucas_favre 11:c00a727f140f 453 if(auto_up) copy_to_lcd();
lucas_favre 11:c00a727f140f 454 }
lucas_favre 11:c00a727f140f 455
lucas_favre 11:c00a727f140f 456 void C12832::setmode(int mode)
lucas_favre 11:c00a727f140f 457 {
lucas_favre 11:c00a727f140f 458 draw_mode = mode;
lucas_favre 11:c00a727f140f 459 }
lucas_favre 11:c00a727f140f 460
lucas_favre 11:c00a727f140f 461 void C12832::locate(int x, int y)
lucas_favre 11:c00a727f140f 462 {
lucas_favre 11:c00a727f140f 463 char_x = x;
lucas_favre 11:c00a727f140f 464 char_y = y;
lucas_favre 11:c00a727f140f 465 }
lucas_favre 11:c00a727f140f 466
lucas_favre 11:c00a727f140f 467
lucas_favre 11:c00a727f140f 468
lucas_favre 11:c00a727f140f 469 int C12832::columns()
lucas_favre 11:c00a727f140f 470 {
lucas_favre 11:c00a727f140f 471 return width() / font[1];
lucas_favre 11:c00a727f140f 472 }
lucas_favre 11:c00a727f140f 473
lucas_favre 11:c00a727f140f 474
lucas_favre 11:c00a727f140f 475
lucas_favre 11:c00a727f140f 476 int C12832::rows()
lucas_favre 11:c00a727f140f 477 {
lucas_favre 11:c00a727f140f 478 return height() / font[2];
lucas_favre 11:c00a727f140f 479 }
lucas_favre 11:c00a727f140f 480
lucas_favre 11:c00a727f140f 481
lucas_favre 11:c00a727f140f 482
lucas_favre 11:c00a727f140f 483 int C12832::_putc(int value)
lucas_favre 11:c00a727f140f 484 {
lucas_favre 11:c00a727f140f 485 if (value == '\n') { // new line
lucas_favre 11:c00a727f140f 486 char_x = 0;
lucas_favre 11:c00a727f140f 487 char_y = char_y + font[2];
lucas_favre 11:c00a727f140f 488 if (char_y >= height() - font[2]) {
lucas_favre 11:c00a727f140f 489 char_y = 0;
lucas_favre 11:c00a727f140f 490 }
lucas_favre 11:c00a727f140f 491 } else {
lucas_favre 11:c00a727f140f 492 character(char_x, char_y, value);
lucas_favre 11:c00a727f140f 493 if(auto_up) copy_to_lcd();
lucas_favre 11:c00a727f140f 494 }
lucas_favre 11:c00a727f140f 495 return value;
lucas_favre 11:c00a727f140f 496 }
lucas_favre 11:c00a727f140f 497
lucas_favre 11:c00a727f140f 498 void C12832::character(int x, int y, int c)
lucas_favre 11:c00a727f140f 499 {
lucas_favre 11:c00a727f140f 500 unsigned int hor,vert,offset,bpl,j,i,b;
lucas_favre 11:c00a727f140f 501 unsigned char* zeichen;
lucas_favre 11:c00a727f140f 502 unsigned char z,w;
lucas_favre 11:c00a727f140f 503
lucas_favre 11:c00a727f140f 504 if ((c < 31) || (c > 127)) return; // test char range
lucas_favre 11:c00a727f140f 505
lucas_favre 11:c00a727f140f 506 // read font parameter from start of array
lucas_favre 11:c00a727f140f 507 offset = font[0]; // bytes / char
lucas_favre 11:c00a727f140f 508 hor = font[1]; // get hor size of font
lucas_favre 11:c00a727f140f 509 vert = font[2]; // get vert size of font
lucas_favre 11:c00a727f140f 510 bpl = font[3]; // bytes per line
lucas_favre 11:c00a727f140f 511
lucas_favre 11:c00a727f140f 512 if (char_x + hor > width()) {
lucas_favre 11:c00a727f140f 513 char_x = 0;
lucas_favre 11:c00a727f140f 514 char_y = char_y + vert;
lucas_favre 11:c00a727f140f 515 if (char_y >= height() - font[2]) {
lucas_favre 11:c00a727f140f 516 char_y = 0;
lucas_favre 11:c00a727f140f 517 }
lucas_favre 11:c00a727f140f 518 }
lucas_favre 11:c00a727f140f 519
lucas_favre 11:c00a727f140f 520 zeichen = &font[((c -32) * offset) + 4]; // start of char bitmap
lucas_favre 11:c00a727f140f 521 w = zeichen[0]; // width of actual char
lucas_favre 11:c00a727f140f 522 // construct the char into the buffer
lucas_favre 11:c00a727f140f 523 for (j=0; j<vert; j++) { // vert line
lucas_favre 11:c00a727f140f 524 for (i=0; i<hor; i++) { // horz line
lucas_favre 11:c00a727f140f 525 z = zeichen[bpl * i + ((j & 0xF8) >> 3)+1];
lucas_favre 11:c00a727f140f 526 b = 1 << (j & 0x07);
lucas_favre 11:c00a727f140f 527 if (( z & b ) == 0x00) {
lucas_favre 11:c00a727f140f 528 pixel(x+i,y+j,0);
lucas_favre 11:c00a727f140f 529 } else {
lucas_favre 11:c00a727f140f 530 pixel(x+i,y+j,1);
lucas_favre 11:c00a727f140f 531 }
lucas_favre 11:c00a727f140f 532
lucas_favre 11:c00a727f140f 533 }
lucas_favre 11:c00a727f140f 534 }
lucas_favre 11:c00a727f140f 535
lucas_favre 11:c00a727f140f 536 char_x += w;
lucas_favre 11:c00a727f140f 537 }
lucas_favre 11:c00a727f140f 538
lucas_favre 11:c00a727f140f 539
lucas_favre 11:c00a727f140f 540 void C12832::set_font(unsigned char* f)
lucas_favre 11:c00a727f140f 541 {
lucas_favre 11:c00a727f140f 542 font = f;
lucas_favre 11:c00a727f140f 543 }
lucas_favre 11:c00a727f140f 544
lucas_favre 11:c00a727f140f 545 void C12832::set_auto_up(unsigned int up)
lucas_favre 11:c00a727f140f 546 {
lucas_favre 11:c00a727f140f 547 if(up ) auto_up = 1;
lucas_favre 11:c00a727f140f 548 else auto_up = 0;
lucas_favre 11:c00a727f140f 549 }
lucas_favre 11:c00a727f140f 550
lucas_favre 11:c00a727f140f 551 unsigned int C12832::get_auto_up(void)
lucas_favre 11:c00a727f140f 552 {
lucas_favre 11:c00a727f140f 553 return (auto_up);
lucas_favre 11:c00a727f140f 554 }
lucas_favre 11:c00a727f140f 555
lucas_favre 11:c00a727f140f 556 void C12832::print_bm(Bitmap bm, int x, int y)
lucas_favre 11:c00a727f140f 557 {
lucas_favre 11:c00a727f140f 558 int h,v,b;
lucas_favre 11:c00a727f140f 559 char d;
lucas_favre 11:c00a727f140f 560
lucas_favre 11:c00a727f140f 561 for(v=0; v < bm.ySize; v++) { // lines
lucas_favre 11:c00a727f140f 562 for(h=0; h < bm.xSize; h++) { // pixel
lucas_favre 11:c00a727f140f 563 if(h + x > 127) break;
lucas_favre 11:c00a727f140f 564 if(v + y > 31) break;
lucas_favre 11:c00a727f140f 565 d = bm.data[bm.Byte_in_Line * v + ((h & 0xF8) >> 3)];
lucas_favre 11:c00a727f140f 566 b = 0x80 >> (h & 0x07);
lucas_favre 11:c00a727f140f 567 if((d & b) == 0) {
lucas_favre 11:c00a727f140f 568 pixel(x+h,y+v,0);
lucas_favre 11:c00a727f140f 569 } else {
lucas_favre 11:c00a727f140f 570 pixel(x+h,y+v,1);
lucas_favre 11:c00a727f140f 571 }
lucas_favre 11:c00a727f140f 572 }
lucas_favre 11:c00a727f140f 573 }
lucas_favre 11:c00a727f140f 574
lucas_favre 11:c00a727f140f 575 }
lucas_favre 11:c00a727f140f 576
lucas_favre 11:c00a727f140f 577
lucas_favre 11:c00a727f140f 578