Dependents:   Display bigthingRec bigthingRecfinal

Committer:
kagelump
Date:
Mon Jun 18 16:46:41 2012 +0000
Revision:
0:14a7c22dfbe8

        

Who changed what in which revision?

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