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

Dependencies:   BusEnums

Dependents:   Menu

Committer:
GuiTwo
Date:
Mon Sep 10 16:33:35 2012 +0000
Revision:
4:eeaa5069be9c
Parent:
2:6a8fbb08d519
Classe fille de MendedDisplay ( Classe abstraite)

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