KS0108 LCD LIB with I2C I/O expander PCF8574 for Databus

Dependencies:   BusEnums

Dependents:   Menu

Committer:
GuiTwo
Date:
Tue Sep 04 14:51:17 2012 +0000
Revision:
2:6a8fbb08d519
Parent:
1:8bc625378e38
Child:
4:eeaa5069be9c
Modification for Menbed menu compatibility;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
GuiTwo 2:6a8fbb08d519 1 #include "KS0108.h"
GuiTwo 0:f2f71eab6aef 2 #include "PCF8574_DataBus.h"
GuiTwo 0:f2f71eab6aef 3
GuiTwo 0:f2f71eab6aef 4 /*KS0108::KS0108 (PinName _RST,PinName _DI, PinName _RW, PinName _E, PinName _CS2, PinName _CS1, PinName DB0, PinName DB1, PinName DB2, PinName DB3, PinName DB4, PinName DB5, PinName DB6, PinName DB7)
GuiTwo 0:f2f71eab6aef 5 : DB(DB0,DB1,DB2,DB3,DB4,DB5,DB6,DB7),RST (_RST),DI(_DI), RW(_RW), E(_E), CS2(_CS2), CS1(_CS1) {*/
GuiTwo 0:f2f71eab6aef 6
GuiTwo 0:f2f71eab6aef 7
GuiTwo 0:f2f71eab6aef 8
GuiTwo 0:f2f71eab6aef 9 KS0108::KS0108 (PinName _RST,PinName _DI, PinName _RW, PinName _E, PinName _CS2, PinName _CS1,PCF8574_DataBus &_DB)
GuiTwo 0:f2f71eab6aef 10 :
GuiTwo 0:f2f71eab6aef 11 RST(_RST),
GuiTwo 2:6a8fbb08d519 12 DI(_DI),
GuiTwo 2:6a8fbb08d519 13 RW(_RW),
GuiTwo 2:6a8fbb08d519 14 E(_E),
GuiTwo 2:6a8fbb08d519 15 CS2(_CS2),
GuiTwo 2:6a8fbb08d519 16 CS1(_CS1),
GuiTwo 0:f2f71eab6aef 17 DB(_DB)
GuiTwo 2:6a8fbb08d519 18 {
GuiTwo 0:f2f71eab6aef 19
GuiTwo 0:f2f71eab6aef 20
GuiTwo 2:6a8fbb08d519 21 RST.mode(OpenDrain);
GuiTwo 2:6a8fbb08d519 22 DI.mode(OpenDrain);
GuiTwo 2:6a8fbb08d519 23 RW.mode(OpenDrain);
GuiTwo 2:6a8fbb08d519 24 E.mode(OpenDrain);
GuiTwo 2:6a8fbb08d519 25 CS2.mode(OpenDrain);
GuiTwo 2:6a8fbb08d519 26 CS1.mode(OpenDrain);
GuiTwo 2:6a8fbb08d519 27
GuiTwo 2:6a8fbb08d519 28 //RST.output();
GuiTwo 2:6a8fbb08d519 29 DI.output();
GuiTwo 2:6a8fbb08d519 30 RW.output();
GuiTwo 2:6a8fbb08d519 31 E.output();
GuiTwo 2:6a8fbb08d519 32 CS2.output();
GuiTwo 0:f2f71eab6aef 33 CS1.output();
GuiTwo 2:6a8fbb08d519 34 DB.output();
GuiTwo 2:6a8fbb08d519 35
GuiTwo 2:6a8fbb08d519 36
GuiTwo 2:6a8fbb08d519 37 CS1.output();
GuiTwo 2:6a8fbb08d519 38 CS2.output();
GuiTwo 0:f2f71eab6aef 39 RST.write(0);
GuiTwo 2:6a8fbb08d519 40 wait_us(10);
GuiTwo 0:f2f71eab6aef 41 RST.write(1); //reset screen
GuiTwo 2:6a8fbb08d519 42 E.write(0);
GuiTwo 1:8bc625378e38 43 ClearScreen(); //clear display
GuiTwo 2:6a8fbb08d519 44 WriteInstruction(LCD_ON, BOTH); //turn on lcd
GuiTwo 2:6a8fbb08d519 45 Inverted = 0;
GuiTwo 0:f2f71eab6aef 46 }
GuiTwo 0:f2f71eab6aef 47
GuiTwo 0:f2f71eab6aef 48
GuiTwo 0:f2f71eab6aef 49
GuiTwo 2:6a8fbb08d519 50 void KS0108::WriteInstruction(unsigned int Command,unsigned int side)
GuiTwo 2:6a8fbb08d519 51 {
GuiTwo 2:6a8fbb08d519 52 E.write(0);
GuiTwo 2:6a8fbb08d519 53 DI.write(0);
GuiTwo 2:6a8fbb08d519 54 RW.write(0);
GuiTwo 2:6a8fbb08d519 55
GuiTwo 2:6a8fbb08d519 56 SelectSide(side); //select controller
GuiTwo 2:6a8fbb08d519 57
GuiTwo 2:6a8fbb08d519 58 wait(0.0000003); //wait 300ns
GuiTwo 2:6a8fbb08d519 59 E.write(1);
GuiTwo 2:6a8fbb08d519 60 DB.output();
GuiTwo 2:6a8fbb08d519 61 DB.write(Command);
GuiTwo 2:6a8fbb08d519 62 wait(0.0000001);
GuiTwo 2:6a8fbb08d519 63 E.write(0);
GuiTwo 2:6a8fbb08d519 64 }
GuiTwo 0:f2f71eab6aef 65
GuiTwo 0:f2f71eab6aef 66
GuiTwo 2:6a8fbb08d519 67 void KS0108::WriteData(unsigned int data,unsigned char side)
GuiTwo 2:6a8fbb08d519 68 {
GuiTwo 2:6a8fbb08d519 69 E.write(0);
GuiTwo 0:f2f71eab6aef 70 DI.write(1);
GuiTwo 0:f2f71eab6aef 71 RW.write(0);
GuiTwo 2:6a8fbb08d519 72
GuiTwo 0:f2f71eab6aef 73 SelectSide(side);
GuiTwo 0:f2f71eab6aef 74
GuiTwo 1:8bc625378e38 75 wait(0.0000003); // 300ns
GuiTwo 0:f2f71eab6aef 76 E.write(1);
GuiTwo 0:f2f71eab6aef 77 DB.output();
GuiTwo 2:6a8fbb08d519 78 DB.write(data);
GuiTwo 1:8bc625378e38 79 wait(0.0000001);
GuiTwo 0:f2f71eab6aef 80 E.write(0);
GuiTwo 0:f2f71eab6aef 81 }
GuiTwo 0:f2f71eab6aef 82
GuiTwo 2:6a8fbb08d519 83 void KS0108::WriteData(unsigned int data)
GuiTwo 2:6a8fbb08d519 84 {
GuiTwo 0:f2f71eab6aef 85 unsigned int displayData, yOffset, chip;
GuiTwo 2:6a8fbb08d519 86
GuiTwo 0:f2f71eab6aef 87 if(Coord.x >= SCREEN_WIDTH)
GuiTwo 0:f2f71eab6aef 88 return;
GuiTwo 2:6a8fbb08d519 89 chip = Coord.x/CHIP_WIDTH;
GuiTwo 2:6a8fbb08d519 90 wait(0.000000450); // 300ns
GuiTwo 0:f2f71eab6aef 91
GuiTwo 2:6a8fbb08d519 92 if(Coord.x % CHIP_WIDTH == 0 && chip > 0) {
GuiTwo 2:6a8fbb08d519 93 GotoXY(Coord.x, Coord.y);
GuiTwo 2:6a8fbb08d519 94 }
GuiTwo 0:f2f71eab6aef 95
GuiTwo 0:f2f71eab6aef 96 DI.write(1); // D/I = 1
GuiTwo 2:6a8fbb08d519 97 RW.write(0); // R/W = 0
GuiTwo 0:f2f71eab6aef 98 DB.output(); // data port is output
GuiTwo 2:6a8fbb08d519 99
GuiTwo 0:f2f71eab6aef 100 yOffset = Coord.y%8;
GuiTwo 0:f2f71eab6aef 101
GuiTwo 0:f2f71eab6aef 102 if(yOffset != 0) { // first page
GuiTwo 0:f2f71eab6aef 103
GuiTwo 2:6a8fbb08d519 104 displayData = ReadData();
GuiTwo 0:f2f71eab6aef 105
GuiTwo 2:6a8fbb08d519 106 DI.write(1); // D/I = 1
GuiTwo 2:6a8fbb08d519 107 RW.write(0); // R/W = 0
GuiTwo 2:6a8fbb08d519 108 SelectSide(chip);
GuiTwo 2:6a8fbb08d519 109 DB.output();
GuiTwo 2:6a8fbb08d519 110 // data port is output
GuiTwo 2:6a8fbb08d519 111 displayData |= data << yOffset;
GuiTwo 2:6a8fbb08d519 112 if(Inverted) displayData = ~displayData;
GuiTwo 2:6a8fbb08d519 113 DB.write(displayData); // write data
GuiTwo 2:6a8fbb08d519 114 wait(0.0000003); // 300ns
GuiTwo 2:6a8fbb08d519 115 E.write(1);
GuiTwo 2:6a8fbb08d519 116 wait(0.0000001);
GuiTwo 2:6a8fbb08d519 117 E.write(0);
GuiTwo 0:f2f71eab6aef 118
GuiTwo 2:6a8fbb08d519 119 // second page
GuiTwo 2:6a8fbb08d519 120 GotoXY(Coord.x, Coord.y+8);
GuiTwo 2:6a8fbb08d519 121
GuiTwo 2:6a8fbb08d519 122 displayData = ReadData();
GuiTwo 0:f2f71eab6aef 123
GuiTwo 2:6a8fbb08d519 124 DI.write(1); // D/I = 1
GuiTwo 2:6a8fbb08d519 125 RW.write(0); // R/W = 0
GuiTwo 2:6a8fbb08d519 126 SelectSide(chip);
GuiTwo 2:6a8fbb08d519 127
GuiTwo 2:6a8fbb08d519 128 DB.output(); // data port is output
GuiTwo 2:6a8fbb08d519 129
GuiTwo 2:6a8fbb08d519 130 displayData |= data >> (8-yOffset);
GuiTwo 2:6a8fbb08d519 131
GuiTwo 0:f2f71eab6aef 132 if(Inverted)
GuiTwo 0:f2f71eab6aef 133 displayData = ~displayData;
GuiTwo 2:6a8fbb08d519 134 DB.write(displayData); // write data
GuiTwo 2:6a8fbb08d519 135
GuiTwo 2:6a8fbb08d519 136 wait(0.0000003); // 300ns
GuiTwo 2:6a8fbb08d519 137 E.write(1);
GuiTwo 2:6a8fbb08d519 138 wait(0.0000001);
GuiTwo 2:6a8fbb08d519 139 E.write(0);
GuiTwo 2:6a8fbb08d519 140
GuiTwo 0:f2f71eab6aef 141 GotoXY(Coord.x+1, Coord.y-8);
GuiTwo 2:6a8fbb08d519 142 } else {
GuiTwo 0:f2f71eab6aef 143
GuiTwo 0:f2f71eab6aef 144 // just this code gets executed if the write is on a single page
GuiTwo 0:f2f71eab6aef 145 if(Inverted)
GuiTwo 2:6a8fbb08d519 146 data = ~data;
GuiTwo 1:8bc625378e38 147 wait(0.0000003); // 300nsEN_DELAY();
GuiTwo 0:f2f71eab6aef 148 DB.write(data); // write data
GuiTwo 1:8bc625378e38 149 wait(0.0000003); // 300ns
GuiTwo 2:6a8fbb08d519 150 E = 1;
GuiTwo 2:6a8fbb08d519 151 wait(0.0000001);
GuiTwo 0:f2f71eab6aef 152 E = 0;
GuiTwo 2:6a8fbb08d519 153 Coord.x++;
GuiTwo 0:f2f71eab6aef 154 }
GuiTwo 0:f2f71eab6aef 155 }
GuiTwo 0:f2f71eab6aef 156
GuiTwo 0:f2f71eab6aef 157
GuiTwo 2:6a8fbb08d519 158 void KS0108::WriteDataColPag(unsigned int page, unsigned int col, unsigned int data)
GuiTwo 2:6a8fbb08d519 159 {
GuiTwo 2:6a8fbb08d519 160
GuiTwo 2:6a8fbb08d519 161 SelectSide(NONE);
GuiTwo 0:f2f71eab6aef 162 col = col%SCREEN_WIDTH;
GuiTwo 0:f2f71eab6aef 163 page = page%8;
GuiTwo 0:f2f71eab6aef 164
GuiTwo 2:6a8fbb08d519 165 if(col<(SCREEN_WIDTH/2)) {
GuiTwo 2:6a8fbb08d519 166 SelectSide(LEFT);
GuiTwo 2:6a8fbb08d519 167 WriteInstruction(LCD_SET_PAGE|page,LEFT);
GuiTwo 2:6a8fbb08d519 168 WriteInstruction(LCD_SET_ADD|col,LEFT); //set page and column position
GuiTwo 2:6a8fbb08d519 169 WriteData(data,LEFT); //output data to D0-D7
GuiTwo 2:6a8fbb08d519 170 } else {
GuiTwo 2:6a8fbb08d519 171
GuiTwo 2:6a8fbb08d519 172 SelectSide(RIGHT);
GuiTwo 2:6a8fbb08d519 173 col -= (SCREEN_WIDTH/2);
GuiTwo 2:6a8fbb08d519 174 WriteInstruction(LCD_SET_PAGE|page,RIGHT);
GuiTwo 2:6a8fbb08d519 175 WriteInstruction(LCD_SET_ADD|col,RIGHT); //set page and column position
GuiTwo 2:6a8fbb08d519 176 WriteData(data,RIGHT); //output data to D0-D7
GuiTwo 2:6a8fbb08d519 177 }
GuiTwo 2:6a8fbb08d519 178
GuiTwo 0:f2f71eab6aef 179 SelectSide(NONE);
GuiTwo 0:f2f71eab6aef 180 }
GuiTwo 0:f2f71eab6aef 181
GuiTwo 0:f2f71eab6aef 182
GuiTwo 0:f2f71eab6aef 183
GuiTwo 2:6a8fbb08d519 184 unsigned int KS0108::ReadData()
GuiTwo 2:6a8fbb08d519 185 {
GuiTwo 2:6a8fbb08d519 186 unsigned int data;
GuiTwo 2:6a8fbb08d519 187 DB.input();
GuiTwo 0:f2f71eab6aef 188
GuiTwo 2:6a8fbb08d519 189
GuiTwo 2:6a8fbb08d519 190 DI.write(1);
GuiTwo 2:6a8fbb08d519 191 RW.write(1);
GuiTwo 0:f2f71eab6aef 192
GuiTwo 2:6a8fbb08d519 193 E.write(1);
GuiTwo 2:6a8fbb08d519 194 wait(0.00000045);
GuiTwo 2:6a8fbb08d519 195
GuiTwo 2:6a8fbb08d519 196 data = DB.read();
GuiTwo 2:6a8fbb08d519 197 wait(0.0000001);
GuiTwo 2:6a8fbb08d519 198 E.write(0);
GuiTwo 2:6a8fbb08d519 199 DB.output();
GuiTwo 2:6a8fbb08d519 200
GuiTwo 2:6a8fbb08d519 201 return data;
GuiTwo 0:f2f71eab6aef 202 }
GuiTwo 0:f2f71eab6aef 203
GuiTwo 2:6a8fbb08d519 204 unsigned int KS0108::ReadStatus()
GuiTwo 2:6a8fbb08d519 205 {
GuiTwo 2:6a8fbb08d519 206 unsigned int status;
GuiTwo 2:6a8fbb08d519 207 DB.input();
GuiTwo 2:6a8fbb08d519 208
GuiTwo 2:6a8fbb08d519 209 DI.write(0);
GuiTwo 2:6a8fbb08d519 210
GuiTwo 2:6a8fbb08d519 211 RW.write(1);
GuiTwo 2:6a8fbb08d519 212 E.write(1);
GuiTwo 2:6a8fbb08d519 213 wait(0.00000045);
GuiTwo 2:6a8fbb08d519 214
GuiTwo 2:6a8fbb08d519 215 status = DB.read();
GuiTwo 2:6a8fbb08d519 216 E.write(0);
GuiTwo 2:6a8fbb08d519 217 wait(0.0000001);
GuiTwo 2:6a8fbb08d519 218 DB.output();
GuiTwo 2:6a8fbb08d519 219
GuiTwo 2:6a8fbb08d519 220 return status;
GuiTwo 2:6a8fbb08d519 221 }
GuiTwo 0:f2f71eab6aef 222
GuiTwo 0:f2f71eab6aef 223
GuiTwo 0:f2f71eab6aef 224
GuiTwo 2:6a8fbb08d519 225 void KS0108::SelectSide(unsigned char side)
GuiTwo 2:6a8fbb08d519 226 {
GuiTwo 2:6a8fbb08d519 227 if(side==LEFT) {
GuiTwo 2:6a8fbb08d519 228 CS1.write(1);
GuiTwo 2:6a8fbb08d519 229 CS2.write(0);
GuiTwo 2:6a8fbb08d519 230 } else if(side==RIGHT) {
GuiTwo 2:6a8fbb08d519 231 CS1.write(0);
GuiTwo 2:6a8fbb08d519 232 CS2.write(1);
GuiTwo 2:6a8fbb08d519 233 } else if (side==BOTH) {
GuiTwo 2:6a8fbb08d519 234 CS1.write(1);
GuiTwo 2:6a8fbb08d519 235 CS2.write(1);
GuiTwo 2:6a8fbb08d519 236 } else if (side==NONE) {
GuiTwo 2:6a8fbb08d519 237 CS1.write(0);
GuiTwo 2:6a8fbb08d519 238 CS2.write(0);
GuiTwo 2:6a8fbb08d519 239 }
GuiTwo 0:f2f71eab6aef 240 }
GuiTwo 0:f2f71eab6aef 241
GuiTwo 0:f2f71eab6aef 242
GuiTwo 2:6a8fbb08d519 243 void KS0108::ClearScreen()
GuiTwo 2:6a8fbb08d519 244 {
GuiTwo 2:6a8fbb08d519 245 for (int col=0; col<128; col++) {
GuiTwo 2:6a8fbb08d519 246 for (int page=0; page<8; page++) {
GuiTwo 0:f2f71eab6aef 247 WriteDataColPag(page,col,WHITE);
GuiTwo 0:f2f71eab6aef 248 }
GuiTwo 0:f2f71eab6aef 249 }
GuiTwo 2:6a8fbb08d519 250 }
GuiTwo 0:f2f71eab6aef 251
GuiTwo 0:f2f71eab6aef 252
GuiTwo 2:6a8fbb08d519 253 void KS0108::TurnOn()
GuiTwo 2:6a8fbb08d519 254 {
GuiTwo 0:f2f71eab6aef 255 WriteInstruction(LCD_ON,BOTH);
GuiTwo 0:f2f71eab6aef 256 }
GuiTwo 0:f2f71eab6aef 257
GuiTwo 0:f2f71eab6aef 258
GuiTwo 2:6a8fbb08d519 259 void KS0108::TurnOff()
GuiTwo 2:6a8fbb08d519 260 {
GuiTwo 0:f2f71eab6aef 261 WriteInstruction(LCD_OFF,BOTH);
GuiTwo 0:f2f71eab6aef 262 }
GuiTwo 0:f2f71eab6aef 263
GuiTwo 0:f2f71eab6aef 264
GuiTwo 2:6a8fbb08d519 265 /*******************************************************************************************/
GuiTwo 2:6a8fbb08d519 266
GuiTwo 2:6a8fbb08d519 267
GuiTwo 2:6a8fbb08d519 268 void KS0108::SetPixel(unsigned int x, unsigned int y, unsigned int color)
GuiTwo 2:6a8fbb08d519 269 {
GuiTwo 2:6a8fbb08d519 270
GuiTwo 2:6a8fbb08d519 271 unsigned int position;
GuiTwo 2:6a8fbb08d519 272
GuiTwo 2:6a8fbb08d519 273 SelectSide(NONE);
GuiTwo 2:6a8fbb08d519 274 WriteInstruction(LCD_SET_ADD,NONE);
GuiTwo 0:f2f71eab6aef 275
GuiTwo 2:6a8fbb08d519 276 if(x>=64) {
GuiTwo 2:6a8fbb08d519 277 WriteInstruction(LCD_SET_PAGE|(y/8),RIGHT);
GuiTwo 2:6a8fbb08d519 278 WriteInstruction(LCD_SET_ADD|x,RIGHT);
GuiTwo 2:6a8fbb08d519 279 position = ReadData(); //dummy read
GuiTwo 2:6a8fbb08d519 280 position = ReadData(); //actual read
GuiTwo 2:6a8fbb08d519 281 WriteInstruction(LCD_SET_ADD|x,RIGHT);
GuiTwo 2:6a8fbb08d519 282 if(color==WHITE)
GuiTwo 2:6a8fbb08d519 283 WriteData(position&(~(1<<(y%8))),RIGHT); // draw a white pixel
GuiTwo 2:6a8fbb08d519 284 else
GuiTwo 2:6a8fbb08d519 285 WriteData(position|(1<<(y%8)),RIGHT);
GuiTwo 2:6a8fbb08d519 286 wait_us(450);
GuiTwo 2:6a8fbb08d519 287 } else {
GuiTwo 2:6a8fbb08d519 288 WriteInstruction(LCD_SET_PAGE|(y/8),LEFT);
GuiTwo 2:6a8fbb08d519 289 WriteInstruction(LCD_SET_ADD|x,LEFT);
GuiTwo 2:6a8fbb08d519 290 position = ReadData(); //dummy read
GuiTwo 2:6a8fbb08d519 291 position = ReadData(); //actual read
GuiTwo 2:6a8fbb08d519 292 WriteInstruction(LCD_SET_ADD|x,LEFT);
GuiTwo 2:6a8fbb08d519 293 if(color==WHITE)
GuiTwo 2:6a8fbb08d519 294 WriteData(position&(~(1<<(y%8))),LEFT);
GuiTwo 2:6a8fbb08d519 295 else
GuiTwo 2:6a8fbb08d519 296 WriteData(position|(1<<(y%8)),LEFT);
GuiTwo 0:f2f71eab6aef 297
GuiTwo 2:6a8fbb08d519 298 wait_us(450);
GuiTwo 0:f2f71eab6aef 299
GuiTwo 2:6a8fbb08d519 300 }
GuiTwo 2:6a8fbb08d519 301
GuiTwo 2:6a8fbb08d519 302 }
GuiTwo 0:f2f71eab6aef 303
GuiTwo 0:f2f71eab6aef 304
GuiTwo 0:f2f71eab6aef 305
GuiTwo 2:6a8fbb08d519 306 void KS0108::FullRectangle(unsigned int Xaxis1, unsigned int Yaxis1, unsigned int Xaxis2 ,unsigned int Yaxis2,unsigned int color)
GuiTwo 2:6a8fbb08d519 307 {
GuiTwo 2:6a8fbb08d519 308
GuiTwo 2:6a8fbb08d519 309 for(unsigned int i=Xaxis1; i<=Xaxis2; i++) {
GuiTwo 2:6a8fbb08d519 310 for(unsigned int j=Yaxis1; j<=Yaxis2; j++) {
GuiTwo 0:f2f71eab6aef 311 SetPixel(i,j,color);
GuiTwo 2:6a8fbb08d519 312
GuiTwo 2:6a8fbb08d519 313 }
GuiTwo 2:6a8fbb08d519 314 }
GuiTwo 2:6a8fbb08d519 315 }
GuiTwo 0:f2f71eab6aef 316
GuiTwo 0:f2f71eab6aef 317
GuiTwo 2:6a8fbb08d519 318 void KS0108::EmptyRectangle(unsigned int Xaxis1,unsigned int Yaxis1, unsigned int Xaxis2,unsigned int Yaxis2,unsigned int color)
GuiTwo 2:6a8fbb08d519 319 {
GuiTwo 2:6a8fbb08d519 320 unsigned int CurrentValue;
GuiTwo 0:f2f71eab6aef 321
GuiTwo 0:f2f71eab6aef 322 /* Draw the two horizontal lines */
GuiTwo 2:6a8fbb08d519 323 for (CurrentValue = 0; CurrentValue < Xaxis2 - Xaxis1+ 1; CurrentValue++) {
GuiTwo 0:f2f71eab6aef 324 SetPixel(Xaxis1 + CurrentValue, Yaxis1,color);
GuiTwo 0:f2f71eab6aef 325 SetPixel(Xaxis1 + CurrentValue, Yaxis2,color);
GuiTwo 0:f2f71eab6aef 326 }
GuiTwo 2:6a8fbb08d519 327
GuiTwo 2:6a8fbb08d519 328 /* draw the two vertical lines */
GuiTwo 2:6a8fbb08d519 329 for (CurrentValue = 0; CurrentValue < Yaxis2 - Yaxis1 + 1; CurrentValue++) {
GuiTwo 0:f2f71eab6aef 330 SetPixel(Xaxis1, Yaxis1 + CurrentValue,color);
GuiTwo 0:f2f71eab6aef 331 SetPixel(Xaxis2, Yaxis1 + CurrentValue,color);
GuiTwo 0:f2f71eab6aef 332 }
GuiTwo 0:f2f71eab6aef 333 }
GuiTwo 0:f2f71eab6aef 334
GuiTwo 0:f2f71eab6aef 335
GuiTwo 2:6a8fbb08d519 336 void KS0108::RoundRectangle(unsigned int x, unsigned int y, unsigned int width, unsigned int height, unsigned int radius, unsigned int color)
GuiTwo 2:6a8fbb08d519 337 {
GuiTwo 2:6a8fbb08d519 338 int tSwitch, x1 = 0, y1 = radius;
GuiTwo 2:6a8fbb08d519 339 tSwitch = 3 - 2 * radius;
GuiTwo 2:6a8fbb08d519 340
GuiTwo 0:f2f71eab6aef 341 while (x1 <= y1) {
GuiTwo 0:f2f71eab6aef 342 SetPixel(x+radius - x1, y+radius - y1, color);
GuiTwo 0:f2f71eab6aef 343 SetPixel(x+radius - y1, y+radius - x1, color);
GuiTwo 0:f2f71eab6aef 344
GuiTwo 0:f2f71eab6aef 345 SetPixel(x+width-radius + x1, y+radius - y1, color);
GuiTwo 0:f2f71eab6aef 346 SetPixel(x+width-radius + y1, y+radius - x1, color);
GuiTwo 2:6a8fbb08d519 347
GuiTwo 0:f2f71eab6aef 348 SetPixel(x+width-radius + x1, y+height-radius + y1, color);
GuiTwo 0:f2f71eab6aef 349 SetPixel(x+width-radius + y1, y+height-radius + x1, color);
GuiTwo 0:f2f71eab6aef 350
GuiTwo 0:f2f71eab6aef 351 SetPixel(x+radius - x1, y+height-radius + y1, color);
GuiTwo 0:f2f71eab6aef 352 SetPixel(x+radius - y1, y+height-radius + x1, color);
GuiTwo 0:f2f71eab6aef 353
GuiTwo 0:f2f71eab6aef 354 if (tSwitch < 0) {
GuiTwo 0:f2f71eab6aef 355 tSwitch += (4 * x1 + 6);
GuiTwo 0:f2f71eab6aef 356 } else {
GuiTwo 0:f2f71eab6aef 357 tSwitch += (4 * (x1 - y1) + 10);
GuiTwo 0:f2f71eab6aef 358 y1--;
GuiTwo 0:f2f71eab6aef 359 }
GuiTwo 0:f2f71eab6aef 360 x1++;
GuiTwo 0:f2f71eab6aef 361 }
GuiTwo 2:6a8fbb08d519 362
GuiTwo 0:f2f71eab6aef 363 HLineShort(x+radius,y, width-(2*radius), color); // top
GuiTwo 0:f2f71eab6aef 364 HLineShort(x+radius,y+height, width-(2*radius), color); // bottom
GuiTwo 0:f2f71eab6aef 365 VLineShort(x,y+radius,height-(2*radius), color); // left
GuiTwo 0:f2f71eab6aef 366 VLineShort(x+width, y+radius,height-(2*radius), color); // right
GuiTwo 0:f2f71eab6aef 367 }
GuiTwo 0:f2f71eab6aef 368
GuiTwo 0:f2f71eab6aef 369
GuiTwo 2:6a8fbb08d519 370 void KS0108::HLine(unsigned int Xaxis1, unsigned int Xaxis2 ,unsigned int Yaxis,unsigned int color)
GuiTwo 2:6a8fbb08d519 371 {
GuiTwo 0:f2f71eab6aef 372 FullRectangle(Xaxis1,Yaxis,Xaxis2,Yaxis,color);
GuiTwo 0:f2f71eab6aef 373
GuiTwo 0:f2f71eab6aef 374 }
GuiTwo 0:f2f71eab6aef 375
GuiTwo 0:f2f71eab6aef 376
GuiTwo 2:6a8fbb08d519 377 void KS0108::HLineShort(unsigned int Xaxis, unsigned int Yaxis,unsigned int width ,unsigned int color)
GuiTwo 2:6a8fbb08d519 378 {
GuiTwo 0:f2f71eab6aef 379 FullRectangle(Xaxis,Yaxis,Xaxis+width,Yaxis,color);
GuiTwo 0:f2f71eab6aef 380
GuiTwo 0:f2f71eab6aef 381 }
GuiTwo 0:f2f71eab6aef 382
GuiTwo 0:f2f71eab6aef 383
GuiTwo 2:6a8fbb08d519 384 void KS0108::VLine(unsigned int Xaxis, unsigned int Yaxis1 ,unsigned int Yaxis2,unsigned int color)
GuiTwo 2:6a8fbb08d519 385 {
GuiTwo 2:6a8fbb08d519 386 FullRectangle(Xaxis,Yaxis1,Xaxis,Yaxis2,color);
GuiTwo 2:6a8fbb08d519 387 }
GuiTwo 2:6a8fbb08d519 388
GuiTwo 2:6a8fbb08d519 389
GuiTwo 2:6a8fbb08d519 390 void KS0108::VLineShort(unsigned int Xaxis,unsigned int Yaxis, unsigned int height ,unsigned int color)
GuiTwo 2:6a8fbb08d519 391 {
GuiTwo 0:f2f71eab6aef 392 FullRectangle(Xaxis,Yaxis,Xaxis,Yaxis+height,color);
GuiTwo 0:f2f71eab6aef 393
GuiTwo 0:f2f71eab6aef 394 }
GuiTwo 0:f2f71eab6aef 395
GuiTwo 0:f2f71eab6aef 396
GuiTwo 2:6a8fbb08d519 397 void KS0108::DegreeLine(unsigned int x, int y,unsigned int degree,unsigned int inner_radius,unsigned int outer_radius, unsigned int color)
GuiTwo 2:6a8fbb08d519 398 {
GuiTwo 2:6a8fbb08d519 399 int fx,fy,tx,ty;
GuiTwo 2:6a8fbb08d519 400 fx = x + dfloor(inner_radius * sin(degree * 3.14 / 180));
GuiTwo 2:6a8fbb08d519 401 fy = y - dfloor(inner_radius * cos(degree * 3.14 / 180));
GuiTwo 2:6a8fbb08d519 402 tx = x + dfloor(outer_radius * sin(degree * 3.14 / 180));
GuiTwo 2:6a8fbb08d519 403 ty = y - dfloor(outer_radius * cos(degree * 3.14 / 180));
GuiTwo 2:6a8fbb08d519 404 SlantyLine(fx,fy,tx,ty,color);
GuiTwo 0:f2f71eab6aef 405 }
GuiTwo 0:f2f71eab6aef 406
GuiTwo 0:f2f71eab6aef 407
GuiTwo 2:6a8fbb08d519 408 double KS0108::dfloor( double value )
GuiTwo 2:6a8fbb08d519 409 {
GuiTwo 2:6a8fbb08d519 410
GuiTwo 2:6a8fbb08d519 411 if (value < 0.0)
GuiTwo 2:6a8fbb08d519 412 return ceil( value );
GuiTwo 2:6a8fbb08d519 413 else
GuiTwo 2:6a8fbb08d519 414 return floor( value );
GuiTwo 2:6a8fbb08d519 415
GuiTwo 0:f2f71eab6aef 416 }
GuiTwo 0:f2f71eab6aef 417
GuiTwo 0:f2f71eab6aef 418
GuiTwo 2:6a8fbb08d519 419 void KS0108::SlantyLine(unsigned int lX1, unsigned int lY1, unsigned int lX2,unsigned int lY2,unsigned int color)
GuiTwo 2:6a8fbb08d519 420 {
GuiTwo 2:6a8fbb08d519 421 long lError, lDeltaX, lDeltaY, lYStep, bSteep;
GuiTwo 2:6a8fbb08d519 422
GuiTwo 0:f2f71eab6aef 423 // A steep line has a bigger ordinate.
GuiTwo 2:6a8fbb08d519 424
GuiTwo 2:6a8fbb08d519 425 if(((lY2 > lY1) ? (lY2 - lY1) : (lY1 - lY2)) > ((lX2 > lX1) ? (lX2 - lX1) : (lX1 - lX2))) {
GuiTwo 0:f2f71eab6aef 426 bSteep = 1;
GuiTwo 2:6a8fbb08d519 427 } else {
GuiTwo 0:f2f71eab6aef 428 bSteep = 0;
GuiTwo 0:f2f71eab6aef 429 }
GuiTwo 2:6a8fbb08d519 430
GuiTwo 0:f2f71eab6aef 431 // If line is steep, swap the X and Y coordinates.
GuiTwo 2:6a8fbb08d519 432 if(bSteep) {
GuiTwo 0:f2f71eab6aef 433 lError = lX1;
GuiTwo 0:f2f71eab6aef 434 lX1 = lY1;
GuiTwo 0:f2f71eab6aef 435 lY1 = lError;
GuiTwo 0:f2f71eab6aef 436 lError = lX2;
GuiTwo 0:f2f71eab6aef 437 lX2 = lY2;
GuiTwo 0:f2f71eab6aef 438 lY2 = lError;
GuiTwo 0:f2f71eab6aef 439 }
GuiTwo 0:f2f71eab6aef 440
GuiTwo 2:6a8fbb08d519 441
GuiTwo 0:f2f71eab6aef 442 // If the starting X coordinate is larger than the ending X coordinate,
GuiTwo 0:f2f71eab6aef 443 // swap coordinates.
GuiTwo 2:6a8fbb08d519 444 if(lX1 > lX2) {
GuiTwo 0:f2f71eab6aef 445 lError = lX1;
GuiTwo 0:f2f71eab6aef 446 lX1 = lX2;
GuiTwo 0:f2f71eab6aef 447 lX2 = lError;
GuiTwo 0:f2f71eab6aef 448 lError = lY1;
GuiTwo 0:f2f71eab6aef 449 lY1 = lY2;
GuiTwo 0:f2f71eab6aef 450 lY2 = lError;
GuiTwo 0:f2f71eab6aef 451 }
GuiTwo 2:6a8fbb08d519 452
GuiTwo 2:6a8fbb08d519 453 // Compute the difference between the start and end coordinates.
GuiTwo 0:f2f71eab6aef 454 lDeltaX = lX2 - lX1;
GuiTwo 0:f2f71eab6aef 455 lDeltaY = (lY2 > lY1) ? (lY2 - lY1) : (lY1 - lY2);
GuiTwo 2:6a8fbb08d519 456
GuiTwo 0:f2f71eab6aef 457 lError = -lDeltaX / 2; // Initialize the error term to negative half the X delta.
GuiTwo 2:6a8fbb08d519 458
GuiTwo 2:6a8fbb08d519 459 if(lY1 < lY2) { // Determine the direction to step in the Y axis when required.
GuiTwo 0:f2f71eab6aef 460 lYStep = 1;
GuiTwo 2:6a8fbb08d519 461 } else {
GuiTwo 0:f2f71eab6aef 462 lYStep = -1;
GuiTwo 0:f2f71eab6aef 463 }
GuiTwo 2:6a8fbb08d519 464
GuiTwo 2:6a8fbb08d519 465 for(; lX1 <= lX2; lX1++) { // Loop through all the points along the X axis of the line.
GuiTwo 2:6a8fbb08d519 466
GuiTwo 0:f2f71eab6aef 467 // See if this is a steep line.
GuiTwo 2:6a8fbb08d519 468
GuiTwo 2:6a8fbb08d519 469 if(bSteep) {
GuiTwo 2:6a8fbb08d519 470
GuiTwo 0:f2f71eab6aef 471 // Plot this point of the line, swapping the X and Y coordinates.
GuiTwo 2:6a8fbb08d519 472
GuiTwo 0:f2f71eab6aef 473 SetPixel(lY1, lX1,color);
GuiTwo 2:6a8fbb08d519 474 } else { // Plot this point of the line, using the coordinates as is.
GuiTwo 2:6a8fbb08d519 475 SetPixel(lX1, lY1,color);
GuiTwo 0:f2f71eab6aef 476 }
GuiTwo 2:6a8fbb08d519 477
GuiTwo 0:f2f71eab6aef 478 // Increment the error term by the Y delta.
GuiTwo 2:6a8fbb08d519 479
GuiTwo 2:6a8fbb08d519 480 lError += lDeltaY;
GuiTwo 2:6a8fbb08d519 481
GuiTwo 2:6a8fbb08d519 482 if(lError > 0) { // See if the error term is now greater than zero.
GuiTwo 2:6a8fbb08d519 483
GuiTwo 0:f2f71eab6aef 484 lY1 += lYStep; // Take a step in the Y axis.
GuiTwo 2:6a8fbb08d519 485
GuiTwo 0:f2f71eab6aef 486 lError -= lDeltaX; // Decrement the error term by the X delta.
GuiTwo 0:f2f71eab6aef 487 }
GuiTwo 0:f2f71eab6aef 488 }
GuiTwo 0:f2f71eab6aef 489 }
GuiTwo 0:f2f71eab6aef 490
GuiTwo 0:f2f71eab6aef 491
GuiTwo 0:f2f71eab6aef 492
GuiTwo 2:6a8fbb08d519 493 void KS0108::Line(unsigned int x1, unsigned int y1, unsigned int x2, unsigned int y2, unsigned int color)
GuiTwo 2:6a8fbb08d519 494 {
GuiTwo 2:6a8fbb08d519 495 unsigned int deltax, deltay, x,y, steep;
GuiTwo 2:6a8fbb08d519 496 int lerror, ystep;
GuiTwo 0:f2f71eab6aef 497
GuiTwo 0:f2f71eab6aef 498 steep = absDiff(y1,y2) > absDiff(x1,x2); //check slope
GuiTwo 0:f2f71eab6aef 499
GuiTwo 2:6a8fbb08d519 500 if ( steep ) {
GuiTwo 0:f2f71eab6aef 501 swap(x1, y1);
GuiTwo 0:f2f71eab6aef 502 swap(x2, y2);
GuiTwo 0:f2f71eab6aef 503 }
GuiTwo 0:f2f71eab6aef 504
GuiTwo 2:6a8fbb08d519 505 if (x1 > x2) {
GuiTwo 0:f2f71eab6aef 506 swap(x1, x2);
GuiTwo 0:f2f71eab6aef 507 swap(y1, y2);
GuiTwo 0:f2f71eab6aef 508 }
GuiTwo 0:f2f71eab6aef 509
GuiTwo 0:f2f71eab6aef 510 deltax = x2 - x1;
GuiTwo 2:6a8fbb08d519 511 deltay = absDiff(y2,y1);
GuiTwo 0:f2f71eab6aef 512 lerror = deltax / 2;
GuiTwo 0:f2f71eab6aef 513 y = y1;
GuiTwo 2:6a8fbb08d519 514 if(y1 < y2) ystep = 1;
GuiTwo 2:6a8fbb08d519 515 else ystep = -1;
GuiTwo 0:f2f71eab6aef 516
GuiTwo 2:6a8fbb08d519 517 for(x = x1; x <= x2; x++) {
GuiTwo 2:6a8fbb08d519 518 if (steep) SetPixel(y,x, color);
GuiTwo 2:6a8fbb08d519 519 else SetPixel(x,y, color);
GuiTwo 2:6a8fbb08d519 520 lerror -= deltay;
GuiTwo 2:6a8fbb08d519 521 if (lerror < 0) {
GuiTwo 0:f2f71eab6aef 522 y = y + ystep;
GuiTwo 0:f2f71eab6aef 523 lerror += deltax;
GuiTwo 0:f2f71eab6aef 524 }
GuiTwo 0:f2f71eab6aef 525 }
GuiTwo 0:f2f71eab6aef 526 }
GuiTwo 0:f2f71eab6aef 527
GuiTwo 0:f2f71eab6aef 528
GuiTwo 2:6a8fbb08d519 529 void KS0108::EmptyCircle(unsigned int CenterX, unsigned int CenterY, unsigned int Radius,unsigned int color)
GuiTwo 2:6a8fbb08d519 530 {
GuiTwo 2:6a8fbb08d519 531 unsigned int y=0, x=0, d = 0;
GuiTwo 2:6a8fbb08d519 532 int part;
GuiTwo 2:6a8fbb08d519 533 d = CenterY - CenterX;
GuiTwo 2:6a8fbb08d519 534 y = Radius;
GuiTwo 2:6a8fbb08d519 535 part = 3 - 2 * Radius;
GuiTwo 0:f2f71eab6aef 536
GuiTwo 2:6a8fbb08d519 537 while (x <= y) {
GuiTwo 2:6a8fbb08d519 538 SetPixel(CenterX + x, CenterY + y,color);
GuiTwo 2:6a8fbb08d519 539 SetPixel(CenterX + x, CenterY - y,color);
GuiTwo 2:6a8fbb08d519 540 SetPixel(CenterX - x, CenterY + y,color);
GuiTwo 2:6a8fbb08d519 541 SetPixel(CenterX - x, CenterY - y,color);
GuiTwo 2:6a8fbb08d519 542 SetPixel(CenterY + y - d, CenterY + x,color);
GuiTwo 2:6a8fbb08d519 543 SetPixel(CenterY + y - d, CenterY - x,color);
GuiTwo 2:6a8fbb08d519 544 SetPixel(CenterY - y - d, CenterY + x,color);
GuiTwo 2:6a8fbb08d519 545 SetPixel(CenterY - y - d, CenterY - x,color);
GuiTwo 0:f2f71eab6aef 546
GuiTwo 2:6a8fbb08d519 547 if (part < 0) part += (4 * x + 6);
GuiTwo 2:6a8fbb08d519 548 else {
GuiTwo 2:6a8fbb08d519 549 part += (4 * (x - y) + 10);
GuiTwo 2:6a8fbb08d519 550 y--;
GuiTwo 2:6a8fbb08d519 551 }
GuiTwo 2:6a8fbb08d519 552 x++;
GuiTwo 0:f2f71eab6aef 553 }
GuiTwo 2:6a8fbb08d519 554
GuiTwo 2:6a8fbb08d519 555 }
GuiTwo 0:f2f71eab6aef 556
GuiTwo 0:f2f71eab6aef 557
GuiTwo 2:6a8fbb08d519 558 void KS0108::FullCircle(unsigned int CenterX, unsigned int CenterY, unsigned int Radius,unsigned int color)
GuiTwo 2:6a8fbb08d519 559 {
GuiTwo 0:f2f71eab6aef 560
GuiTwo 2:6a8fbb08d519 561 int f = 1 - Radius;
GuiTwo 2:6a8fbb08d519 562 int ddF_x = 1;
GuiTwo 2:6a8fbb08d519 563 int ddF_y = 2 * Radius; //changed sign of -2
GuiTwo 2:6a8fbb08d519 564 unsigned int x = 0;
GuiTwo 2:6a8fbb08d519 565 unsigned int y = Radius;
GuiTwo 2:6a8fbb08d519 566
GuiTwo 2:6a8fbb08d519 567 //Fill in the center between the two halves
GuiTwo 2:6a8fbb08d519 568
GuiTwo 0:f2f71eab6aef 569 Line(CenterX, CenterY-Radius, CenterX, CenterY+Radius, color);
GuiTwo 2:6a8fbb08d519 570
GuiTwo 2:6a8fbb08d519 571 while(x < y) {
GuiTwo 2:6a8fbb08d519 572 if(f >= 0) {
GuiTwo 0:f2f71eab6aef 573 y--;
GuiTwo 0:f2f71eab6aef 574 ddF_y += 2;
GuiTwo 0:f2f71eab6aef 575 f += ddF_y;
GuiTwo 0:f2f71eab6aef 576 }
GuiTwo 0:f2f71eab6aef 577 x++;
GuiTwo 0:f2f71eab6aef 578 ddF_x += 2;
GuiTwo 2:6a8fbb08d519 579 f += ddF_x;
GuiTwo 0:f2f71eab6aef 580
GuiTwo 0:f2f71eab6aef 581 /*
GuiTwo 0:f2f71eab6aef 582 * Now draw vertical lines between the points on the circle rather than
GuiTwo 2:6a8fbb08d519 583 * draw the points of the circle. This draws lines between the
GuiTwo 0:f2f71eab6aef 584 * perimeter points on the upper and lower quadrants of the 2 halves of the circle.
GuiTwo 0:f2f71eab6aef 585 */
GuiTwo 0:f2f71eab6aef 586
GuiTwo 0:f2f71eab6aef 587 Line(CenterX+x, CenterY+y, CenterX+x, CenterY-y, color);
GuiTwo 0:f2f71eab6aef 588 Line(CenterX-x, CenterY+y, CenterX-x, CenterY-y, color);
GuiTwo 0:f2f71eab6aef 589 Line(CenterX+y, CenterY+x, y+CenterX, CenterY-x, color);
GuiTwo 0:f2f71eab6aef 590 Line(CenterX-y, CenterY+x, CenterX-y, CenterY-x, color);
GuiTwo 2:6a8fbb08d519 591 }
GuiTwo 2:6a8fbb08d519 592 }
GuiTwo 0:f2f71eab6aef 593
GuiTwo 0:f2f71eab6aef 594
GuiTwo 0:f2f71eab6aef 595
GuiTwo 2:6a8fbb08d519 596 void KS0108::PlotEllipse(long CX, long CY, long XRadius,long YRadius, int color)
GuiTwo 2:6a8fbb08d519 597 {
GuiTwo 0:f2f71eab6aef 598
GuiTwo 0:f2f71eab6aef 599
GuiTwo 2:6a8fbb08d519 600 long X, Y;
GuiTwo 2:6a8fbb08d519 601 long XChange, YChange;
GuiTwo 2:6a8fbb08d519 602 long EllipseError;
GuiTwo 2:6a8fbb08d519 603 long TwoASquare,TwoBSquare;
GuiTwo 2:6a8fbb08d519 604 long StoppingX, StoppingY;
GuiTwo 2:6a8fbb08d519 605 TwoASquare = 2*XRadius*XRadius;
GuiTwo 2:6a8fbb08d519 606 TwoBSquare = 2*YRadius*YRadius;
GuiTwo 2:6a8fbb08d519 607 X = XRadius;
GuiTwo 2:6a8fbb08d519 608 Y = 0;
GuiTwo 2:6a8fbb08d519 609 XChange = YRadius*YRadius*(1-2*XRadius);
GuiTwo 2:6a8fbb08d519 610 YChange = XRadius*XRadius;
GuiTwo 2:6a8fbb08d519 611 EllipseError = 0;
GuiTwo 2:6a8fbb08d519 612 StoppingX = TwoBSquare*XRadius;
GuiTwo 2:6a8fbb08d519 613 StoppingY = 0;
GuiTwo 0:f2f71eab6aef 614
GuiTwo 2:6a8fbb08d519 615 while ( StoppingX >=StoppingY ) { //first set of points,y'>-1
GuiTwo 2:6a8fbb08d519 616 Plot4EllipsePoints(CX,CY,X,Y,color);
GuiTwo 2:6a8fbb08d519 617 Y++;
GuiTwo 2:6a8fbb08d519 618 StoppingY=StoppingY+ TwoASquare;
GuiTwo 2:6a8fbb08d519 619 EllipseError = EllipseError+ YChange;
GuiTwo 2:6a8fbb08d519 620 YChange=YChange+TwoASquare;
GuiTwo 2:6a8fbb08d519 621 if ((2*EllipseError + XChange) > 0 ) {
GuiTwo 2:6a8fbb08d519 622 X--;
GuiTwo 2:6a8fbb08d519 623 StoppingX=StoppingX- TwoBSquare;
GuiTwo 2:6a8fbb08d519 624 EllipseError=EllipseError+ XChange;
GuiTwo 2:6a8fbb08d519 625 XChange=XChange+TwoBSquare;
GuiTwo 2:6a8fbb08d519 626 }
GuiTwo 0:f2f71eab6aef 627 }
GuiTwo 0:f2f71eab6aef 628
GuiTwo 2:6a8fbb08d519 629 Y = YRadius;
GuiTwo 2:6a8fbb08d519 630 X = 0;
GuiTwo 2:6a8fbb08d519 631 YChange = XRadius*XRadius*(1-2*YRadius);
GuiTwo 2:6a8fbb08d519 632 XChange = YRadius*YRadius;
GuiTwo 2:6a8fbb08d519 633 EllipseError = 0;
GuiTwo 2:6a8fbb08d519 634 StoppingY = TwoASquare*YRadius;
GuiTwo 2:6a8fbb08d519 635 StoppingX = 0;
GuiTwo 0:f2f71eab6aef 636
GuiTwo 2:6a8fbb08d519 637 while ( StoppingY >=StoppingX ) { //{2nd set of points, y'< -1}
GuiTwo 2:6a8fbb08d519 638 Plot4EllipsePoints(CX,CY,X,Y,color);
GuiTwo 2:6a8fbb08d519 639 X++;
GuiTwo 2:6a8fbb08d519 640 StoppingX=StoppingX + TwoBSquare;
GuiTwo 2:6a8fbb08d519 641 EllipseError=EllipseError+ XChange;
GuiTwo 2:6a8fbb08d519 642 XChange=XChange+TwoBSquare;
GuiTwo 2:6a8fbb08d519 643 if ((2*EllipseError + YChange) > 0 ) {
GuiTwo 2:6a8fbb08d519 644 Y--;
GuiTwo 2:6a8fbb08d519 645 StoppingY=StoppingY- TwoASquare;
GuiTwo 2:6a8fbb08d519 646 EllipseError=EllipseError+ YChange;
GuiTwo 2:6a8fbb08d519 647 YChange=YChange+TwoASquare;
GuiTwo 2:6a8fbb08d519 648 }
GuiTwo 0:f2f71eab6aef 649 }
GuiTwo 2:6a8fbb08d519 650 }
GuiTwo 0:f2f71eab6aef 651
GuiTwo 0:f2f71eab6aef 652
GuiTwo 0:f2f71eab6aef 653
GuiTwo 2:6a8fbb08d519 654 void KS0108::Plot4EllipsePoints(long CX,long CY, long X, long Y, int color)
GuiTwo 2:6a8fbb08d519 655 {
GuiTwo 2:6a8fbb08d519 656 SetPixel(CX+X, CY+Y, color); //{point in quadrant 1}
GuiTwo 2:6a8fbb08d519 657 SetPixel(CX-X, CY+Y, color); //{point in quadrant 2}
GuiTwo 2:6a8fbb08d519 658 SetPixel(CX-X, CY-Y, color); //{point in quadrant 3}
GuiTwo 2:6a8fbb08d519 659 SetPixel(CX+X, CY-Y, color); //{point in quadrant 4}
GuiTwo 2:6a8fbb08d519 660 }
GuiTwo 0:f2f71eab6aef 661
GuiTwo 0:f2f71eab6aef 662
GuiTwo 2:6a8fbb08d519 663 void KS0108::RightTriangle ( int topx, int topy, int rightx, int righty)
GuiTwo 2:6a8fbb08d519 664 {
GuiTwo 0:f2f71eab6aef 665
GuiTwo 0:f2f71eab6aef 666 //draw rectangle one line at a time
GuiTwo 0:f2f71eab6aef 667 Line( topx,topy, rightx,righty,BLACK ); //draw hypotenuse
GuiTwo 0:f2f71eab6aef 668 Line ( topx,righty,topx,topy,BLACK); //draw perpendicular
GuiTwo 0:f2f71eab6aef 669 Line (topx,righty, rightx,righty,BLACK); // draw base
GuiTwo 2:6a8fbb08d519 670
GuiTwo 0:f2f71eab6aef 671 }
GuiTwo 0:f2f71eab6aef 672
GuiTwo 2:6a8fbb08d519 673 void KS0108::Triangle ( int topx, int topy, int rightx, int righty)
GuiTwo 2:6a8fbb08d519 674 {
GuiTwo 0:f2f71eab6aef 675 int base =0;
GuiTwo 0:f2f71eab6aef 676 base = 2* rightx-topx;
GuiTwo 0:f2f71eab6aef 677 //draw rectangle one line at a time
GuiTwo 0:f2f71eab6aef 678 Line( topx,topy, rightx,righty,BLACK ); //draw hypotenuse
GuiTwo 0:f2f71eab6aef 679 Line ( topx,righty,topx,topy,BLACK); //draw perpendicular
GuiTwo 0:f2f71eab6aef 680 Line(topx-base/2,righty, rightx,righty,BLACK); // draw base
GuiTwo 0:f2f71eab6aef 681 Line(topx-base/2, righty, topx,topy,BLACK); // draw hypotenuse
GuiTwo 2:6a8fbb08d519 682
GuiTwo 0:f2f71eab6aef 683 }
GuiTwo 0:f2f71eab6aef 684
GuiTwo 0:f2f71eab6aef 685
GuiTwo 0:f2f71eab6aef 686
GuiTwo 0:f2f71eab6aef 687
GuiTwo 0:f2f71eab6aef 688 /***********************************************************************************/
GuiTwo 0:f2f71eab6aef 689
GuiTwo 0:f2f71eab6aef 690
GuiTwo 2:6a8fbb08d519 691 void KS0108::FullScreenBMP (unsigned char *PictureData)
GuiTwo 2:6a8fbb08d519 692 {
GuiTwo 0:f2f71eab6aef 693 unsigned int Page=0;
GuiTwo 2:6a8fbb08d519 694 unsigned int Column=0;
GuiTwo 2:6a8fbb08d519 695
GuiTwo 2:6a8fbb08d519 696 // Draw left side of the picture
GuiTwo 0:f2f71eab6aef 697 SelectSide(LEFT);
GuiTwo 2:6a8fbb08d519 698 for (Page = 0; Page < 8; Page++) { /* loop on the 8 pages */
GuiTwo 2:6a8fbb08d519 699 WriteInstruction(LCD_SET_PAGE | Page,LEFT); /* Set the page */
GuiTwo 2:6a8fbb08d519 700 for (Column = 0; Column < 64; Column++)
GuiTwo 0:f2f71eab6aef 701 WriteData(PictureData[(128*Page)+Column],LEFT);
GuiTwo 0:f2f71eab6aef 702 }
GuiTwo 2:6a8fbb08d519 703
GuiTwo 0:f2f71eab6aef 704 // Draw right side of the picture
GuiTwo 0:f2f71eab6aef 705 SelectSide(RIGHT);
GuiTwo 2:6a8fbb08d519 706 for (Page = 0; Page < 8; Page++) { /* loop on the 8 pages */
GuiTwo 2:6a8fbb08d519 707
GuiTwo 2:6a8fbb08d519 708 WriteInstruction(LCD_SET_PAGE| Page,RIGHT); /* Set the page */
GuiTwo 2:6a8fbb08d519 709 for (Column = 64; Column < 128; Column++)
GuiTwo 0:f2f71eab6aef 710 WriteData(PictureData[(128*Page)+Column],RIGHT);
GuiTwo 2:6a8fbb08d519 711 }
GuiTwo 0:f2f71eab6aef 712 }
GuiTwo 0:f2f71eab6aef 713
GuiTwo 2:6a8fbb08d519 714 unsigned int KS0108::ReadArrayData(const unsigned int* ptr)
GuiTwo 2:6a8fbb08d519 715 {
GuiTwo 0:f2f71eab6aef 716 return (*ptr);
GuiTwo 0:f2f71eab6aef 717 }
GuiTwo 0:f2f71eab6aef 718
GuiTwo 2:6a8fbb08d519 719 void KS0108::DrawBitmap(const unsigned int * bitmap, unsigned int x, unsigned int y, unsigned int color)
GuiTwo 2:6a8fbb08d519 720 {
GuiTwo 2:6a8fbb08d519 721 unsigned int width, height;
GuiTwo 2:6a8fbb08d519 722 unsigned int i, j;
GuiTwo 0:f2f71eab6aef 723
GuiTwo 2:6a8fbb08d519 724 width = ReadArrayData(bitmap++);
GuiTwo 2:6a8fbb08d519 725 height = ReadArrayData(bitmap++);
GuiTwo 2:6a8fbb08d519 726 for(j = 0; j < height / 8; j++) {
GuiTwo 2:6a8fbb08d519 727 GotoXY(x, y + (j*8) );
GuiTwo 2:6a8fbb08d519 728 for(i = 0; i < width; i++) {
GuiTwo 2:6a8fbb08d519 729 unsigned int displayData = ReadArrayData(bitmap++);
GuiTwo 0:f2f71eab6aef 730 if(color == BLACK)
GuiTwo 2:6a8fbb08d519 731 WriteData(displayData);
GuiTwo 2:6a8fbb08d519 732 else
GuiTwo 2:6a8fbb08d519 733 WriteData(~displayData);
GuiTwo 2:6a8fbb08d519 734 }
GuiTwo 2:6a8fbb08d519 735 }
GuiTwo 2:6a8fbb08d519 736 }
GuiTwo 0:f2f71eab6aef 737 /******************************************************************************************/
GuiTwo 0:f2f71eab6aef 738
GuiTwo 0:f2f71eab6aef 739
GuiTwo 2:6a8fbb08d519 740 void KS0108::GotoXY(unsigned int x, unsigned int y)
GuiTwo 2:6a8fbb08d519 741 {
GuiTwo 2:6a8fbb08d519 742 unsigned int chip, cmd;
GuiTwo 2:6a8fbb08d519 743
GuiTwo 2:6a8fbb08d519 744 if( (x > SCREEN_WIDTH-1) || (y > SCREEN_HEIGHT-1) ) // exit if coordinates are not legal
GuiTwo 2:6a8fbb08d519 745 return;
GuiTwo 2:6a8fbb08d519 746 Coord.x = x; // save new coordinates
GuiTwo 2:6a8fbb08d519 747 Coord.y = y;
GuiTwo 2:6a8fbb08d519 748
GuiTwo 2:6a8fbb08d519 749 if(y/8 != Coord.page) {
GuiTwo 2:6a8fbb08d519 750 Coord.page = y/8;
GuiTwo 2:6a8fbb08d519 751 cmd = LCD_SET_PAGE | Coord.page; // set y address on all chips
GuiTwo 2:6a8fbb08d519 752 for(chip=0; chip < 2; chip++) {
GuiTwo 2:6a8fbb08d519 753 WriteInstruction(cmd, chip);
GuiTwo 2:6a8fbb08d519 754 }
GuiTwo 0:f2f71eab6aef 755 }
GuiTwo 2:6a8fbb08d519 756 chip = Coord.x/64; //select chip
GuiTwo 2:6a8fbb08d519 757 x = x % 64; // valeur de X quelque soit le CS affich&#65533;
GuiTwo 2:6a8fbb08d519 758 cmd = LCD_SET_ADD | x;
GuiTwo 2:6a8fbb08d519 759 WriteInstruction(cmd, chip); // set x address on active chip
GuiTwo 0:f2f71eab6aef 760
GuiTwo 0:f2f71eab6aef 761 }
GuiTwo 0:f2f71eab6aef 762
GuiTwo 0:f2f71eab6aef 763
GuiTwo 0:f2f71eab6aef 764 /*****************************************************************************************/
GuiTwo 0:f2f71eab6aef 765
GuiTwo 0:f2f71eab6aef 766
GuiTwo 0:f2f71eab6aef 767
GuiTwo 2:6a8fbb08d519 768 void KS0108::Putchar (int page, int col,unsigned char c)
GuiTwo 2:6a8fbb08d519 769 {
GuiTwo 2:6a8fbb08d519 770 if (c>31 && c<127) {
GuiTwo 2:6a8fbb08d519 771 for(int i=0; i<5; i++) {
GuiTwo 2:6a8fbb08d519 772 WriteDataColPag(page,col+i,System5x7[((c-32)*5+i)+6]);
GuiTwo 2:6a8fbb08d519 773 }
GuiTwo 0:f2f71eab6aef 774 }
GuiTwo 0:f2f71eab6aef 775 }
GuiTwo 0:f2f71eab6aef 776
GuiTwo 0:f2f71eab6aef 777
GuiTwo 0:f2f71eab6aef 778
GuiTwo 2:6a8fbb08d519 779 void KS0108::PutString(unsigned int x, unsigned int y,char* str)
GuiTwo 2:6a8fbb08d519 780 {
GuiTwo 0:f2f71eab6aef 781
GuiTwo 2:6a8fbb08d519 782 while(*str != 0) {
GuiTwo 2:6a8fbb08d519 783 Putchar(x,y,*str);
GuiTwo 2:6a8fbb08d519 784 str++;
GuiTwo 2:6a8fbb08d519 785 y+=System5x7[2];
GuiTwo 0:f2f71eab6aef 786 }
GuiTwo 0:f2f71eab6aef 787
GuiTwo 0:f2f71eab6aef 788 }
GuiTwo 0:f2f71eab6aef 789
GuiTwo 2:6a8fbb08d519 790 void KS0108::PrintFloat(float val, unsigned int x,unsigned int y)
GuiTwo 2:6a8fbb08d519 791 {
GuiTwo 2:6a8fbb08d519 792 char buf[20] = {}; // prints up to 20 digits
GuiTwo 2:6a8fbb08d519 793 sprintf(buf,"%f",val);
GuiTwo 2:6a8fbb08d519 794 PutString(x,y,buf);
GuiTwo 0:f2f71eab6aef 795
GuiTwo 0:f2f71eab6aef 796 }
GuiTwo 0:f2f71eab6aef 797
GuiTwo 0:f2f71eab6aef 798
GuiTwo 2:6a8fbb08d519 799 void KS0108::PrintInteger(int val,unsigned int x,unsigned int y)
GuiTwo 2:6a8fbb08d519 800 {
GuiTwo 2:6a8fbb08d519 801 char buf[20] = {}; // prints up to 20 digits
GuiTwo 2:6a8fbb08d519 802 sprintf(buf,"%d",val);
GuiTwo 2:6a8fbb08d519 803 PutString(x,y,buf);
GuiTwo 0:f2f71eab6aef 804 }
GuiTwo 0:f2f71eab6aef 805
GuiTwo 2:6a8fbb08d519 806 void KS0108::SelectFont(unsigned int* font,unsigned int color, FontCallback callback)
GuiTwo 2:6a8fbb08d519 807 {
GuiTwo 0:f2f71eab6aef 808 Font = font;
GuiTwo 0:f2f71eab6aef 809 FontRead = callback;
GuiTwo 0:f2f71eab6aef 810 FontColor = color;
GuiTwo 0:f2f71eab6aef 811 }
GuiTwo 0:f2f71eab6aef 812
GuiTwo 0:f2f71eab6aef 813
GuiTwo 2:6a8fbb08d519 814 int KS0108::PrintChar(char c)
GuiTwo 2:6a8fbb08d519 815 {
GuiTwo 0:f2f71eab6aef 816 unsigned int width = 0;
GuiTwo 0:f2f71eab6aef 817 unsigned int height = FontRead(Font+FONT_HEIGHT);
GuiTwo 0:f2f71eab6aef 818 unsigned int bytes = (height+7)/8;
GuiTwo 2:6a8fbb08d519 819
GuiTwo 0:f2f71eab6aef 820 unsigned int firstChar = FontRead(Font+FONT_FIRST_CHAR);
GuiTwo 0:f2f71eab6aef 821 unsigned int charCount = FontRead(Font+FONT_CHAR_COUNT);
GuiTwo 2:6a8fbb08d519 822
GuiTwo 0:f2f71eab6aef 823 unsigned int index = 0;
GuiTwo 0:f2f71eab6aef 824 unsigned int x=Coord.x , y=Coord.y;
GuiTwo 0:f2f71eab6aef 825
GuiTwo 0:f2f71eab6aef 826 if(c < firstChar || c >= (firstChar+charCount)) {
GuiTwo 0:f2f71eab6aef 827 return 1;
GuiTwo 0:f2f71eab6aef 828 }
GuiTwo 0:f2f71eab6aef 829 c-= firstChar;
GuiTwo 0:f2f71eab6aef 830
GuiTwo 1:8bc625378e38 831 if( FontRead(Font+FONT_LENGTH) == 0 && FontRead(Font+FONT_LENGTH+1) == 0) {
GuiTwo 2:6a8fbb08d519 832 // zero length is flag indicating fixed width font (array does not contain width data entries)
GuiTwo 2:6a8fbb08d519 833 width = FontRead(Font+FONT_FIXED_WIDTH);
GuiTwo 2:6a8fbb08d519 834 index = c*bytes*width+FONT_WIDTH_TABLE;
GuiTwo 2:6a8fbb08d519 835 } else {
GuiTwo 2:6a8fbb08d519 836 // variable width font, read width data, to get the index
GuiTwo 2:6a8fbb08d519 837 for(unsigned int i=0; i<c; i++) {
GuiTwo 2:6a8fbb08d519 838 index += FontRead(Font+FONT_WIDTH_TABLE+i);
GuiTwo 2:6a8fbb08d519 839 }
GuiTwo 2:6a8fbb08d519 840 index = index*bytes+charCount+FONT_WIDTH_TABLE;
GuiTwo 2:6a8fbb08d519 841 width = FontRead(Font+FONT_WIDTH_TABLE+c);
GuiTwo 0:f2f71eab6aef 842 }
GuiTwo 0:f2f71eab6aef 843
GuiTwo 0:f2f71eab6aef 844 // last but not least, draw the character
GuiTwo 0:f2f71eab6aef 845 for(unsigned int i=0; i<bytes; i++) {
GuiTwo 0:f2f71eab6aef 846 unsigned int page = i*width;
GuiTwo 0:f2f71eab6aef 847 for(unsigned int j=0; j<width; j++) {
GuiTwo 0:f2f71eab6aef 848 unsigned int data = FontRead(Font+index+page+j);
GuiTwo 2:6a8fbb08d519 849
GuiTwo 0:f2f71eab6aef 850 if(height > 8 && height < (i+1)*8) {
GuiTwo 0:f2f71eab6aef 851 data >>= (i+1)*8-height;
GuiTwo 0:f2f71eab6aef 852 }
GuiTwo 2:6a8fbb08d519 853
GuiTwo 0:f2f71eab6aef 854 WriteData(data);
GuiTwo 0:f2f71eab6aef 855
GuiTwo 0:f2f71eab6aef 856 }
GuiTwo 0:f2f71eab6aef 857 // 1px gap between chars
GuiTwo 0:f2f71eab6aef 858 WriteData(0x00);
GuiTwo 1:8bc625378e38 859 GotoXY(x,Coord.y+8);
GuiTwo 2:6a8fbb08d519 860
GuiTwo 0:f2f71eab6aef 861 }
GuiTwo 0:f2f71eab6aef 862 GotoXY(x+width+1, y);
GuiTwo 2:6a8fbb08d519 863
GuiTwo 0:f2f71eab6aef 864
GuiTwo 0:f2f71eab6aef 865 return 0;
GuiTwo 0:f2f71eab6aef 866 }
GuiTwo 0:f2f71eab6aef 867
GuiTwo 2:6a8fbb08d519 868 void KS0108::PrintString(char* str)
GuiTwo 2:6a8fbb08d519 869 {
GuiTwo 0:f2f71eab6aef 870 int x = Coord.x;
GuiTwo 0:f2f71eab6aef 871 while(*str != 0) {
GuiTwo 0:f2f71eab6aef 872 if(*str == '\n') {
GuiTwo 0:f2f71eab6aef 873 GotoXY(x, Coord.y+ FontRead(Font+FONT_HEIGHT));
GuiTwo 0:f2f71eab6aef 874 } else {
GuiTwo 0:f2f71eab6aef 875 PrintChar(*str);
GuiTwo 0:f2f71eab6aef 876 }
GuiTwo 0:f2f71eab6aef 877 str++;
GuiTwo 0:f2f71eab6aef 878 }
GuiTwo 0:f2f71eab6aef 879 }
GuiTwo 0:f2f71eab6aef 880
GuiTwo 2:6a8fbb08d519 881 void KS0108::PrintNumber(long n)
GuiTwo 2:6a8fbb08d519 882 {
GuiTwo 2:6a8fbb08d519 883 char buf[10]; // prints up to 10 digits
GuiTwo 2:6a8fbb08d519 884 char i=0;
GuiTwo 2:6a8fbb08d519 885 if(n==0)
GuiTwo 2:6a8fbb08d519 886 PrintChar('0');
GuiTwo 2:6a8fbb08d519 887 else {
GuiTwo 2:6a8fbb08d519 888 if(n < 0) {
GuiTwo 2:6a8fbb08d519 889 PrintChar('-');
GuiTwo 2:6a8fbb08d519 890 n = -n;
GuiTwo 2:6a8fbb08d519 891 }
GuiTwo 2:6a8fbb08d519 892 while(n>0 && i <= 10) {
GuiTwo 2:6a8fbb08d519 893 buf[i++] = n % 10; // n % base
GuiTwo 2:6a8fbb08d519 894 n /= 10; // n/= base
GuiTwo 2:6a8fbb08d519 895 }
GuiTwo 2:6a8fbb08d519 896 for(; i >0; i--)
GuiTwo 2:6a8fbb08d519 897 PrintChar((char) (buf[i-1] < 10 ? '0' + buf[i-1] : 'A' + buf[i-1] - 10));
GuiTwo 2:6a8fbb08d519 898 }
GuiTwo 2:6a8fbb08d519 899 }
GuiTwo 2:6a8fbb08d519 900
GuiTwo 2:6a8fbb08d519 901 bool KS0108::writeLine (const char *line, uint8_t row)
GuiTwo 2:6a8fbb08d519 902 {
GuiTwo 2:6a8fbb08d519 903 //"SystemFont5x7.h"
GuiTwo 2:6a8fbb08d519 904 // |y _x
GuiTwo 2:6a8fbb08d519 905 int x = Coord.x;
GuiTwo 2:6a8fbb08d519 906
GuiTwo 2:6a8fbb08d519 907 Font = System5x7;
GuiTwo 2:6a8fbb08d519 908
GuiTwo 2:6a8fbb08d519 909 FontColor = BLACK;
GuiTwo 2:6a8fbb08d519 910
GuiTwo 2:6a8fbb08d519 911 // LCD.SelectFont(System5x7,BLACK,ReadData);
GuiTwo 2:6a8fbb08d519 912
GuiTwo 2:6a8fbb08d519 913
GuiTwo 2:6a8fbb08d519 914
GuiTwo 2:6a8fbb08d519 915
GuiTwo 2:6a8fbb08d519 916 GotoXY(x+10, Coord.y+7);
GuiTwo 2:6a8fbb08d519 917 PrintString(const_cast<char *> (line) );
GuiTwo 2:6a8fbb08d519 918 return 1;
GuiTwo 0:f2f71eab6aef 919 }
GuiTwo 0:f2f71eab6aef 920
GuiTwo 0:f2f71eab6aef 921
GuiTwo 0:f2f71eab6aef 922
GuiTwo 0:f2f71eab6aef 923