Fork of KS0108 by Ryan Tseng

Committer:
nhahn
Date:
Mon Apr 14 18:36:58 2014 +0000
Revision:
2:d2d7778bbbf2
Parent:
1:741ceb02f8e2
added some fonts

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 }
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