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