Modified N5110 library with the ability to the print strings at exact pxiel locations, not just at each bank

Fork of N5110 by Craig Evans

Credit to C.Evans for the original library (https://developer.mbed.org/users/eencae/code/N5110/)

Committer:
el14j2h
Date:
Fri May 06 14:58:03 2016 +0000
Revision:
20:6550692c474f
Parent:
19:ba8addc061ea
Added printStringExact;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
eencae 5:6ea180eef702 1 /**
eencae 5:6ea180eef702 2 @file N5110.cpp
eencae 5:6ea180eef702 3
eencae 5:6ea180eef702 4 @brief Member functions implementations
eencae 5:6ea180eef702 5
eencae 5:6ea180eef702 6 */
eencae 0:d563e74f0ae9 7 #include "mbed.h"
eencae 0:d563e74f0ae9 8 #include "N5110.h"
eencae 0:d563e74f0ae9 9
eencae 2:e93021cfb0a9 10
eencae 1:df68f34cd32d 11 N5110::N5110(PinName pwrPin, PinName scePin, PinName rstPin, PinName dcPin, PinName mosiPin, PinName sclkPin, PinName ledPin)
eencae 0:d563e74f0ae9 12 {
eencae 13:908644099648 13
eencae 0:d563e74f0ae9 14 spi = new SPI(mosiPin,NC,sclkPin); // create new SPI instance and initialise
eencae 13:908644099648 15 initSPI();
eencae 13:908644099648 16
eencae 6:adb79338d40f 17 // set up pins as required
eencae 0:d563e74f0ae9 18 led = new PwmOut(ledPin);
eencae 0:d563e74f0ae9 19 pwr = new DigitalOut(pwrPin);
eencae 0:d563e74f0ae9 20 sce = new DigitalOut(scePin);
eencae 0:d563e74f0ae9 21 rst = new DigitalOut(rstPin);
eencae 0:d563e74f0ae9 22 dc = new DigitalOut(dcPin);
eencae 0:d563e74f0ae9 23
eencae 0:d563e74f0ae9 24 }
eencae 0:d563e74f0ae9 25
eencae 6:adb79338d40f 26 // initialise function - powers up and sends the initialisation commands
eencae 0:d563e74f0ae9 27 void N5110::init()
eencae 0:d563e74f0ae9 28 {
eencae 6:adb79338d40f 29 turnOn(); // power up
eencae 6:adb79338d40f 30 wait_ms(10); // small delay seems to prevent spurious pixels during mbed reset
eencae 6:adb79338d40f 31 reset(); // reset LCD - must be done within 100 ms
eencae 0:d563e74f0ae9 32
eencae 0:d563e74f0ae9 33 // function set - extended
eencae 0:d563e74f0ae9 34 sendCommand(0x20 | CMD_FS_ACTIVE_MODE | CMD_FS_HORIZONTAL_MODE | CMD_FS_EXTENDED_MODE);
eencae 6:adb79338d40f 35 // Don't completely understand these parameters - they seem to work as they are
eencae 6:adb79338d40f 36 // Consult the datasheet if you need to change them
eencae 1:df68f34cd32d 37 sendCommand(CMD_VOP_7V38); // operating voltage - these values are from Chris Yan's Library
eencae 0:d563e74f0ae9 38 sendCommand(CMD_TC_TEMP_2); // temperature control
eencae 0:d563e74f0ae9 39 sendCommand(CMD_BI_MUX_48); // bias
eencae 0:d563e74f0ae9 40
eencae 0:d563e74f0ae9 41 // function set - basic
eencae 0:d563e74f0ae9 42 sendCommand(0x20 | CMD_FS_ACTIVE_MODE | CMD_FS_HORIZONTAL_MODE | CMD_FS_BASIC_MODE);
eencae 1:df68f34cd32d 43 normalMode(); // normal video mode by default
eencae 0:d563e74f0ae9 44 sendCommand(CMD_DC_NORMAL_MODE); // black on white
eencae 0:d563e74f0ae9 45
eencae 0:d563e74f0ae9 46 // RAM is undefined at power-up so clear
eencae 0:d563e74f0ae9 47 clearRAM();
eencae 0:d563e74f0ae9 48
eencae 0:d563e74f0ae9 49 }
eencae 13:908644099648 50
eencae 13:908644099648 51 // sets normal video mode (black on white)
eencae 13:908644099648 52 void N5110::normalMode()
eencae 13:908644099648 53 {
eencae 13:908644099648 54 sendCommand(CMD_DC_NORMAL_MODE);
eencae 13:908644099648 55
eencae 1:df68f34cd32d 56 }
eencae 1:df68f34cd32d 57
eencae 13:908644099648 58 // sets normal video mode (white on black)
eencae 13:908644099648 59 void N5110::inverseMode()
eencae 13:908644099648 60 {
eencae 13:908644099648 61 sendCommand(CMD_DC_INVERT_VIDEO);
eencae 1:df68f34cd32d 62 }
eencae 0:d563e74f0ae9 63
eencae 0:d563e74f0ae9 64 // function to power up the LCD and backlight
eencae 0:d563e74f0ae9 65 void N5110::turnOn()
eencae 0:d563e74f0ae9 66 {
eencae 0:d563e74f0ae9 67 // set brightness of LED - 0.0 to 1.0 - default is 50%
eencae 0:d563e74f0ae9 68 setBrightness(0.5);
eencae 0:d563e74f0ae9 69 pwr->write(1); // apply power
eencae 0:d563e74f0ae9 70 }
eencae 0:d563e74f0ae9 71
eencae 0:d563e74f0ae9 72 // function to power down LCD
eencae 0:d563e74f0ae9 73 void N5110::turnOff()
eencae 0:d563e74f0ae9 74 {
eencae 0:d563e74f0ae9 75 setBrightness(0.0); // turn backlight off
eencae 0:d563e74f0ae9 76 clearRAM(); // clear RAM to ensure specified current consumption
eencae 10:6f3abb40202b 77 // send command to ensure we are in basic mode
eencae 0:d563e74f0ae9 78 sendCommand(0x20 | CMD_FS_ACTIVE_MODE | CMD_FS_HORIZONTAL_MODE | CMD_FS_BASIC_MODE);
eencae 6:adb79338d40f 79 // clear the display
eencae 0:d563e74f0ae9 80 sendCommand(CMD_DC_CLEAR_DISPLAY);
eencae 6:adb79338d40f 81 // enter the extended mode and power down
eencae 0:d563e74f0ae9 82 sendCommand(0x20 | CMD_FS_POWER_DOWN_MODE | CMD_FS_HORIZONTAL_MODE | CMD_FS_EXTENDED_MODE);
eencae 6:adb79338d40f 83 // small delay and then turn off the power pin
eencae 6:adb79338d40f 84 wait_ms(10);
eencae 0:d563e74f0ae9 85 pwr->write(0);
eencae 0:d563e74f0ae9 86
eencae 0:d563e74f0ae9 87 }
eencae 0:d563e74f0ae9 88
eencae 0:d563e74f0ae9 89 // function to change LED backlight brightness
eencae 0:d563e74f0ae9 90 void N5110::setBrightness(float brightness)
eencae 0:d563e74f0ae9 91 {
eencae 0:d563e74f0ae9 92 // check whether brightness is within range
eencae 0:d563e74f0ae9 93 if (brightness < 0.0)
eencae 0:d563e74f0ae9 94 brightness = 0.0;
eencae 0:d563e74f0ae9 95 if (brightness > 1.0)
eencae 0:d563e74f0ae9 96 brightness = 1.0;
eencae 0:d563e74f0ae9 97 // set PWM duty cycle
eencae 0:d563e74f0ae9 98 led->write(brightness);
eencae 0:d563e74f0ae9 99 }
eencae 0:d563e74f0ae9 100
eencae 0:d563e74f0ae9 101
eencae 0:d563e74f0ae9 102 // pulse the active low reset line
eencae 0:d563e74f0ae9 103 void N5110::reset()
eencae 0:d563e74f0ae9 104 {
eencae 0:d563e74f0ae9 105 rst->write(0); // reset the LCD
eencae 0:d563e74f0ae9 106 rst->write(1);
eencae 0:d563e74f0ae9 107 }
eencae 0:d563e74f0ae9 108
eencae 0:d563e74f0ae9 109 // function to initialise SPI peripheral
eencae 0:d563e74f0ae9 110 void N5110::initSPI()
eencae 0:d563e74f0ae9 111 {
eencae 0:d563e74f0ae9 112 spi->format(8,1); // 8 bits, Mode 1 - polarity 0, phase 1 - base value of clock is 0, data captured on falling edge/propagated on rising edge
eencae 0:d563e74f0ae9 113 spi->frequency(4000000); // maximum of screen is 4 MHz
eencae 0:d563e74f0ae9 114 }
eencae 0:d563e74f0ae9 115
eencae 6:adb79338d40f 116 // send a command to the display
eencae 0:d563e74f0ae9 117 void N5110::sendCommand(unsigned char command)
eencae 0:d563e74f0ae9 118 {
eencae 0:d563e74f0ae9 119 dc->write(0); // set DC low for command
eencae 0:d563e74f0ae9 120 sce->write(0); // set CE low to begin frame
eencae 0:d563e74f0ae9 121 spi->write(command); // send command
eencae 0:d563e74f0ae9 122 dc->write(1); // turn back to data by default
eencae 0:d563e74f0ae9 123 sce->write(1); // set CE high to end frame (expected for transmission of single byte)
eencae 0:d563e74f0ae9 124
eencae 0:d563e74f0ae9 125 }
eencae 0:d563e74f0ae9 126
eencae 6:adb79338d40f 127 // send data to the display at the current XY address
eencae 6:adb79338d40f 128 // dc is set to 1 (i.e. data) after sending a command and so should
eencae 6:adb79338d40f 129 // be the default mode.
eencae 0:d563e74f0ae9 130 void N5110::sendData(unsigned char data)
eencae 0:d563e74f0ae9 131 {
eencae 0:d563e74f0ae9 132 sce->write(0); // set CE low to begin frame
eencae 0:d563e74f0ae9 133 spi->write(data);
eencae 0:d563e74f0ae9 134 sce->write(1); // set CE high to end frame (expected for transmission of single byte)
eencae 0:d563e74f0ae9 135 }
eencae 0:d563e74f0ae9 136
eencae 0:d563e74f0ae9 137 // this function writes 0 to the 504 bytes to clear the RAM
eencae 0:d563e74f0ae9 138 void N5110::clearRAM()
eencae 0:d563e74f0ae9 139 {
eencae 0:d563e74f0ae9 140 int i;
eencae 0:d563e74f0ae9 141 sce->write(0); //set CE low to begin frame
eencae 17:780a542d5f8b 142 for(i = 0; i < WIDTH * HEIGHT; i++) { // 48 x 84 bits = 504 bytes
eencae 0:d563e74f0ae9 143 spi->write(0x00); // send 0's
eencae 0:d563e74f0ae9 144 }
eencae 0:d563e74f0ae9 145 sce->write(1); // set CE high to end frame
eencae 0:d563e74f0ae9 146
eencae 0:d563e74f0ae9 147 }
eencae 0:d563e74f0ae9 148
eencae 13:908644099648 149 // function to set the XY address in RAM for subsequenct data write
eencae 0:d563e74f0ae9 150 void N5110::setXYAddress(int x, int y)
eencae 0:d563e74f0ae9 151 {
eencae 17:780a542d5f8b 152 if (x>=0 && x<WIDTH && y>=0 && y<HEIGHT) { // check within range
eencae 17:780a542d5f8b 153 sendCommand(0x80 | x); // send addresses to display with relevant mask
eencae 17:780a542d5f8b 154 sendCommand(0x40 | y);
eencae 17:780a542d5f8b 155 }
eencae 0:d563e74f0ae9 156 }
eencae 0:d563e74f0ae9 157
eencae 6:adb79338d40f 158 // These functions are used to set, clear and get the value of pixels in the display
eencae 6:adb79338d40f 159 // Pixels are addressed in the range of 0 to 47 (y) and 0 to 83 (x). The refresh()
eencae 6:adb79338d40f 160 // function must be called after set and clear in order to update the display
eencae 0:d563e74f0ae9 161 void N5110::setPixel(int x, int y)
eencae 0:d563e74f0ae9 162 {
eencae 17:780a542d5f8b 163 if (x>=0 && x<WIDTH && y>=0 && y<HEIGHT) { // check within range
eencae 17:780a542d5f8b 164 // calculate bank and shift 1 to required position in the data byte
eencae 17:780a542d5f8b 165 buffer[x][y/8] |= (1 << y%8);
eencae 17:780a542d5f8b 166 }
eencae 0:d563e74f0ae9 167 }
eencae 0:d563e74f0ae9 168
eencae 0:d563e74f0ae9 169 void N5110::clearPixel(int x, int y)
eencae 0:d563e74f0ae9 170 {
eencae 17:780a542d5f8b 171 if (x>=0 && x<WIDTH && y>=0 && y<HEIGHT) { // check within range
eencae 17:780a542d5f8b 172 // calculate bank and shift 1 to required position (using bit clear)
eencae 17:780a542d5f8b 173 buffer[x][y/8] &= ~(1 << y%8);
eencae 17:780a542d5f8b 174 }
eencae 0:d563e74f0ae9 175 }
eencae 0:d563e74f0ae9 176
eencae 7:3010f24e0a81 177 int N5110::getPixel(int x, int y)
eencae 0:d563e74f0ae9 178 {
eencae 17:780a542d5f8b 179 if (x>=0 && x<WIDTH && y>=0 && y<HEIGHT) { // check within range
eencae 17:780a542d5f8b 180 // return relevant bank and mask required bit
eencae 17:780a542d5f8b 181 return (int) buffer[x][y/8] & (1 << y%8);
eencae 19:ba8addc061ea 182 // note this does not necessarily return 1 - a non-zero number represents a pixel
eencae 17:780a542d5f8b 183 } else {
eencae 17:780a542d5f8b 184 return 0;
eencae 17:780a542d5f8b 185 }
eencae 0:d563e74f0ae9 186 }
eencae 0:d563e74f0ae9 187
eencae 6:adb79338d40f 188 // function to refresh the display
eencae 6:adb79338d40f 189 void N5110::refresh()
eencae 0:d563e74f0ae9 190 {
eencae 0:d563e74f0ae9 191 int i,j;
eencae 13:908644099648 192
eencae 7:3010f24e0a81 193 setXYAddress(0,0); // important to set address back to 0,0 before refreshing display
eencae 7:3010f24e0a81 194 // address auto increments after printing string, so buffer[0][0] will not coincide
eencae 7:3010f24e0a81 195 // with top-left pixel after priting string
eencae 13:908644099648 196
eencae 0:d563e74f0ae9 197 sce->write(0); //set CE low to begin frame
eencae 0:d563e74f0ae9 198
eencae 17:780a542d5f8b 199 for(j = 0; j < BANKS; j++) { // be careful to use correct order (j,i) for horizontal addressing
eencae 17:780a542d5f8b 200 for(i = 0; i < WIDTH; i++) {
eencae 0:d563e74f0ae9 201 spi->write(buffer[i][j]); // send buffer
eencae 0:d563e74f0ae9 202 }
eencae 0:d563e74f0ae9 203 }
eencae 0:d563e74f0ae9 204 sce->write(1); // set CE high to end frame
eencae 0:d563e74f0ae9 205
eencae 0:d563e74f0ae9 206 }
eencae 0:d563e74f0ae9 207
eencae 6:adb79338d40f 208 // fills the buffer with random bytes. Can be used to test the display.
eencae 6:adb79338d40f 209 // The rand() function isn't seeded so it probably creates the same pattern everytime
eencae 0:d563e74f0ae9 210 void N5110::randomiseBuffer()
eencae 0:d563e74f0ae9 211 {
eencae 0:d563e74f0ae9 212 int i,j;
eencae 17:780a542d5f8b 213 for(j = 0; j < BANKS; j++) { // be careful to use correct order (j,i) for horizontal addressing
eencae 17:780a542d5f8b 214 for(i = 0; i < WIDTH; i++) {
eencae 0:d563e74f0ae9 215 buffer[i][j] = rand()%256; // generate random byte
eencae 0:d563e74f0ae9 216 }
eencae 0:d563e74f0ae9 217 }
eencae 0:d563e74f0ae9 218
eencae 0:d563e74f0ae9 219 }
eencae 0:d563e74f0ae9 220
eencae 0:d563e74f0ae9 221 // function to print 5x7 font
eencae 13:908644099648 222 void N5110::printChar(char c,int x,int y)
eencae 0:d563e74f0ae9 223 {
eencae 19:ba8addc061ea 224 if (y>=0 && y<BANKS) { // check if printing in range of y banks
eencae 18:1af393359298 225
eencae 18:1af393359298 226 for (int i = 0; i < 5 ; i++ ) {
eencae 18:1af393359298 227 int pixel_x = x+i;
eencae 19:ba8addc061ea 228 if (pixel_x > WIDTH-1) // ensure pixel isn't outside the buffer size (0 - 83)
eencae 18:1af393359298 229 break;
eencae 18:1af393359298 230 buffer[pixel_x][y] = font5x7[(c - 32)*5 + i];
eencae 18:1af393359298 231 // array is offset by 32 relative to ASCII, each character is 5 pixels wide
eencae 18:1af393359298 232 }
eencae 18:1af393359298 233
eencae 18:1af393359298 234 refresh(); // this sends the buffer to the display and sets address (cursor) back to 0,0
eencae 0:d563e74f0ae9 235 }
eencae 0:d563e74f0ae9 236 }
el14j2h 20:6550692c474f 237 void N5110::printString_exact(const char * str,int x,int y)
el14j2h 20:6550692c474f 238 {
eencae 0:d563e74f0ae9 239
el14j2h 20:6550692c474f 240 int n = 0 ; // counter for number of characters in string
el14j2h 20:6550692c474f 241 int bankOffset = y%8;
el14j2h 20:6550692c474f 242 int ybank0 = (y - bankOffset)/8;
el14j2h 20:6550692c474f 243 int ybank1 = ybank0+1;
el14j2h 20:6550692c474f 244 if (ybank0>=0 && ybank0<BANKS){
el14j2h 20:6550692c474f 245 // loop through string and print character
el14j2h 20:6550692c474f 246 while(*str) {
el14j2h 20:6550692c474f 247
el14j2h 20:6550692c474f 248 for (int i = 0; i < 5 ; i++ ) {//each charactor is 5 pixels wide 7 high
el14j2h 20:6550692c474f 249 int pixel_x = x+i+n*6;
el14j2h 20:6550692c474f 250
el14j2h 20:6550692c474f 251 if (pixel_x > WIDTH-1) // ensure pixel isn't outside the buffer size (0 - 83)
el14j2h 20:6550692c474f 252 break;
el14j2h 20:6550692c474f 253
el14j2h 20:6550692c474f 254 buffer[pixel_x][ybank0] |= font5x7[(*str - 32)*5 + i]<<bankOffset;
el14j2h 20:6550692c474f 255 if (ybank1>=0 && ybank1<BANKS && bankOffset>0){
el14j2h 20:6550692c474f 256 buffer[pixel_x][ybank1] |= font5x7[(*str - 32)*5 + i]>>(8-bankOffset);
el14j2h 20:6550692c474f 257 }
el14j2h 20:6550692c474f 258 }
el14j2h 20:6550692c474f 259
el14j2h 20:6550692c474f 260 str++; // go to next character in string
el14j2h 20:6550692c474f 261
el14j2h 20:6550692c474f 262 n++; // increment index
el14j2h 20:6550692c474f 263
el14j2h 20:6550692c474f 264 }
el14j2h 20:6550692c474f 265
el14j2h 20:6550692c474f 266 // refresh(); // this sends the buffer to the display and sets address (cursor) back to 0,0
el14j2h 20:6550692c474f 267 }
el14j2h 20:6550692c474f 268 }
eencae 0:d563e74f0ae9 269 // function to print string at specified position
eencae 0:d563e74f0ae9 270 void N5110::printString(const char * str,int x,int y)
eencae 0:d563e74f0ae9 271 {
eencae 19:ba8addc061ea 272 if (y>=0 && y<BANKS) { // check if printing in range of y banks
eencae 18:1af393359298 273
eencae 18:1af393359298 274 int n = 0 ; // counter for number of characters in string
eencae 18:1af393359298 275 // loop through string and print character
eencae 18:1af393359298 276 while(*str) {
eencae 0:d563e74f0ae9 277
eencae 18:1af393359298 278 // writes the character bitmap data to the buffer, so that
eencae 18:1af393359298 279 // text and pixels can be displayed at the same time
eencae 18:1af393359298 280 for (int i = 0; i < 5 ; i++ ) {
eencae 18:1af393359298 281 int pixel_x = x+i+n*6;
eencae 19:ba8addc061ea 282 if (pixel_x > WIDTH-1) // ensure pixel isn't outside the buffer size (0 - 83)
eencae 18:1af393359298 283 break;
eencae 18:1af393359298 284 buffer[pixel_x][y] = font5x7[(*str - 32)*5 + i];
eencae 18:1af393359298 285 }
eencae 18:1af393359298 286
eencae 18:1af393359298 287 str++; // go to next character in string
eencae 18:1af393359298 288
eencae 18:1af393359298 289 n++; // increment index
eencae 18:1af393359298 290
eencae 9:7701f0126ba7 291 }
eencae 13:908644099648 292
eencae 18:1af393359298 293 refresh(); // this sends the buffer to the display and sets address (cursor) back to 0,0
eencae 0:d563e74f0ae9 294 }
eencae 0:d563e74f0ae9 295 }
eencae 0:d563e74f0ae9 296
eencae 6:adb79338d40f 297 // function to clear the screen
eencae 0:d563e74f0ae9 298 void N5110::clear()
eencae 0:d563e74f0ae9 299 {
eencae 6:adb79338d40f 300 clearBuffer(); // clear the buffer then call the refresh function
eencae 6:adb79338d40f 301 refresh();
eencae 0:d563e74f0ae9 302 }
eencae 0:d563e74f0ae9 303
eencae 6:adb79338d40f 304 // function to clear the buffer
eencae 0:d563e74f0ae9 305 void N5110::clearBuffer()
eencae 0:d563e74f0ae9 306 {
eencae 0:d563e74f0ae9 307 int i,j;
eencae 17:780a542d5f8b 308 for (i=0; i<WIDTH; i++) { // loop through the banks and set the buffer to 0
eencae 17:780a542d5f8b 309 for (j=0; j<BANKS; j++) {
eencae 0:d563e74f0ae9 310 buffer[i][j]=0;
eencae 0:d563e74f0ae9 311 }
eencae 0:d563e74f0ae9 312 }
eencae 8:40abe5736eca 313 }
eencae 8:40abe5736eca 314
eencae 8:40abe5736eca 315 // function to plot array on display
eencae 13:908644099648 316 void N5110::plotArray(float array[])
eencae 13:908644099648 317 {
eencae 13:908644099648 318
eencae 8:40abe5736eca 319 int i;
eencae 13:908644099648 320
eencae 17:780a542d5f8b 321 for (i=0; i<WIDTH; i++) { // loop through array
eencae 8:40abe5736eca 322 // elements are normalised from 0.0 to 1.0, so multiply
eencae 8:40abe5736eca 323 // by 47 to convert to pixel range, and subtract from 47
eencae 8:40abe5736eca 324 // since top-left is 0,0 in the display geometry
eencae 9:7701f0126ba7 325 setPixel(i,47 - int(array[i]*47.0));
eencae 13:908644099648 326 }
eencae 13:908644099648 327
eencae 8:40abe5736eca 328 refresh();
eencae 13:908644099648 329
eencae 17:780a542d5f8b 330 }
eencae 13:908644099648 331
eencae 17:780a542d5f8b 332 // function to draw circle
eencae 17:780a542d5f8b 333 void N5110:: drawCircle(int x0,int y0,int radius,int fill)
eencae 17:780a542d5f8b 334 {
eencae 17:780a542d5f8b 335 // from http://en.wikipedia.org/wiki/Midpoint_circle_algorithm
eencae 17:780a542d5f8b 336 int x = radius;
eencae 17:780a542d5f8b 337 int y = 0;
eencae 17:780a542d5f8b 338 int radiusError = 1-x;
eencae 17:780a542d5f8b 339
eencae 17:780a542d5f8b 340 while(x >= y) {
eencae 17:780a542d5f8b 341
eencae 17:780a542d5f8b 342 // if transparent, just draw outline
eencae 17:780a542d5f8b 343 if (fill == 0) {
eencae 17:780a542d5f8b 344 setPixel( x + x0, y + y0);
eencae 17:780a542d5f8b 345 setPixel(-x + x0, y + y0);
eencae 17:780a542d5f8b 346 setPixel( y + x0, x + y0);
eencae 17:780a542d5f8b 347 setPixel(-y + x0, x + y0);
eencae 17:780a542d5f8b 348 setPixel(-y + x0, -x + y0);
eencae 17:780a542d5f8b 349 setPixel( y + x0, -x + y0);
eencae 17:780a542d5f8b 350 setPixel( x + x0, -y + y0);
eencae 17:780a542d5f8b 351 setPixel(-x + x0, -y + y0);
eencae 17:780a542d5f8b 352 } else { // drawing filled circle, so draw lines between points at same y value
eencae 17:780a542d5f8b 353
eencae 17:780a542d5f8b 354 int type = (fill==1) ? 1:0; // black or white fill
eencae 17:780a542d5f8b 355
eencae 17:780a542d5f8b 356 drawLine(x+x0,y+y0,-x+x0,y+y0,type);
eencae 17:780a542d5f8b 357 drawLine(y+x0,x+y0,-y+x0,x+y0,type);
eencae 17:780a542d5f8b 358 drawLine(y+x0,-x+y0,-y+x0,-x+y0,type);
eencae 17:780a542d5f8b 359 drawLine(x+x0,-y+y0,-x+x0,-y+y0,type);
eencae 17:780a542d5f8b 360 }
eencae 17:780a542d5f8b 361
eencae 17:780a542d5f8b 362
eencae 17:780a542d5f8b 363 y++;
eencae 17:780a542d5f8b 364 if (radiusError<0) {
eencae 17:780a542d5f8b 365 radiusError += 2 * y + 1;
eencae 17:780a542d5f8b 366 } else {
eencae 17:780a542d5f8b 367 x--;
eencae 17:780a542d5f8b 368 radiusError += 2 * (y - x) + 1;
eencae 17:780a542d5f8b 369 }
eencae 17:780a542d5f8b 370 }
eencae 17:780a542d5f8b 371
eencae 17:780a542d5f8b 372 }
eencae 17:780a542d5f8b 373
eencae 17:780a542d5f8b 374 void N5110::drawLine(int x0,int y0,int x1,int y1,int type)
eencae 17:780a542d5f8b 375 {
eencae 17:780a542d5f8b 376 int y_range = y1-y0; // calc range of y and x
eencae 17:780a542d5f8b 377 int x_range = x1-x0;
eencae 17:780a542d5f8b 378 int start,stop,step;
eencae 17:780a542d5f8b 379
eencae 17:780a542d5f8b 380 // if dotted line, set step to 2, else step is 1
eencae 17:780a542d5f8b 381 step = (type==2) ? 2:1;
eencae 17:780a542d5f8b 382
eencae 17:780a542d5f8b 383 // make sure we loop over the largest range to get the most pixels on the display
eencae 17:780a542d5f8b 384 // for instance, if drawing a vertical line (x_range = 0), we need to loop down the y pixels
eencae 17:780a542d5f8b 385 // or else we'll only end up with 1 pixel in the x column
eencae 17:780a542d5f8b 386 if ( abs(x_range) > abs(y_range) ) {
eencae 17:780a542d5f8b 387
eencae 17:780a542d5f8b 388 // ensure we loop from smallest to largest or else for-loop won't run as expected
eencae 17:780a542d5f8b 389 start = x1>x0 ? x0:x1;
eencae 17:780a542d5f8b 390 stop = x1>x0 ? x1:x0;
eencae 17:780a542d5f8b 391
eencae 17:780a542d5f8b 392 // loop between x pixels
eencae 17:780a542d5f8b 393 for (int x = start; x<= stop ; x+=step) {
eencae 17:780a542d5f8b 394 // do linear interpolation
eencae 17:780a542d5f8b 395 int y = y0 + (y1-y0)*(x-x0)/(x1-x0);
eencae 17:780a542d5f8b 396
eencae 17:780a542d5f8b 397 if (type == 0) // if 'white' line, turn off pixel
eencae 17:780a542d5f8b 398 clearPixel(x,y);
eencae 17:780a542d5f8b 399 else
eencae 17:780a542d5f8b 400 setPixel(x,y); // else if 'black' or 'dotted' turn on pixel
eencae 17:780a542d5f8b 401 }
eencae 17:780a542d5f8b 402 } else {
eencae 17:780a542d5f8b 403
eencae 17:780a542d5f8b 404 // ensure we loop from smallest to largest or else for-loop won't run as expected
eencae 17:780a542d5f8b 405 start = y1>y0 ? y0:y1;
eencae 17:780a542d5f8b 406 stop = y1>y0 ? y1:y0;
eencae 17:780a542d5f8b 407
eencae 17:780a542d5f8b 408 for (int y = start; y<= stop ; y+=step) {
eencae 17:780a542d5f8b 409 // do linear interpolation
eencae 17:780a542d5f8b 410 int x = x0 + (x1-x0)*(y-y0)/(y1-y0);
eencae 17:780a542d5f8b 411
eencae 17:780a542d5f8b 412 if (type == 0) // if 'white' line, turn off pixel
eencae 17:780a542d5f8b 413 clearPixel(x,y);
eencae 17:780a542d5f8b 414 else
eencae 17:780a542d5f8b 415 setPixel(x,y); // else if 'black' or 'dotted' turn on pixel
eencae 17:780a542d5f8b 416
eencae 17:780a542d5f8b 417 }
eencae 17:780a542d5f8b 418 }
eencae 17:780a542d5f8b 419
eencae 17:780a542d5f8b 420 }
eencae 17:780a542d5f8b 421
eencae 17:780a542d5f8b 422 void N5110::drawRect(int x0,int y0,int width,int height,int fill)
eencae 17:780a542d5f8b 423 {
eencae 17:780a542d5f8b 424
eencae 17:780a542d5f8b 425 if (fill == 0) { // transparent, just outline
eencae 17:780a542d5f8b 426 drawLine(x0,y0,x0+width,y0,1); // top
eencae 17:780a542d5f8b 427 drawLine(x0,y0+height,x0+width,y0+height,1); // bottom
eencae 17:780a542d5f8b 428 drawLine(x0,y0,x0,y0+height,1); // left
eencae 17:780a542d5f8b 429 drawLine(x0+width,y0,x0+width,y0+height,1); // right
eencae 17:780a542d5f8b 430 } else { // filled rectangle
eencae 17:780a542d5f8b 431 int type = (fill==1) ? 1:0; // black or white fill
eencae 17:780a542d5f8b 432 for (int y = y0; y<= y0+height; y++) { // loop through rows of rectangle
eencae 17:780a542d5f8b 433 drawLine(x0,y,x0+width,y,type); // draw line across screen
eencae 17:780a542d5f8b 434 }
eencae 17:780a542d5f8b 435 }
eencae 17:780a542d5f8b 436
eencae 17:780a542d5f8b 437 }