Steven Rhodes / Mbed 2 deprecated DisplayTest

Dependencies:   mbed

Committer:
stvnrhodes
Date:
Thu Feb 02 03:20:45 2012 +0000
Revision:
0:730586f57df2

        

Who changed what in which revision?

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