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