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 N5110 by
N5110.cpp
00001 /** 00002 @file N5110.cpp 00003 00004 @brief Member functions implementations 00005 00006 */ 00007 #include "mbed.h" 00008 #include "N5110.h" 00009 00010 00011 N5110::N5110(PinName pwrPin, PinName scePin, PinName rstPin, PinName dcPin, PinName mosiPin, PinName sclkPin, PinName ledPin) 00012 { 00013 00014 spi = new SPI(mosiPin,NC,sclkPin); // create new SPI instance and initialise 00015 initSPI(); 00016 00017 // set up pins as required 00018 led = new PwmOut(ledPin); 00019 pwr = new DigitalOut(pwrPin); 00020 sce = new DigitalOut(scePin); 00021 rst = new DigitalOut(rstPin); 00022 dc = new DigitalOut(dcPin); 00023 00024 } 00025 00026 // initialise function - powers up and sends the initialisation commands 00027 void N5110::init() 00028 { 00029 turnOn(); // power up 00030 wait_ms(10); // small delay seems to prevent spurious pixels during mbed reset 00031 reset(); // reset LCD - must be done within 100 ms 00032 00033 // function set - extended 00034 sendCommand(0x20 | CMD_FS_ACTIVE_MODE | CMD_FS_HORIZONTAL_MODE | CMD_FS_EXTENDED_MODE); 00035 // Don't completely understand these parameters - they seem to work as they are 00036 // Consult the datasheet if you need to change them 00037 sendCommand(CMD_VOP_7V38); // operating voltage - these values are from Chris Yan's Library 00038 sendCommand(CMD_TC_TEMP_2); // temperature control 00039 sendCommand(CMD_BI_MUX_48); // bias 00040 00041 // function set - basic 00042 sendCommand(0x20 | CMD_FS_ACTIVE_MODE | CMD_FS_HORIZONTAL_MODE | CMD_FS_BASIC_MODE); 00043 normalMode(); // normal video mode by default 00044 sendCommand(CMD_DC_NORMAL_MODE); // black on white 00045 00046 // RAM is undefined at power-up so clear 00047 clearRAM(); 00048 00049 } 00050 00051 // sets normal video mode (black on white) 00052 void N5110::normalMode() 00053 { 00054 sendCommand(CMD_DC_NORMAL_MODE); 00055 00056 } 00057 00058 // sets normal video mode (white on black) 00059 void N5110::inverseMode() 00060 { 00061 sendCommand(CMD_DC_INVERT_VIDEO); 00062 } 00063 00064 // function to power up the LCD and backlight 00065 void N5110::turnOn() 00066 { 00067 // set brightness of LED - 0.0 to 1.0 - default is 50% 00068 setBrightness(0.5); 00069 pwr->write(1); // apply power 00070 } 00071 00072 // function to power down LCD 00073 void N5110::turnOff() 00074 { 00075 setBrightness(0.0); // turn backlight off 00076 clearRAM(); // clear RAM to ensure specified current consumption 00077 // send command to ensure we are in basic mode 00078 sendCommand(0x20 | CMD_FS_ACTIVE_MODE | CMD_FS_HORIZONTAL_MODE | CMD_FS_BASIC_MODE); 00079 // clear the display 00080 sendCommand(CMD_DC_CLEAR_DISPLAY); 00081 // enter the extended mode and power down 00082 sendCommand(0x20 | CMD_FS_POWER_DOWN_MODE | CMD_FS_HORIZONTAL_MODE | CMD_FS_EXTENDED_MODE); 00083 // small delay and then turn off the power pin 00084 wait_ms(10); 00085 pwr->write(0); 00086 00087 } 00088 00089 // function to change LED backlight brightness 00090 void N5110::setBrightness(float brightness) 00091 { 00092 // check whether brightness is within range 00093 if (brightness < 0.0) 00094 brightness = 0.0; 00095 if (brightness > 1.0) 00096 brightness = 1.0; 00097 // set PWM duty cycle 00098 led->write(brightness); 00099 } 00100 00101 00102 // pulse the active low reset line 00103 void N5110::reset() 00104 { 00105 rst->write(0); // reset the LCD 00106 rst->write(1); 00107 } 00108 00109 // function to initialise SPI peripheral 00110 void N5110::initSPI() 00111 { 00112 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 00113 spi->frequency(4000000); // maximum of screen is 4 MHz 00114 } 00115 00116 // send a command to the display 00117 void N5110::sendCommand(unsigned char command) 00118 { 00119 dc->write(0); // set DC low for command 00120 sce->write(0); // set CE low to begin frame 00121 spi->write(command); // send command 00122 dc->write(1); // turn back to data by default 00123 sce->write(1); // set CE high to end frame (expected for transmission of single byte) 00124 00125 } 00126 00127 // send data to the display at the current XY address 00128 // dc is set to 1 (i.e. data) after sending a command and so should 00129 // be the default mode. 00130 void N5110::sendData(unsigned char data) 00131 { 00132 sce->write(0); // set CE low to begin frame 00133 spi->write(data); 00134 sce->write(1); // set CE high to end frame (expected for transmission of single byte) 00135 } 00136 00137 // this function writes 0 to the 504 bytes to clear the RAM 00138 void N5110::clearRAM() 00139 { 00140 int i; 00141 sce->write(0); //set CE low to begin frame 00142 for(i = 0; i < WIDTH * HEIGHT; i++) { // 48 x 84 bits = 504 bytes 00143 spi->write(0x00); // send 0's 00144 } 00145 sce->write(1); // set CE high to end frame 00146 00147 } 00148 00149 // function to set the XY address in RAM for subsequenct data write 00150 void N5110::setXYAddress(int x, int y) 00151 { 00152 if (x>=0 && x<WIDTH && y>=0 && y<HEIGHT) { // check within range 00153 sendCommand(0x80 | x); // send addresses to display with relevant mask 00154 sendCommand(0x40 | y); 00155 } 00156 } 00157 00158 // These functions are used to set, clear and get the value of pixels in the display 00159 // Pixels are addressed in the range of 0 to 47 (y) and 0 to 83 (x). The refresh() 00160 // function must be called after set and clear in order to update the display 00161 void N5110::setPixel(int x, int y) 00162 { 00163 if (x>=0 && x<WIDTH && y>=0 && y<HEIGHT) { // check within range 00164 // calculate bank and shift 1 to required position in the data byte 00165 buffer[x][y/8] |= (1 << y%8); 00166 } 00167 } 00168 00169 void N5110::clearPixel(int x, int y) 00170 { 00171 if (x>=0 && x<WIDTH && y>=0 && y<HEIGHT) { // check within range 00172 // calculate bank and shift 1 to required position (using bit clear) 00173 buffer[x][y/8] &= ~(1 << y%8); 00174 } 00175 } 00176 00177 int N5110::getPixel(int x, int y) 00178 { 00179 if (x>=0 && x<WIDTH && y>=0 && y<HEIGHT) { // check within range 00180 // return relevant bank and mask required bit 00181 return (int) buffer[x][y/8] & (1 << y%8); 00182 // note this does not necessarily return 1 - a non-zero number represents a pixel 00183 } else { 00184 return 0; 00185 } 00186 } 00187 00188 // function to refresh the display 00189 void N5110::refresh() 00190 { 00191 int i,j; 00192 00193 setXYAddress(0,0); // important to set address back to 0,0 before refreshing display 00194 // address auto increments after printing string, so buffer[0][0] will not coincide 00195 // with top-left pixel after priting string 00196 00197 sce->write(0); //set CE low to begin frame 00198 00199 for(j = 0; j < BANKS; j++) { // be careful to use correct order (j,i) for horizontal addressing 00200 for(i = 0; i < WIDTH; i++) { 00201 spi->write(buffer[i][j]); // send buffer 00202 } 00203 } 00204 sce->write(1); // set CE high to end frame 00205 00206 } 00207 00208 // fills the buffer with random bytes. Can be used to test the display. 00209 // The rand() function isn't seeded so it probably creates the same pattern everytime 00210 void N5110::randomiseBuffer() 00211 { 00212 int i,j; 00213 for(j = 0; j < BANKS; j++) { // be careful to use correct order (j,i) for horizontal addressing 00214 for(i = 0; i < WIDTH; i++) { 00215 buffer[i][j] = rand()%256; // generate random byte 00216 } 00217 } 00218 00219 } 00220 00221 // function to print 5x7 font 00222 void N5110::printChar(char c,int x,int y) 00223 { 00224 if (y>=0 && y<BANKS) { // check if printing in range of y banks 00225 00226 for (int i = 0; i < 5 ; i++ ) { 00227 int pixel_x = x+i; 00228 if (pixel_x > WIDTH-1) // ensure pixel isn't outside the buffer size (0 - 83) 00229 break; 00230 buffer[pixel_x][y] = font5x7[(c - 32)*5 + i]; 00231 // array is offset by 32 relative to ASCII, each character is 5 pixels wide 00232 } 00233 00234 refresh(); // this sends the buffer to the display and sets address (cursor) back to 0,0 00235 } 00236 } 00237 00238 // function to print string at specified position 00239 void N5110::printString(const char * str,int x,int y) 00240 { 00241 if (y>=0 && y<BANKS) { // check if printing in range of y banks 00242 00243 int n = 0 ; // counter for number of characters in string 00244 // loop through string and print character 00245 while(*str) { 00246 00247 // writes the character bitmap data to the buffer, so that 00248 // text and pixels can be displayed at the same time 00249 for (int i = 0; i < 5 ; i++ ) { 00250 int pixel_x = x+i+n*6; 00251 if (pixel_x > WIDTH-1) // ensure pixel isn't outside the buffer size (0 - 83) 00252 break; 00253 buffer[pixel_x][y] = font5x7[(*str - 32)*5 + i]; 00254 } 00255 00256 str++; // go to next character in string 00257 00258 n++; // increment index 00259 00260 } 00261 00262 refresh(); // this sends the buffer to the display and sets address (cursor) back to 0,0 00263 } 00264 } 00265 00266 // function to clear the screen 00267 void N5110::clear() 00268 { 00269 clearBuffer(); // clear the buffer then call the refresh function 00270 refresh(); 00271 } 00272 00273 // function to clear the buffer 00274 void N5110::clearBuffer() 00275 { 00276 int i,j; 00277 for (i=0; i<WIDTH; i++) { // loop through the banks and set the buffer to 0 00278 for (j=0; j<BANKS; j++) { 00279 buffer[i][j]=0; 00280 } 00281 } 00282 } 00283 00284 // function to plot array on display 00285 void N5110::plotArray(float array[]) 00286 { 00287 00288 int i; 00289 00290 for (i=0; i<WIDTH; i++) { // loop through array 00291 // elements are normalised from 0.0 to 1.0, so multiply 00292 // by 47 to convert to pixel range, and subtract from 47 00293 // since top-left is 0,0 in the display geometry 00294 setPixel(i,47 - int(array[i]*47.0)); 00295 } 00296 00297 refresh(); 00298 00299 } 00300 00301 // function to draw circle 00302 void N5110:: drawCircle(int x0,int y0,int radius,int fill) 00303 { 00304 // from http://en.wikipedia.org/wiki/Midpoint_circle_algorithm 00305 int x = radius; 00306 int y = 0; 00307 int radiusError = 1-x; 00308 00309 while(x >= y) { 00310 00311 // if transparent, just draw outline 00312 if (fill == 0) { 00313 setPixel( x + x0, y + y0); 00314 setPixel(-x + x0, y + y0); 00315 setPixel( y + x0, x + y0); 00316 setPixel(-y + x0, x + y0); 00317 setPixel(-y + x0, -x + y0); 00318 setPixel( y + x0, -x + y0); 00319 setPixel( x + x0, -y + y0); 00320 setPixel(-x + x0, -y + y0); 00321 } else { // drawing filled circle, so draw lines between points at same y value 00322 00323 int type = (fill==1) ? 1:0; // black or white fill 00324 00325 drawLine(x+x0,y+y0,-x+x0,y+y0,type); 00326 drawLine(y+x0,x+y0,-y+x0,x+y0,type); 00327 drawLine(y+x0,-x+y0,-y+x0,-x+y0,type); 00328 drawLine(x+x0,-y+y0,-x+x0,-y+y0,type); 00329 } 00330 00331 00332 y++; 00333 if (radiusError<0) { 00334 radiusError += 2 * y + 1; 00335 } else { 00336 x--; 00337 radiusError += 2 * (y - x) + 1; 00338 } 00339 } 00340 00341 } 00342 00343 void N5110::drawLine(int x0,int y0,int x1,int y1,int type) 00344 { 00345 int y_range = y1-y0; // calc range of y and x 00346 int x_range = x1-x0; 00347 int start,stop,step; 00348 00349 // if dotted line, set step to 2, else step is 1 00350 step = (type==2) ? 2:1; 00351 00352 // make sure we loop over the largest range to get the most pixels on the display 00353 // for instance, if drawing a vertical line (x_range = 0), we need to loop down the y pixels 00354 // or else we'll only end up with 1 pixel in the x column 00355 if ( abs(x_range) > abs(y_range) ) { 00356 00357 // ensure we loop from smallest to largest or else for-loop won't run as expected 00358 start = x1>x0 ? x0:x1; 00359 stop = x1>x0 ? x1:x0; 00360 00361 // loop between x pixels 00362 for (int x = start; x<= stop ; x+=step) { 00363 // do linear interpolation 00364 int y = y0 + (y1-y0)*(x-x0)/(x1-x0); 00365 00366 if (type == 0) // if 'white' line, turn off pixel 00367 clearPixel(x,y); 00368 else 00369 setPixel(x,y); // else if 'black' or 'dotted' turn on pixel 00370 } 00371 } else { 00372 00373 // ensure we loop from smallest to largest or else for-loop won't run as expected 00374 start = y1>y0 ? y0:y1; 00375 stop = y1>y0 ? y1:y0; 00376 00377 for (int y = start; y<= stop ; y+=step) { 00378 // do linear interpolation 00379 int x = x0 + (x1-x0)*(y-y0)/(y1-y0); 00380 00381 if (type == 0) // if 'white' line, turn off pixel 00382 clearPixel(x,y); 00383 else 00384 setPixel(x,y); // else if 'black' or 'dotted' turn on pixel 00385 00386 } 00387 } 00388 00389 } 00390 00391 void N5110::drawRect(int x0,int y0,int width,int height,int fill) 00392 { 00393 00394 if (fill == 0) { // transparent, just outline 00395 drawLine(x0,y0,x0+width,y0,1); // top 00396 drawLine(x0,y0+height,x0+width,y0+height,1); // bottom 00397 drawLine(x0,y0,x0,y0+height,1); // left 00398 drawLine(x0+width,y0,x0+width,y0+height,1); // right 00399 } else { // filled rectangle 00400 int type = (fill==1) ? 1:0; // black or white fill 00401 for (int y = y0; y<= y0+height; y++) { // loop through rows of rectangle 00402 drawLine(x0,y,x0+width,y,type); // draw line across screen 00403 } 00404 } 00405 00406 }
Generated on Wed Jul 13 2022 08:25:49 by
1.7.2
