Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of KS0108 by
KS0108.cpp@2:03d27b3fce6e, 2011-01-28 (annotated)
- 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?
| User | Revision | Line number | New 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 | } |
