Added custom fonts. Added triangle drawing function

Dependents:   sc100016x4lcd REVO_Updated_Steering Driving_game Arkanoid_v1 ... more

Committer:
DimiterK
Date:
Fri Jan 28 01:08:45 2011 +0000
Revision:
2:03d27b3fce6e
Parent:
1:a368f2688222
Child:
3:366a6b7d6259
Added support for drawing a custom size image array.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
DimiterK 1:a368f2688222 1 /*************************************************************************
DimiterK 1:a368f2688222 2 Copyright (c) 2010 Dimiter Kentri
DimiterK 1:a368f2688222 3
DimiterK 1:a368f2688222 4 Permission is hereby granted, free of charge, to any person obtaining a copy
DimiterK 1:a368f2688222 5 of this software and associated documentation files (the "Software"), to deal
DimiterK 1:a368f2688222 6 in the Software without restriction, including without limitation the rights
DimiterK 1:a368f2688222 7 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
DimiterK 1:a368f2688222 8 copies of the Software, and to permit persons to whom the Software is
DimiterK 1:a368f2688222 9 furnished to do so, subject to the following conditions:
DimiterK 1:a368f2688222 10
DimiterK 1:a368f2688222 11 The above copyright notice and this permission notice shall be included in
DimiterK 1:a368f2688222 12 all copies or substantial portions of the Software.
DimiterK 0:135b9a0a816e 13
DimiterK 1:a368f2688222 14 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
DimiterK 1:a368f2688222 15 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
DimiterK 1:a368f2688222 16 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
DimiterK 1:a368f2688222 17 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
DimiterK 1:a368f2688222 18 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
DimiterK 1:a368f2688222 19 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
DimiterK 1:a368f2688222 20 THE SOFTWARE.
DimiterK 1:a368f2688222 21 *******************************************************************************/
DimiterK 1:a368f2688222 22
DimiterK 1:a368f2688222 23 #include "KS0108.h"
DimiterK 1:a368f2688222 24
DimiterK 1:a368f2688222 25
DimiterK 0:135b9a0a816e 26 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)
DimiterK 0:135b9a0a816e 27 : DB(DB0,DB1,DB2,DB3,DB4,DB5,DB6,DB7),RST (_RST),DI(_DI), RW(_RW), E(_E), CS2(_CS2), CS1(_CS1) {
DimiterK 0:135b9a0a816e 28
DimiterK 0:135b9a0a816e 29 DB.output();
DimiterK 0:135b9a0a816e 30 CS1.output(); CS2.output();
DimiterK 0:135b9a0a816e 31 RST.write(0);
DimiterK 0:135b9a0a816e 32 wait_us(10);
DimiterK 0:135b9a0a816e 33 RST.write(1); //reset screen
DimiterK 0:135b9a0a816e 34 E.write(0);
DimiterK 0:135b9a0a816e 35 ClearScreen(); //clear display
DimiterK 0:135b9a0a816e 36 WriteInstruction(LCD_ON, BOTH); //turn on lcd
DimiterK 0:135b9a0a816e 37 }
DimiterK 0:135b9a0a816e 38
DimiterK 0:135b9a0a816e 39
DimiterK 1:a368f2688222 40
DimiterK 0:135b9a0a816e 41 void KS0108::WriteInstruction(unsigned int Command,unsigned int side){
DimiterK 0:135b9a0a816e 42 E.write(0);
DimiterK 0:135b9a0a816e 43 DI.write(0);
DimiterK 0:135b9a0a816e 44 RW.write(0);
DimiterK 0:135b9a0a816e 45
DimiterK 2:03d27b3fce6e 46 SelectSide(side); //select controller
DimiterK 0:135b9a0a816e 47
DimiterK 0:135b9a0a816e 48 wait(0.0000003); // 300ns
DimiterK 0:135b9a0a816e 49 E.write(1);
DimiterK 0:135b9a0a816e 50 DB.output();
DimiterK 0:135b9a0a816e 51 DB.write(Command);
DimiterK 0:135b9a0a816e 52 wait(0.0000001);
DimiterK 0:135b9a0a816e 53 E.write(0);
DimiterK 0:135b9a0a816e 54 }
DimiterK 0:135b9a0a816e 55
DimiterK 1:a368f2688222 56
DimiterK 0:135b9a0a816e 57 void KS0108::WriteData(unsigned int data,unsigned char side){
DimiterK 2:03d27b3fce6e 58 E.write(0);
DimiterK 0:135b9a0a816e 59 DI.write(1);
DimiterK 0:135b9a0a816e 60 RW.write(0);
DimiterK 0:135b9a0a816e 61
DimiterK 0:135b9a0a816e 62 SelectSide(side);
DimiterK 0:135b9a0a816e 63
DimiterK 0:135b9a0a816e 64 wait(0.0000003); // 300ns
DimiterK 0:135b9a0a816e 65 E = 1;
DimiterK 0:135b9a0a816e 66 DB.output();
DimiterK 0:135b9a0a816e 67 DB.write(data);
DimiterK 0:135b9a0a816e 68 wait(0.0000001);
DimiterK 0:135b9a0a816e 69 E = 0;
DimiterK 0:135b9a0a816e 70 }
DimiterK 0:135b9a0a816e 71
DimiterK 1:a368f2688222 72
DimiterK 0:135b9a0a816e 73 void KS0108::WriteDataColPag(unsigned int page, unsigned int col, unsigned int data){
DimiterK 0:135b9a0a816e 74
DimiterK 0:135b9a0a816e 75 SelectSide(NONE);
DimiterK 0:135b9a0a816e 76 col = col%SCREEN_WIDTH;
DimiterK 0:135b9a0a816e 77 page = page%8;
DimiterK 0:135b9a0a816e 78
DimiterK 0:135b9a0a816e 79 if(col<(SCREEN_WIDTH/2)){
DimiterK 0:135b9a0a816e 80 SelectSide(LEFT);
DimiterK 0:135b9a0a816e 81 WriteInstruction(LCD_SET_PAGE|page,LEFT);
DimiterK 0:135b9a0a816e 82 WriteInstruction(LCD_SET_ADD|col,LEFT); //set page and column position
DimiterK 0:135b9a0a816e 83 WriteData(data,LEFT); //output data to D0-D7
DimiterK 0:135b9a0a816e 84 }else{
DimiterK 0:135b9a0a816e 85
DimiterK 0:135b9a0a816e 86 SelectSide(RIGHT);
DimiterK 0:135b9a0a816e 87 col -= (SCREEN_WIDTH/2);
DimiterK 0:135b9a0a816e 88 WriteInstruction(LCD_SET_PAGE|page,RIGHT);
DimiterK 0:135b9a0a816e 89 WriteInstruction(LCD_SET_ADD|col,RIGHT); //set page and column position
DimiterK 0:135b9a0a816e 90 WriteData(data,RIGHT); //output data to D0-D7
DimiterK 0:135b9a0a816e 91 }
DimiterK 0:135b9a0a816e 92
DimiterK 0:135b9a0a816e 93 SelectSide(NONE);
DimiterK 0:135b9a0a816e 94 }
DimiterK 0:135b9a0a816e 95
DimiterK 1:a368f2688222 96
DimiterK 0:135b9a0a816e 97 unsigned int KS0108::ReadData(){
DimiterK 0:135b9a0a816e 98 unsigned int data;
DimiterK 0:135b9a0a816e 99 DB.input();
DimiterK 0:135b9a0a816e 100 DI.write(1);
DimiterK 0:135b9a0a816e 101
DimiterK 0:135b9a0a816e 102 RW.write(1);
DimiterK 0:135b9a0a816e 103 E.write(1);
DimiterK 0:135b9a0a816e 104 wait(0.00000045);
DimiterK 0:135b9a0a816e 105
DimiterK 0:135b9a0a816e 106 data = DB.read();
DimiterK 0:135b9a0a816e 107 wait(0.0000001);
DimiterK 0:135b9a0a816e 108 E.write(0);
DimiterK 0:135b9a0a816e 109 DB.output();
DimiterK 0:135b9a0a816e 110
DimiterK 0:135b9a0a816e 111 return data;
DimiterK 0:135b9a0a816e 112 }
DimiterK 0:135b9a0a816e 113
DimiterK 1:a368f2688222 114
DimiterK 0:135b9a0a816e 115 unsigned int KS0108::ReadStatus(){
DimiterK 0:135b9a0a816e 116 unsigned int status;
DimiterK 0:135b9a0a816e 117 DB.input();
DimiterK 0:135b9a0a816e 118
DimiterK 0:135b9a0a816e 119 DI.write(0);
DimiterK 0:135b9a0a816e 120
DimiterK 0:135b9a0a816e 121 RW.write(1);
DimiterK 0:135b9a0a816e 122 E.write(1);
DimiterK 0:135b9a0a816e 123 wait(0.00000045);
DimiterK 0:135b9a0a816e 124
DimiterK 0:135b9a0a816e 125 status = DB.read();
DimiterK 0:135b9a0a816e 126 E.write(0);
DimiterK 0:135b9a0a816e 127 wait(0.0000001);
DimiterK 0:135b9a0a816e 128 DB.output();
DimiterK 0:135b9a0a816e 129
DimiterK 0:135b9a0a816e 130 return status;
DimiterK 0:135b9a0a816e 131 }
DimiterK 0:135b9a0a816e 132
DimiterK 1:a368f2688222 133
DimiterK 0:135b9a0a816e 134 void KS0108::SelectSide(unsigned char side){
DimiterK 0:135b9a0a816e 135 if(side==LEFT)
DimiterK 0:135b9a0a816e 136 {CS1.write(1);CS2.write(0);}
DimiterK 0:135b9a0a816e 137 else if(side==RIGHT)
DimiterK 0:135b9a0a816e 138 {CS1.write(0);CS2.write(1);}
DimiterK 0:135b9a0a816e 139 else if (side==BOTH)
DimiterK 0:135b9a0a816e 140 {CS1.write(1);CS2.write(1);}
DimiterK 0:135b9a0a816e 141 else if (side==NONE)
DimiterK 0:135b9a0a816e 142 {CS1.write(0);CS2.write(0);}
DimiterK 0:135b9a0a816e 143 }
DimiterK 0:135b9a0a816e 144
DimiterK 1:a368f2688222 145
DimiterK 0:135b9a0a816e 146 void KS0108::ClearScreen(){
DimiterK 0:135b9a0a816e 147 for (int col=0;col<128;col++) {
DimiterK 0:135b9a0a816e 148 for (int page=0;page<8;page++)
DimiterK 0:135b9a0a816e 149 {
DimiterK 0:135b9a0a816e 150 WriteDataColPag(page,col,WHITE);
DimiterK 0:135b9a0a816e 151 }
DimiterK 0:135b9a0a816e 152 }
DimiterK 0:135b9a0a816e 153 }
DimiterK 0:135b9a0a816e 154
DimiterK 0:135b9a0a816e 155
DimiterK 0:135b9a0a816e 156 /*******************************************************************************************/
DimiterK 0:135b9a0a816e 157
DimiterK 1:a368f2688222 158
DimiterK 0:135b9a0a816e 159 void KS0108::SetPixel(unsigned int x, unsigned int y, unsigned int color){
DimiterK 0:135b9a0a816e 160
DimiterK 0:135b9a0a816e 161 unsigned int position;
DimiterK 0:135b9a0a816e 162
DimiterK 0:135b9a0a816e 163 SelectSide(NONE);
DimiterK 0:135b9a0a816e 164 WriteInstruction(LCD_SET_ADD,NONE);
DimiterK 0:135b9a0a816e 165
DimiterK 0:135b9a0a816e 166 if(x>=64){
DimiterK 0:135b9a0a816e 167 WriteInstruction(LCD_SET_PAGE|(y/8),RIGHT);
DimiterK 0:135b9a0a816e 168 WriteInstruction(LCD_SET_ADD|x,RIGHT);
DimiterK 0:135b9a0a816e 169 position = ReadData(); //dummy read
DimiterK 0:135b9a0a816e 170 position = ReadData(); //actual read
DimiterK 0:135b9a0a816e 171 WriteInstruction(LCD_SET_ADD|x,RIGHT);
DimiterK 0:135b9a0a816e 172 if(color==WHITE)
DimiterK 0:135b9a0a816e 173 WriteData(position&(~(1<<(y%8))),RIGHT); // draw a white pixel
DimiterK 0:135b9a0a816e 174 else
DimiterK 0:135b9a0a816e 175 WriteData(position|(1<<(y%8)),RIGHT);
DimiterK 0:135b9a0a816e 176 wait_us(450);
DimiterK 0:135b9a0a816e 177 }else{
DimiterK 0:135b9a0a816e 178 WriteInstruction(LCD_SET_PAGE|(y/8),LEFT);
DimiterK 0:135b9a0a816e 179 WriteInstruction(LCD_SET_ADD|x,LEFT);
DimiterK 0:135b9a0a816e 180 position = ReadData(); //dummy read
DimiterK 0:135b9a0a816e 181 position = ReadData(); //actual read
DimiterK 0:135b9a0a816e 182 WriteInstruction(LCD_SET_ADD|x,LEFT);
DimiterK 0:135b9a0a816e 183 if(color==WHITE)
DimiterK 0:135b9a0a816e 184 WriteData(position&(~(1<<(y%8))),LEFT);
DimiterK 0:135b9a0a816e 185 else
DimiterK 0:135b9a0a816e 186 WriteData(position|(1<<(y%8)),LEFT);
DimiterK 0:135b9a0a816e 187
DimiterK 0:135b9a0a816e 188 wait_us(450);
DimiterK 0:135b9a0a816e 189
DimiterK 0:135b9a0a816e 190 }
DimiterK 0:135b9a0a816e 191
DimiterK 0:135b9a0a816e 192 }
DimiterK 0:135b9a0a816e 193
DimiterK 0:135b9a0a816e 194
DimiterK 1:a368f2688222 195
DimiterK 0:135b9a0a816e 196 void KS0108::FullRectangle(unsigned int Xaxis1, unsigned int Yaxis1, unsigned int Xaxis2 ,unsigned int Yaxis2,unsigned int color){
DimiterK 0:135b9a0a816e 197
DimiterK 0:135b9a0a816e 198 for(unsigned int i=Xaxis1;i<=Xaxis2;i++){
DimiterK 0:135b9a0a816e 199 for(unsigned int j=Yaxis1;j<=Yaxis2;j++){
DimiterK 0:135b9a0a816e 200 SetPixel(i,j,color);
DimiterK 0:135b9a0a816e 201 }
DimiterK 0:135b9a0a816e 202 }
DimiterK 0:135b9a0a816e 203 }
DimiterK 0:135b9a0a816e 204
DimiterK 1:a368f2688222 205
DimiterK 0:135b9a0a816e 206 void KS0108::EmptyRectangle(unsigned int Xaxis1,unsigned int Yaxis1, unsigned int Xaxis2,unsigned int Yaxis2,unsigned int color){
DimiterK 0:135b9a0a816e 207 unsigned int CurrentValue;
DimiterK 0:135b9a0a816e 208
DimiterK 0:135b9a0a816e 209 /* Draw the two horizontal lines */
DimiterK 0:135b9a0a816e 210 for (CurrentValue = 0; CurrentValue < Xaxis2 - Xaxis1+ 1; CurrentValue++)
DimiterK 0:135b9a0a816e 211 {
DimiterK 0:135b9a0a816e 212 SetPixel(Xaxis1 + CurrentValue, Yaxis1,color);
DimiterK 0:135b9a0a816e 213 SetPixel(Xaxis1 + CurrentValue, Yaxis2,color);
DimiterK 0:135b9a0a816e 214 }
DimiterK 0:135b9a0a816e 215
DimiterK 0:135b9a0a816e 216 /* draw the two vertical lines */
DimiterK 0:135b9a0a816e 217 for (CurrentValue = 0; CurrentValue < Yaxis2 - Yaxis1 + 1; CurrentValue++)
DimiterK 0:135b9a0a816e 218 {
DimiterK 0:135b9a0a816e 219 SetPixel(Xaxis1, Yaxis1 + CurrentValue,color);
DimiterK 0:135b9a0a816e 220 SetPixel(Xaxis2, Yaxis1 + CurrentValue,color);
DimiterK 0:135b9a0a816e 221 }
DimiterK 0:135b9a0a816e 222 }
DimiterK 0:135b9a0a816e 223
DimiterK 1:a368f2688222 224
DimiterK 0:135b9a0a816e 225 void KS0108::RoundRectangle(unsigned int x, unsigned int y, unsigned int width, unsigned int height, unsigned int radius, unsigned int color) {
DimiterK 0:135b9a0a816e 226 int tSwitch, x1 = 0, y1 = radius;
DimiterK 0:135b9a0a816e 227 tSwitch = 3 - 2 * radius;
DimiterK 0:135b9a0a816e 228
DimiterK 0:135b9a0a816e 229 while (x1 <= y1) {
DimiterK 0:135b9a0a816e 230 SetPixel(x+radius - x1, y+radius - y1, color);
DimiterK 0:135b9a0a816e 231 SetPixel(x+radius - y1, y+radius - x1, color);
DimiterK 0:135b9a0a816e 232
DimiterK 0:135b9a0a816e 233 SetPixel(x+width-radius + x1, y+radius - y1, color);
DimiterK 0:135b9a0a816e 234 SetPixel(x+width-radius + y1, y+radius - x1, color);
DimiterK 0:135b9a0a816e 235
DimiterK 0:135b9a0a816e 236 SetPixel(x+width-radius + x1, y+height-radius + y1, color);
DimiterK 0:135b9a0a816e 237 SetPixel(x+width-radius + y1, y+height-radius + x1, color);
DimiterK 0:135b9a0a816e 238
DimiterK 0:135b9a0a816e 239 SetPixel(x+radius - x1, y+height-radius + y1, color);
DimiterK 0:135b9a0a816e 240 SetPixel(x+radius - y1, y+height-radius + x1, color);
DimiterK 0:135b9a0a816e 241
DimiterK 0:135b9a0a816e 242 if (tSwitch < 0) {
DimiterK 0:135b9a0a816e 243 tSwitch += (4 * x1 + 6);
DimiterK 0:135b9a0a816e 244 } else {
DimiterK 0:135b9a0a816e 245 tSwitch += (4 * (x1 - y1) + 10);
DimiterK 0:135b9a0a816e 246 y1--;
DimiterK 0:135b9a0a816e 247 }
DimiterK 0:135b9a0a816e 248 x1++;
DimiterK 0:135b9a0a816e 249 }
DimiterK 0:135b9a0a816e 250
DimiterK 0:135b9a0a816e 251 HLineShort(x+radius,y, width-(2*radius), color); // top
DimiterK 0:135b9a0a816e 252 HLineShort(x+radius,y+height, width-(2*radius), color); // bottom
DimiterK 0:135b9a0a816e 253 VLineShort(x,y+radius,height-(2*radius), color); // left
DimiterK 0:135b9a0a816e 254 VLineShort(x+width, y+radius,height-(2*radius), color); // right
DimiterK 0:135b9a0a816e 255 }
DimiterK 0:135b9a0a816e 256
DimiterK 1:a368f2688222 257
DimiterK 0:135b9a0a816e 258 void KS0108::HLine(unsigned int Xaxis1, unsigned int Xaxis2 ,unsigned int Yaxis,unsigned int color){
DimiterK 0:135b9a0a816e 259 FullRectangle(Xaxis1,Yaxis,Xaxis2,Yaxis,color);
DimiterK 0:135b9a0a816e 260
DimiterK 0:135b9a0a816e 261 }
DimiterK 0:135b9a0a816e 262
DimiterK 1:a368f2688222 263
DimiterK 0:135b9a0a816e 264 void KS0108::HLineShort(unsigned int Xaxis, unsigned int Yaxis,unsigned int width ,unsigned int color){
DimiterK 0:135b9a0a816e 265 FullRectangle(Xaxis,Yaxis,Xaxis+width,Yaxis,color);
DimiterK 0:135b9a0a816e 266
DimiterK 0:135b9a0a816e 267 }
DimiterK 0:135b9a0a816e 268
DimiterK 1:a368f2688222 269
DimiterK 0:135b9a0a816e 270 void KS0108::VLine(unsigned int Xaxis, unsigned int Yaxis1 ,unsigned int Yaxis2,unsigned int color){
DimiterK 0:135b9a0a816e 271 FullRectangle(Xaxis,Yaxis1,Xaxis,Yaxis2,color);
DimiterK 0:135b9a0a816e 272 }
DimiterK 0:135b9a0a816e 273
DimiterK 1:a368f2688222 274
DimiterK 0:135b9a0a816e 275 void KS0108::VLineShort(unsigned int Xaxis,unsigned int Yaxis, unsigned int height ,unsigned int color){
DimiterK 0:135b9a0a816e 276 FullRectangle(Xaxis,Yaxis,Xaxis,Yaxis+height,color);
DimiterK 0:135b9a0a816e 277
DimiterK 0:135b9a0a816e 278 }
DimiterK 0:135b9a0a816e 279
DimiterK 1:a368f2688222 280
DimiterK 0:135b9a0a816e 281 void KS0108::DegreeLine(unsigned int x, int y,unsigned int degree,unsigned int inner_radius,unsigned int outer_radius, unsigned int color){
DimiterK 0:135b9a0a816e 282 int fx,fy,tx,ty;
DimiterK 0:135b9a0a816e 283 fx = x + dfloor(inner_radius * sin(degree * 3.14 / 180));
DimiterK 0:135b9a0a816e 284 fy = y - dfloor(inner_radius * cos(degree * 3.14 / 180));
DimiterK 0:135b9a0a816e 285 tx = x + dfloor(outer_radius * sin(degree * 3.14 / 180));
DimiterK 0:135b9a0a816e 286 ty = y - dfloor(outer_radius * cos(degree * 3.14 / 180));
DimiterK 0:135b9a0a816e 287 SlantyLine(fx,fy,tx,ty,color);
DimiterK 0:135b9a0a816e 288 }
DimiterK 0:135b9a0a816e 289
DimiterK 1:a368f2688222 290
DimiterK 0:135b9a0a816e 291 double KS0108::dfloor( double value ) {
DimiterK 0:135b9a0a816e 292
DimiterK 0:135b9a0a816e 293 if (value < 0.0)
DimiterK 0:135b9a0a816e 294 return ceil( value );
DimiterK 0:135b9a0a816e 295 else
DimiterK 0:135b9a0a816e 296 return floor( value );
DimiterK 0:135b9a0a816e 297
DimiterK 0:135b9a0a816e 298 }
DimiterK 0:135b9a0a816e 299
DimiterK 1:a368f2688222 300
DimiterK 0:135b9a0a816e 301 void KS0108::SlantyLine(unsigned int lX1, unsigned int lY1, unsigned int lX2,unsigned int lY2,unsigned int color){
DimiterK 0:135b9a0a816e 302 long lError, lDeltaX, lDeltaY, lYStep, bSteep;
DimiterK 0:135b9a0a816e 303
DimiterK 0:135b9a0a816e 304 // A steep line has a bigger ordinate.
DimiterK 0:135b9a0a816e 305
DimiterK 0:135b9a0a816e 306 if(((lY2 > lY1) ? (lY2 - lY1) : (lY1 - lY2)) > ((lX2 > lX1) ? (lX2 - lX1) : (lX1 - lX2))){
DimiterK 0:135b9a0a816e 307 bSteep = 1;
DimiterK 0:135b9a0a816e 308 }else {
DimiterK 0:135b9a0a816e 309 bSteep = 0;
DimiterK 0:135b9a0a816e 310 }
DimiterK 0:135b9a0a816e 311
DimiterK 0:135b9a0a816e 312 // If line is steep, swap the X and Y coordinates.
DimiterK 0:135b9a0a816e 313 if(bSteep){
DimiterK 0:135b9a0a816e 314 lError = lX1;
DimiterK 0:135b9a0a816e 315 lX1 = lY1;
DimiterK 0:135b9a0a816e 316 lY1 = lError;
DimiterK 0:135b9a0a816e 317 lError = lX2;
DimiterK 0:135b9a0a816e 318 lX2 = lY2;
DimiterK 0:135b9a0a816e 319 lY2 = lError;
DimiterK 0:135b9a0a816e 320 }
DimiterK 0:135b9a0a816e 321
DimiterK 0:135b9a0a816e 322
DimiterK 0:135b9a0a816e 323 // If the starting X coordinate is larger than the ending X coordinate,
DimiterK 2:03d27b3fce6e 324 // swap the start and end coordinates.
DimiterK 0:135b9a0a816e 325 if(lX1 > lX2){
DimiterK 0:135b9a0a816e 326 lError = lX1;
DimiterK 0:135b9a0a816e 327 lX1 = lX2;
DimiterK 0:135b9a0a816e 328 lX2 = lError;
DimiterK 0:135b9a0a816e 329 lError = lY1;
DimiterK 0:135b9a0a816e 330 lY1 = lY2;
DimiterK 0:135b9a0a816e 331 lY2 = lError;
DimiterK 0:135b9a0a816e 332 }
DimiterK 0:135b9a0a816e 333
DimiterK 2:03d27b3fce6e 334 // Compute the difference between the start and end coordinates.
DimiterK 0:135b9a0a816e 335 lDeltaX = lX2 - lX1;
DimiterK 0:135b9a0a816e 336 lDeltaY = (lY2 > lY1) ? (lY2 - lY1) : (lY1 - lY2);
DimiterK 0:135b9a0a816e 337
DimiterK 0:135b9a0a816e 338 lError = -lDeltaX / 2; // Initialize the error term to negative half the X delta.
DimiterK 0:135b9a0a816e 339
DimiterK 0:135b9a0a816e 340 if(lY1 < lY2){ // Determine the direction to step in the Y axis when required.
DimiterK 0:135b9a0a816e 341 lYStep = 1;
DimiterK 0:135b9a0a816e 342 }else{
DimiterK 0:135b9a0a816e 343 lYStep = -1;
DimiterK 0:135b9a0a816e 344 }
DimiterK 0:135b9a0a816e 345
DimiterK 0:135b9a0a816e 346 for(; lX1 <= lX2; lX1++){ // Loop through all the points along the X axis of the line.
DimiterK 0:135b9a0a816e 347
DimiterK 0:135b9a0a816e 348 // See if this is a steep line.
DimiterK 0:135b9a0a816e 349
DimiterK 0:135b9a0a816e 350 if(bSteep){
DimiterK 0:135b9a0a816e 351
DimiterK 0:135b9a0a816e 352 // Plot this point of the line, swapping the X and Y coordinates.
DimiterK 0:135b9a0a816e 353
DimiterK 0:135b9a0a816e 354 SetPixel(lY1, lX1,color);
DimiterK 0:135b9a0a816e 355 }
DimiterK 0:135b9a0a816e 356 else { // Plot this point of the line, using the coordinates as is.
DimiterK 0:135b9a0a816e 357 SetPixel(lX1, lY1,color);
DimiterK 0:135b9a0a816e 358 }
DimiterK 0:135b9a0a816e 359
DimiterK 0:135b9a0a816e 360 // Increment the error term by the Y delta.
DimiterK 0:135b9a0a816e 361
DimiterK 0:135b9a0a816e 362 lError += lDeltaY;
DimiterK 0:135b9a0a816e 363
DimiterK 0:135b9a0a816e 364 if(lError > 0){ // See if the error term is now greater than zero.
DimiterK 0:135b9a0a816e 365
DimiterK 0:135b9a0a816e 366 lY1 += lYStep; // Take a step in the Y axis.
DimiterK 0:135b9a0a816e 367
DimiterK 0:135b9a0a816e 368 lError -= lDeltaX; // Decrement the error term by the X delta.
DimiterK 0:135b9a0a816e 369 }
DimiterK 0:135b9a0a816e 370 }
DimiterK 0:135b9a0a816e 371 }
DimiterK 0:135b9a0a816e 372
DimiterK 0:135b9a0a816e 373
DimiterK 1:a368f2688222 374
DimiterK 0:135b9a0a816e 375 void KS0108::Line(unsigned int x1, unsigned int y1, unsigned int x2, unsigned int y2, unsigned int color){
DimiterK 0:135b9a0a816e 376 unsigned int deltax, deltay, x,y, steep;
DimiterK 0:135b9a0a816e 377 int lerror, ystep;
DimiterK 0:135b9a0a816e 378
DimiterK 0:135b9a0a816e 379 steep = absDiff(y1,y2) > absDiff(x1,x2); //check slope
DimiterK 0:135b9a0a816e 380
DimiterK 0:135b9a0a816e 381 if ( steep ){
DimiterK 0:135b9a0a816e 382 swap(x1, y1);
DimiterK 0:135b9a0a816e 383 swap(x2, y2);
DimiterK 0:135b9a0a816e 384 }
DimiterK 0:135b9a0a816e 385
DimiterK 0:135b9a0a816e 386 if (x1 > x2){
DimiterK 0:135b9a0a816e 387 swap(x1, x2);
DimiterK 0:135b9a0a816e 388 swap(y1, y2);
DimiterK 0:135b9a0a816e 389 }
DimiterK 0:135b9a0a816e 390
DimiterK 0:135b9a0a816e 391 deltax = x2 - x1;
DimiterK 0:135b9a0a816e 392 deltay = absDiff(y2,y1);
DimiterK 0:135b9a0a816e 393 lerror = deltax / 2;
DimiterK 0:135b9a0a816e 394 y = y1;
DimiterK 0:135b9a0a816e 395 if(y1 < y2) ystep = 1; else ystep = -1;
DimiterK 0:135b9a0a816e 396
DimiterK 0:135b9a0a816e 397 for(x = x1; x <= x2; x++){
DimiterK 0:135b9a0a816e 398 if (steep) SetPixel(y,x, color); else SetPixel(x,y, color);
DimiterK 0:135b9a0a816e 399 lerror -= deltay;
DimiterK 0:135b9a0a816e 400 if (lerror < 0){
DimiterK 0:135b9a0a816e 401 y = y + ystep;
DimiterK 0:135b9a0a816e 402 lerror += deltax;
DimiterK 0:135b9a0a816e 403 }
DimiterK 0:135b9a0a816e 404 }
DimiterK 0:135b9a0a816e 405 }
DimiterK 0:135b9a0a816e 406
DimiterK 1:a368f2688222 407
DimiterK 0:135b9a0a816e 408 void KS0108::EmptyCircle(unsigned int CenterX, unsigned int CenterY, unsigned int Radius,unsigned int color){
DimiterK 0:135b9a0a816e 409 unsigned int y=0, x=0, d = 0;
DimiterK 0:135b9a0a816e 410 int part;
DimiterK 0:135b9a0a816e 411 d = CenterY - CenterX;
DimiterK 0:135b9a0a816e 412 y = Radius;
DimiterK 0:135b9a0a816e 413 part = 3 - 2 * Radius;
DimiterK 0:135b9a0a816e 414
DimiterK 0:135b9a0a816e 415 while (x <= y) {
DimiterK 0:135b9a0a816e 416 SetPixel(CenterX + x, CenterY + y,color);
DimiterK 0:135b9a0a816e 417 SetPixel(CenterX + x, CenterY - y,color);
DimiterK 0:135b9a0a816e 418 SetPixel(CenterX - x, CenterY + y,color);
DimiterK 0:135b9a0a816e 419 SetPixel(CenterX - x, CenterY - y,color);
DimiterK 0:135b9a0a816e 420 SetPixel(CenterY + y - d, CenterY + x,color);
DimiterK 0:135b9a0a816e 421 SetPixel(CenterY + y - d, CenterY - x,color);
DimiterK 0:135b9a0a816e 422 SetPixel(CenterY - y - d, CenterY + x,color);
DimiterK 0:135b9a0a816e 423 SetPixel(CenterY - y - d, CenterY - x,color);
DimiterK 0:135b9a0a816e 424
DimiterK 0:135b9a0a816e 425 if (part < 0) part += (4 * x + 6);
DimiterK 0:135b9a0a816e 426 else {
DimiterK 0:135b9a0a816e 427 part += (4 * (x - y) + 10);
DimiterK 0:135b9a0a816e 428 y--;
DimiterK 0:135b9a0a816e 429 }
DimiterK 0:135b9a0a816e 430 x++;
DimiterK 0:135b9a0a816e 431 }
DimiterK 0:135b9a0a816e 432
DimiterK 0:135b9a0a816e 433 }
DimiterK 0:135b9a0a816e 434
DimiterK 1:a368f2688222 435
DimiterK 0:135b9a0a816e 436 void KS0108::FullCircle(unsigned int CenterX, unsigned int CenterY, unsigned int Radius,unsigned int color){
DimiterK 0:135b9a0a816e 437
DimiterK 0:135b9a0a816e 438 int f = 1 - Radius;
DimiterK 0:135b9a0a816e 439 int ddF_x = 1;
DimiterK 0:135b9a0a816e 440 int ddF_y = 2 * Radius; //changed sign of -2
DimiterK 0:135b9a0a816e 441 unsigned int x = 0;
DimiterK 0:135b9a0a816e 442 unsigned int y = Radius;
DimiterK 0:135b9a0a816e 443
DimiterK 0:135b9a0a816e 444 //Fill in the center between the two halves
DimiterK 0:135b9a0a816e 445
DimiterK 0:135b9a0a816e 446 Line(CenterX, CenterY-Radius, CenterX, CenterY+Radius, color);
DimiterK 0:135b9a0a816e 447
DimiterK 0:135b9a0a816e 448 while(x < y){
DimiterK 0:135b9a0a816e 449 if(f >= 0)
DimiterK 0:135b9a0a816e 450 {
DimiterK 0:135b9a0a816e 451 y--;
DimiterK 0:135b9a0a816e 452 ddF_y += 2;
DimiterK 0:135b9a0a816e 453 f += ddF_y;
DimiterK 0:135b9a0a816e 454 }
DimiterK 0:135b9a0a816e 455 x++;
DimiterK 0:135b9a0a816e 456 ddF_x += 2;
DimiterK 0:135b9a0a816e 457 f += ddF_x;
DimiterK 0:135b9a0a816e 458
DimiterK 0:135b9a0a816e 459 /*
DimiterK 0:135b9a0a816e 460 * Now draw vertical lines between the points on the circle rather than
DimiterK 0:135b9a0a816e 461 * draw the points of the circle. This draws lines between the
DimiterK 0:135b9a0a816e 462 * perimeter points on the upper and lower quadrants of the 2 halves of the circle.
DimiterK 0:135b9a0a816e 463 */
DimiterK 0:135b9a0a816e 464
DimiterK 0:135b9a0a816e 465 Line(CenterX+x, CenterY+y, CenterX+x, CenterY-y, color);
DimiterK 0:135b9a0a816e 466 Line(CenterX-x, CenterY+y, CenterX-x, CenterY-y, color);
DimiterK 0:135b9a0a816e 467 Line(CenterX+y, CenterY+x, y+CenterX, CenterY-x, color);
DimiterK 0:135b9a0a816e 468 Line(CenterX-y, CenterY+x, CenterX-y, CenterY-x, color);
DimiterK 0:135b9a0a816e 469 }
DimiterK 0:135b9a0a816e 470 }
DimiterK 0:135b9a0a816e 471
DimiterK 0:135b9a0a816e 472
DimiterK 1:a368f2688222 473
DimiterK 0:135b9a0a816e 474 void KS0108::PlotEllipse(long CX, long CY, long XRadius,long YRadius, int color) {
DimiterK 0:135b9a0a816e 475
DimiterK 0:135b9a0a816e 476
DimiterK 0:135b9a0a816e 477 long X, Y;
DimiterK 0:135b9a0a816e 478 long XChange, YChange;
DimiterK 0:135b9a0a816e 479 long EllipseError;
DimiterK 0:135b9a0a816e 480 long TwoASquare,TwoBSquare;
DimiterK 0:135b9a0a816e 481 long StoppingX, StoppingY;
DimiterK 0:135b9a0a816e 482 TwoASquare = 2*XRadius*XRadius;
DimiterK 0:135b9a0a816e 483 TwoBSquare = 2*YRadius*YRadius;
DimiterK 0:135b9a0a816e 484 X = XRadius;
DimiterK 0:135b9a0a816e 485 Y = 0;
DimiterK 0:135b9a0a816e 486 XChange = YRadius*YRadius*(1-2*XRadius);
DimiterK 0:135b9a0a816e 487 YChange = XRadius*XRadius;
DimiterK 0:135b9a0a816e 488 EllipseError = 0;
DimiterK 0:135b9a0a816e 489 StoppingX = TwoBSquare*XRadius;
DimiterK 0:135b9a0a816e 490 StoppingY = 0;
DimiterK 0:135b9a0a816e 491
DimiterK 0:135b9a0a816e 492 while ( StoppingX >=StoppingY ) //first set of points,y'>-1
DimiterK 0:135b9a0a816e 493 {
DimiterK 0:135b9a0a816e 494 Plot4EllipsePoints(CX,CY,X,Y,color);
DimiterK 0:135b9a0a816e 495 Y++;
DimiterK 0:135b9a0a816e 496 StoppingY=StoppingY+ TwoASquare;
DimiterK 0:135b9a0a816e 497 EllipseError = EllipseError+ YChange;
DimiterK 0:135b9a0a816e 498 YChange=YChange+TwoASquare;
DimiterK 0:135b9a0a816e 499 if ((2*EllipseError + XChange) > 0 ) {
DimiterK 0:135b9a0a816e 500 X--;
DimiterK 0:135b9a0a816e 501 StoppingX=StoppingX- TwoBSquare;
DimiterK 0:135b9a0a816e 502 EllipseError=EllipseError+ XChange;
DimiterK 0:135b9a0a816e 503 XChange=XChange+TwoBSquare;
DimiterK 0:135b9a0a816e 504 }
DimiterK 0:135b9a0a816e 505 }
DimiterK 0:135b9a0a816e 506
DimiterK 0:135b9a0a816e 507 Y = YRadius;
DimiterK 0:135b9a0a816e 508 X = 0;
DimiterK 0:135b9a0a816e 509 YChange = XRadius*XRadius*(1-2*YRadius);
DimiterK 0:135b9a0a816e 510 XChange = YRadius*YRadius;
DimiterK 0:135b9a0a816e 511 EllipseError = 0;
DimiterK 0:135b9a0a816e 512 StoppingY = TwoASquare*YRadius;
DimiterK 0:135b9a0a816e 513 StoppingX = 0;
DimiterK 0:135b9a0a816e 514
DimiterK 0:135b9a0a816e 515 while ( StoppingY >=StoppingX ) //{2nd set of points, y'< -1}
DimiterK 0:135b9a0a816e 516 {
DimiterK 0:135b9a0a816e 517 Plot4EllipsePoints(CX,CY,X,Y,color);
DimiterK 0:135b9a0a816e 518 X++;
DimiterK 0:135b9a0a816e 519 StoppingX=StoppingX + TwoBSquare;
DimiterK 0:135b9a0a816e 520 EllipseError=EllipseError+ XChange;
DimiterK 0:135b9a0a816e 521 XChange=XChange+TwoBSquare;
DimiterK 0:135b9a0a816e 522 if ((2*EllipseError + YChange) > 0 ) {
DimiterK 0:135b9a0a816e 523 Y--;
DimiterK 0:135b9a0a816e 524 StoppingY=StoppingY- TwoASquare;
DimiterK 0:135b9a0a816e 525 EllipseError=EllipseError+ YChange;
DimiterK 0:135b9a0a816e 526 YChange=YChange+TwoASquare;
DimiterK 0:135b9a0a816e 527 }
DimiterK 0:135b9a0a816e 528 }
DimiterK 0:135b9a0a816e 529 }
DimiterK 0:135b9a0a816e 530
DimiterK 0:135b9a0a816e 531
DimiterK 1:a368f2688222 532
DimiterK 0:135b9a0a816e 533 void KS0108::Plot4EllipsePoints(long CX,long CY, long X, long Y, int color){
DimiterK 0:135b9a0a816e 534 SetPixel(CX+X, CY+Y, color); //{point in quadrant 1}
DimiterK 0:135b9a0a816e 535 SetPixel(CX-X, CY+Y, color); //{point in quadrant 2}
DimiterK 0:135b9a0a816e 536 SetPixel(CX-X, CY-Y, color); //{point in quadrant 3}
DimiterK 0:135b9a0a816e 537 SetPixel(CX+X, CY-Y, color); //{point in quadrant 4}
DimiterK 0:135b9a0a816e 538 }
DimiterK 0:135b9a0a816e 539
DimiterK 0:135b9a0a816e 540 /***********************************************************************************/
DimiterK 0:135b9a0a816e 541
DimiterK 1:a368f2688222 542
DimiterK 0:135b9a0a816e 543 void KS0108::FullScreenBMP (unsigned char *PictureData){
DimiterK 0:135b9a0a816e 544 unsigned int Page=0;
DimiterK 0:135b9a0a816e 545 unsigned int Column=0;
DimiterK 0:135b9a0a816e 546
DimiterK 0:135b9a0a816e 547 // Draw left side of the picture
DimiterK 0:135b9a0a816e 548 SelectSide(LEFT);
DimiterK 0:135b9a0a816e 549 for (Page = 0; Page < 8; Page++){ /* loop on the 8 pages */
DimiterK 0:135b9a0a816e 550 WriteInstruction(LCD_SET_PAGE | Page,LEFT); /* Set the page */
DimiterK 0:135b9a0a816e 551 for (Column = 0; Column < 64; Column++)
DimiterK 0:135b9a0a816e 552 WriteData(PictureData[(128*Page)+Column],LEFT);
DimiterK 0:135b9a0a816e 553 }
DimiterK 0:135b9a0a816e 554
DimiterK 0:135b9a0a816e 555 // Draw right side of the picture
DimiterK 0:135b9a0a816e 556 SelectSide(RIGHT);
DimiterK 0:135b9a0a816e 557 for (Page = 0; Page < 8; Page++){ /* loop on the 8 pages */
DimiterK 0:135b9a0a816e 558
DimiterK 0:135b9a0a816e 559 WriteInstruction(LCD_SET_PAGE| Page,RIGHT); /* Set the page */
DimiterK 0:135b9a0a816e 560 for (Column = 64; Column < 128; Column++)
DimiterK 0:135b9a0a816e 561 WriteData(PictureData[(128*Page)+Column],RIGHT);
DimiterK 0:135b9a0a816e 562 }
DimiterK 0:135b9a0a816e 563 }
DimiterK 0:135b9a0a816e 564
DimiterK 2:03d27b3fce6e 565 void KS0108::CustomImage(Image* image,unsigned int x, unsigned int y, unsigned int color){
DimiterK 2:03d27b3fce6e 566 unsigned int i, j, bit_idx, pixelByte, imgHeight, imgSize;
DimiterK 2:03d27b3fce6e 567
DimiterK 2:03d27b3fce6e 568 imgHeight = image->imgHeight; //get height of the image array
DimiterK 2:03d27b3fce6e 569 imgSize = (image->imgWidth)>>3; //number of bytes = width of icon/8
DimiterK 2:03d27b3fce6e 570
DimiterK 2:03d27b3fce6e 571 for(i=0;i<imgHeight;i++){
DimiterK 2:03d27b3fce6e 572 for(j=0;j<imgSize;j++){
DimiterK 2:03d27b3fce6e 573 pixelByte = image->imgarray[i*imgSize+j];
DimiterK 2:03d27b3fce6e 574 for(bit_idx=0;bit_idx<8;bit_idx++){
DimiterK 2:03d27b3fce6e 575 if(pixelByte&(0x80>>bit_idx))
DimiterK 2:03d27b3fce6e 576 SetPixel(x+bit_idx+8*j, y+i, color)
DimiterK 2:03d27b3fce6e 577 else
DimiterK 2:03d27b3fce6e 578 SetPixel(x+bit_idx+8*j, y+i, !color);
DimiterK 2:03d27b3fce6e 579 }
DimiterK 2:03d27b3fce6e 580 }
DimiterK 2:03d27b3fce6e 581 }
DimiterK 2:03d27b3fce6e 582 }
DimiterK 0:135b9a0a816e 583 /******************************************************************************************/
DimiterK 0:135b9a0a816e 584
DimiterK 1:a368f2688222 585
DimiterK 0:135b9a0a816e 586 void KS0108::CursorXY(unsigned int x, unsigned int y){
DimiterK 0:135b9a0a816e 587 if( (x > SCREEN_WIDTH-1) || (y > SCREEN_HEIGHT-1) ) // exit if coordinates are not legal
DimiterK 0:135b9a0a816e 588 return;
DimiterK 0:135b9a0a816e 589
DimiterK 0:135b9a0a816e 590 if(y<(SCREEN_WIDTH/2)){
DimiterK 0:135b9a0a816e 591 SelectSide(LEFT);
DimiterK 0:135b9a0a816e 592 WriteInstruction(LCD_SET_PAGE|(y/8),RIGHT);
DimiterK 0:135b9a0a816e 593 WriteInstruction(LCD_SET_ADD|x,RIGHT);
DimiterK 0:135b9a0a816e 594 }else{
DimiterK 0:135b9a0a816e 595 SelectSide(RIGHT);
DimiterK 0:135b9a0a816e 596 WriteInstruction(LCD_SET_PAGE|(y/8),RIGHT);
DimiterK 0:135b9a0a816e 597 WriteInstruction(LCD_SET_ADD|x,RIGHT);
DimiterK 0:135b9a0a816e 598 }
DimiterK 0:135b9a0a816e 599 }
DimiterK 0:135b9a0a816e 600
DimiterK 1:a368f2688222 601
DimiterK 0:135b9a0a816e 602 void KS0108::Putc (int page, int col,unsigned char c) {
DimiterK 0:135b9a0a816e 603 if (c>31 && c<127){
DimiterK 0:135b9a0a816e 604 for(int i=0;i<5;i++){
DimiterK 0:135b9a0a816e 605 WriteDataColPag(page,col+i,System5x7[((c-32)*5+i)+6]);
DimiterK 0:135b9a0a816e 606 }
DimiterK 0:135b9a0a816e 607 }
DimiterK 0:135b9a0a816e 608 }
DimiterK 0:135b9a0a816e 609
DimiterK 0:135b9a0a816e 610
DimiterK 1:a368f2688222 611
DimiterK 0:135b9a0a816e 612 void KS0108::PutString(unsigned int x, unsigned int y,char* str){
DimiterK 0:135b9a0a816e 613
DimiterK 0:135b9a0a816e 614 while(*str != 0){
DimiterK 0:135b9a0a816e 615 Putc(x,y,*str);
DimiterK 0:135b9a0a816e 616 str++;
DimiterK 0:135b9a0a816e 617 y+=System5x7[2];
DimiterK 0:135b9a0a816e 618 }
DimiterK 0:135b9a0a816e 619
DimiterK 0:135b9a0a816e 620 }
DimiterK 0:135b9a0a816e 621
DimiterK 0:135b9a0a816e 622
DimiterK 0:135b9a0a816e 623
DimiterK 0:135b9a0a816e 624 void KS0108::PrintFloat(float val, unsigned int x,unsigned int y){
DimiterK 0:135b9a0a816e 625 char buf[20] = {}; // prints up to 20 digits
DimiterK 0:135b9a0a816e 626 sprintf(buf,"%f",val);
DimiterK 0:135b9a0a816e 627 PutString(x,y,buf);
DimiterK 0:135b9a0a816e 628
DimiterK 0:135b9a0a816e 629 }
DimiterK 0:135b9a0a816e 630
DimiterK 1:a368f2688222 631
DimiterK 0:135b9a0a816e 632 void KS0108::PrintInteger(int val,unsigned int x,unsigned int y){
DimiterK 0:135b9a0a816e 633 char buf[20] = {}; // prints up to 20 digits
DimiterK 0:135b9a0a816e 634 sprintf(buf,"%d",val);
DimiterK 0:135b9a0a816e 635 PutString(x,y,buf);
DimiterK 0:135b9a0a816e 636 }