Library for interfacing to Nokia 5110 LCD display (as found on the SparkFun website).

Dependents:   LV7_LCDtest LV7_Grupa5_Tim003_Zadatak1 lv7_Grupa5_Tim008_zad1 LV7_PAI_Grupa5_tim10_Zadatak1 ... more

This library is designed to make it easy to interface an mbed with a Nokia 5110 LCD display.

These can be found at Sparkfun (https://www.sparkfun.com/products/10168) and Adafruit (http://www.adafruit.com/product/338).

The library uses the SPI peripheral on the mbed which means it is much faster sending data to the display than other libraries available on other platforms that use software SPI.

The library can print strings as well as controlling individual pixels, meaning that both text and primitive graphics can be displayed.

Committer:
eencae
Date:
Tue Feb 07 10:21:43 2017 +0000
Revision:
24:342bdb6679a1
Parent:
23:eb7e6632fc9e
Child:
26:36be85c20ef4
Moved refresh() out of clear/printString/printChar methods. ; ; At every frame update, the buffer should be cleared using 'clear', then the frame constructed using printString/draw methods etc. Finally a call to refresh() will update the display.

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