runner
Dependencies: mbed
Diff: N5110/N5110.cpp
- Revision:
- 2:1900a4144537
- Parent:
- 0:1e61ade20a23
--- a/N5110/N5110.cpp Tue May 07 19:11:13 2019 +0000 +++ b/N5110/N5110.cpp Thu May 09 03:52:35 2019 +0000 @@ -57,14 +57,22 @@ { turnOn(); // power up reset(); // reset LCD - must be done within 100 ms - initSPI(); - - setContrast(0.55); // this may need tuning (say 0.4 to 0.6) - setBias(3); // datasheet - 48:1 mux - don't mess with if you don't know what you're doing! (0 to 7) - setTempCoefficient(0); // datasheet - may need increasing (range 0 to 3) at very low temperatures + + initSPI(); + // function set - extended + sendCommand(0x20 | CMD_FS_ACTIVE_MODE | CMD_FS_HORIZONTAL_MODE | CMD_FS_EXTENDED_MODE); + // Don't completely understand these parameters - they seem to work as they are + // Consult the datasheet if you need to change them + sendCommand(CMD_VOP_7V38); // operating voltage - these values are from Chris Yan's Library + sendCommand(CMD_TC_TEMP_2); // temperature control + sendCommand(CMD_BI_MUX_48); // changing this can sometimes improve the contrast on some displays + + // function set - basic + sendCommand(0x20 | CMD_FS_ACTIVE_MODE | CMD_FS_HORIZONTAL_MODE | CMD_FS_BASIC_MODE); normalMode(); // normal video mode by default - - clearRAM(); // RAM is undefined at power-up so clear to be sure + sendCommand(CMD_DC_NORMAL_MODE); // black on white + + clearRAM(); // RAM is undefined at power-up so clear clear(); // clear buffer setBrightness(0.5); } @@ -72,15 +80,13 @@ // sets normal video mode (black on white) void N5110::normalMode() { - sendCommand(0b00100000); // basic instruction - sendCommand(0b00001100); // normal video mode- datasheet + sendCommand(CMD_DC_NORMAL_MODE); } // sets normal video mode (white on black) void N5110::inverseMode() { - sendCommand(0b00100000); // basic instruction - sendCommand(0b00001101); // inverse video mode - datasheet + sendCommand(CMD_DC_INVERT_VIDEO); } // function to power up the LCD and backlight - only works when using GPIO to power @@ -99,15 +105,16 @@ setBrightness(0.0); // turn backlight off clearRAM(); // clear RAM to ensure specified current consumption // send command to ensure we are in basic mode - - sendCommand(0b00100000); // basic mode - sendCommand(0b00001000); // clear display - sendCommand(0b00100001); // extended mode - sendCommand(0b00100100); // power down - + sendCommand(0x20 | CMD_FS_ACTIVE_MODE | CMD_FS_HORIZONTAL_MODE | CMD_FS_BASIC_MODE); + // clear the display + sendCommand(CMD_DC_CLEAR_DISPLAY); + // enter the extended mode and power down + sendCommand(0x20 | CMD_FS_POWER_DOWN_MODE | CMD_FS_HORIZONTAL_MODE | CMD_FS_EXTENDED_MODE); + // small delay and then turn off the power pin + wait_ms(10); + // if we are powering the LCD using the GPIO then make it low to turn off if (_pwr != NULL) { - wait_ms(10); // small delay and then turn off the power pin _pwr->write(0); // turn off power } @@ -125,58 +132,6 @@ _led->write(brightness); } -void N5110::setContrast(float contrast) { - - // enforce limits - if (contrast > 1.0f) - contrast = 1.0f; - else if (contrast < 0.0f) - contrast = 0.0; - - // convert to char in range 0 to 127 (i.e. 6 bits) - char ic = char(contrast*127.0f); - - sendCommand(0b00100001); // extended instruction set - sendCommand(0b10000000 | ic); // set Vop (which controls contrast) - sendCommand(0b00100000); // back to basic instruction set -} - -void N5110::setTempCoefficient(char tc) { - - // enforce limits - if (tc>3) { - tc=3; - } - - // temperature coefficient may need increasing at low temperatures - - sendCommand(0b00100001); // extended instruction set - sendCommand(0b00000100 | tc); - sendCommand(0b00100000); // back to basic instruction set -} - -void N5110::setBias(char bias) { - - // from data sheet - // bias mux rate - // 0 1:100 - // 1 1:80 - // 2 1:65 - // 3 1:48 (default) - // 4 1:40/1:34 - // 5 1:24 - // 6 1:18/1:16 - // 7 1:10/1:9/1:8 - - // enforce limits - if (bias>7) { - bias=7; - } - - sendCommand(0b00100001); // extended mode instruction - sendCommand(0b00010000 | bias); - sendCommand(0b00100000); // end of extended mode instruction -} // pulse the active low reset line void N5110::reset() @@ -227,9 +182,8 @@ unsigned int const y) { if (x<WIDTH && y<HEIGHT) { // check within range - sendCommand(0b00100000); // basic instruction - sendCommand(0b10000000 | x); // send addresses to display with relevant mask - sendCommand(0b01000000 | y); + sendCommand(0x80 | x); // send addresses to display with relevant mask + sendCommand(0x40 | y); } } @@ -237,13 +191,11 @@ // Pixels are addressed in the range of 0 to 47 (y) and 0 to 83 (x). The refresh() // function must be called after set and clear in order to update the display void N5110::setPixel(unsigned int const x, - unsigned int const y, - bool const state) + unsigned int const y) { if (x<WIDTH && y<HEIGHT) { // check within range // calculate bank and shift 1 to required position in the data byte - if(state) buffer[x][y/8] |= (1 << y%8); - else buffer[x][y/8] &= ~(1 << y%8); + buffer[x][y/8] |= (1 << y%8); } } @@ -361,7 +313,7 @@ // elements are normalised from 0.0 to 1.0, so multiply // by 47 to convert to pixel range, and subtract from 47 // since top-left is 0,0 in the display geometry - setPixel(i,47 - int(array[i]*47.0f),true); + setPixel(i,47 - int(array[i]*47.0f)); } } @@ -381,14 +333,14 @@ // if transparent, just draw outline if (fill == FILL_TRANSPARENT) { - setPixel( x + x0, y + y0,true); - setPixel(-x + x0, y + y0,true); - setPixel( y + x0, x + y0,true); - setPixel(-y + x0, x + y0,true); - setPixel(-y + x0, -x + y0,true); - setPixel( y + x0, -x + y0,true); - setPixel( x + x0, -y + y0,true); - setPixel(-x + x0, -y + y0,true); + setPixel( x + x0, y + y0); + setPixel(-x + x0, y + y0); + setPixel( y + x0, x + y0); + setPixel(-y + x0, x + y0); + setPixel(-y + x0, -x + y0); + setPixel( y + x0, -x + y0); + setPixel( x + x0, -y + y0); + setPixel(-x + x0, -y + y0); } else { // drawing filled circle, so draw lines between points at same y value int type = (fill==FILL_BLACK) ? 1:0; // black or white fill @@ -416,13 +368,12 @@ unsigned int const y1, unsigned int const type) { - // Note that the ranges can be negative so we have to turn the input values - // into signed integers first - int const y_range = static_cast<int>(y1) - static_cast<int>(y0); - int const x_range = static_cast<int>(x1) - static_cast<int>(x0); + int y_range = y1-y0; // calc range of y and x + int x_range = x1-x0; + int start,stop,step; // if dotted line, set step to 2, else step is 1 - unsigned int const step = (type==2) ? 2:1; + step = (type==2) ? 2:1; // make sure we loop over the largest range to get the most pixels on the display // for instance, if drawing a vertical line (x_range = 0), we need to loop down the y pixels @@ -430,33 +381,34 @@ if ( abs(x_range) > abs(y_range) ) { // ensure we loop from smallest to largest or else for-loop won't run as expected - unsigned int const start = x_range > 0 ? x0:x1; - unsigned int const stop = x_range > 0 ? x1:x0; + start = x1>x0 ? x0:x1; + stop = x1>x0 ? x1:x0; // loop between x pixels - for (unsigned int x = start; x<= stop ; x+=step) { + for (int x = start; x<= stop ; x+=step) { // do linear interpolation - int const dx = static_cast<int>(x)-static_cast<int>(x0); - unsigned int const y = y0 + y_range * dx / x_range; + int y = y0 + (y1-y0)*(x-x0)/(x1-x0); - // If the line type is '0', this will clear the pixel - // If it is '1' or '2', the pixel will be set - setPixel(x,y, type); + if (type == 0) // if 'white' line, turn off pixel + clearPixel(x,y); + else + setPixel(x,y); // else if 'black' or 'dotted' turn on pixel } } else { // ensure we loop from smallest to largest or else for-loop won't run as expected - unsigned int const start = y_range > 0 ? y0:y1; - unsigned int const stop = y_range > 0 ? y1:y0; + start = y1>y0 ? y0:y1; + stop = y1>y0 ? y1:y0; - for (unsigned int y = start; y<= stop ; y+=step) { + for (int y = start; y<= stop ; y+=step) { // do linear interpolation - int const dy = static_cast<int>(y)-static_cast<int>(y0); - unsigned int const x = x0 + x_range * dy / y_range; + int x = x0 + (x1-x0)*(y-y0)/(y1-y0); - // If the line type is '0', this will clear the pixel - // If it is '1' or '2', the pixel will be set - setPixel(x,y, type); + if (type == 0) // if 'white' line, turn off pixel + clearPixel(x,y); + else + setPixel(x,y); // else if 'black' or 'dotted' turn on pixel + } } @@ -479,19 +431,4 @@ drawLine(x0,y,x0+(width-1),y,type); // draw line across screen } } -} - -void N5110::drawSprite(int x0, - int y0, - int nrows, - int ncols, - int *sprite) -{ - for (int i = 0; i < nrows; i++) { - for (int j = 0 ; j < ncols ; j++) { - - int pixel = *((sprite+i*ncols)+j); - setPixel(x0+j,y0+i, pixel); - } - } } \ No newline at end of file