a modified version of N5110 library to be used with freescale boards
Revision 7:77bd2c73fe41, committed 2014-05-22
- Comitter:
- Francesco Fantoni
- Date:
- Thu May 22 21:50:41 2014 +0200
- Parent:
- 6:adb79338d40f
- Commit message:
- initial commit
Changed in this revision
--- a/N5110.cpp Mon Jan 27 18:41:45 2014 +0000 +++ b/N5110.cpp Thu May 22 21:50:41 2014 +0200 @@ -12,14 +12,17 @@ { spi = new SPI(mosiPin,NC,sclkPin); // create new SPI instance and initialise - initSPI(); - + spi->format(LCD_SPI_BITS, LCD_SPI_MODE); + spi->frequency(LCD_FREQ); + // set up pins as required led = new PwmOut(ledPin); - pwr = new DigitalOut(pwrPin); + //pwr = new DigitalOut(pwrPin); sce = new DigitalOut(scePin); rst = new DigitalOut(rstPin); dc = new DigitalOut(dcPin); + W = 83; + H = 47; } @@ -64,13 +67,13 @@ { // set brightness of LED - 0.0 to 1.0 - default is 50% setBrightness(0.5); - pwr->write(1); // apply power + //led->write(0); // apply power } // function to power down LCD void N5110::turnOff() { - setBrightness(0.0); // turn backlight off + setBrightness(1.0); // turn backlight off clearRAM(); // clear RAM to ensure specified current consumption // send command to ensure we are in basic model sendCommand(0x20 | CMD_FS_ACTIVE_MODE | CMD_FS_HORIZONTAL_MODE | CMD_FS_BASIC_MODE); @@ -80,7 +83,7 @@ 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); - pwr->write(0); + // pwr->write(1); } @@ -104,21 +107,16 @@ rst->write(1); } -// function to initialise SPI peripheral -void N5110::initSPI() -{ - 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 - spi->frequency(4000000); // maximum of screen is 4 MHz -} + // send a command to the display void N5110::sendCommand(unsigned char command) { dc->write(0); // set DC low for command - sce->write(0); // set CE low to begin frame + //sce->write(0); // set CE low to begin frame spi->write(command); // send command dc->write(1); // turn back to data by default - sce->write(1); // set CE high to end frame (expected for transmission of single byte) + //sce->write(1); // set CE high to end frame (expected for transmission of single byte) } @@ -127,20 +125,20 @@ // be the default mode. void N5110::sendData(unsigned char data) { - sce->write(0); // set CE low to begin frame + //sce->write(0); // set CE low to begin frame spi->write(data); - sce->write(1); // set CE high to end frame (expected for transmission of single byte) + //sce->write(1); // set CE high to end frame (expected for transmission of single byte) } // this function writes 0 to the 504 bytes to clear the RAM void N5110::clearRAM() { int i; - sce->write(0); //set CE low to begin frame + //sce->write(0); //set CE low to begin frame for(i = 0; i < 504; i++) { // 48 x 84 bits = 504 bytes spi->write(0x00); // send 0's } - sce->write(1); // set CE high to end frame + //sce->write(1); // set CE high to end frame } @@ -176,6 +174,101 @@ buffer[x][y/8] &= ~(1 << y%8); } +void N5110::drawHline(int x, int y, int l) +{ + for(int i=0; i<l; i++) + { + int ps = x+i; + if ((ps < 84 && ps >= 0) && (y<48 && y>=0)) { + buffer[ps][y/8] |= (1 << y%8); + //refresh(); + } + + } + refresh(); +} + +void N5110::drawVline(int x, int y, int l) +{ + for(int i=0; i<l; i++) + { + int ps = y+i; + if ((ps < 48 && ps >= 0) && (x<84 && x>=0)){ + buffer[x][ps/8] |= (1 << ps%8); + //refresh(); + } + } + refresh(); +} + +void N5110::drawRectangle(int x, int y, int w, int h) +{ + drawHline(x,y,w); + drawVline(x+w,y,h); + drawHline(x,y+h,w); + drawVline(x,y,h); +} + +void N5110::drawGrid(int stepx, int stepy) +{ + for (int y=0; y<47; y += stepy){ + for(int x=0; x<84; x++){ + setPixel(x,y); + } + refresh(); + } + for (int x=0; x<84; x += stepx){ + for(int y=0; y<47; y++){ + setPixel(x,y); + } + refresh(); + } +} + +// draw line between two points using C implementation of Bresenham's line algorithm +void N5110::drawLine(int x0, int y0, int x1, int y1) { + + int dx = abs(x1-x0), sx = x0<x1 ? 1 : -1; + int dy = abs(y1-y0), sy = y0<y1 ? 1 : -1; + int err = (dx>dy ? dx : -dy)/2, e2; + + for(;;){ + if ((x0 < 84 && x0 >= 0) && (y0<47 && y0>=0)) { + buffer[x0][y0/8] |= (1 << y0%8); + } + if (x0==x1 && y0==y1) break; + e2 = err; + if (e2 >-dx) { err -= dy; x0 += sx; } + if (e2 < dy) { err += dx; y0 += sy; } + } + refresh(); +} + + +void N5110::drawLineAngle(int x0, int y0, int l, float angle) { + float radian = 0-angle * (M_PI/180); + int x1 = x0 + (l*cos(radian)); + int y1 = y0 + (l*sin(radian)); + drawLine(x0,y0,x1,y1); +} + + +void N5110::drawCircle(int x, int y, int radius, int divisions) { + + float angleIncrement = M_PI * 2 / divisions; + double tempAngle = 0.0; + + for (int i = 0; i < divisions; ++i) { + double px = cos(tempAngle) * radius + x; + double py = sin(tempAngle) * radius + y; + if ((px < 84 && px >= 0) && (py<47 && py>=0)) { + buffer[(int)px][(int)py/8] |= (1 << (int)py%8); + } + tempAngle += angleIncrement; + } + refresh(); +} + unsigned char N5110::getPixel(int x, int y) { // return relevant bank and mask required bit @@ -187,14 +280,14 @@ void N5110::refresh() { int i,j; - sce->write(0); //set CE low to begin frame + // sce->write(0); //set CE low to begin frame for(j = 0; j < 6; j++) { // be careful to use correct order (j,i) for horizontal addressing for(i = 0; i < 84; i++) { spi->write(buffer[i][j]); // send buffer } } - sce->write(1); // set CE high to end frame + // sce->write(1); // set CE high to end frame } @@ -217,7 +310,21 @@ int i; // loop through 5 columns for (i = 0; i < 5 ; i++ ) { - sendData(font5x7[(c - 32)*5 + i]); + sendData((font5x7[(c - 32)*5 + i])); + // array is offset by 32 relative to ASCII, each character is 5 pixels wide + // the X address is automatically incremented after each data write + } + sendData(0); // send an empty byte to introduce space between characters + +} + +// function to print 6x7 negative font +void N5110::printNegChar(char c) +{ + int i; + // loop through 5 columns + for (i = 0; i < 6 ; i++ ) { + sendData(~(font6x7[(c - 32)*6 + i])); // array is offset by 32 relative to ASCII, each character is 5 pixels wide // the X address is automatically incremented after each data write } @@ -240,6 +347,21 @@ } +// function to print string at specified position +void N5110::printNegString(const char * str,int x,int y) +{ + int n = 0 ; // counter for number of characters in string + // loop through string and print character + while(*str) { + + setXYAddress(x+6*n,y); // leave 1 pixel (6 = 5 + 1) between each character + printNegChar(*str); // print the char - can probably so *str++ and remove next line + str++; // go to next character in string + n++; // increment index + } + +} + // function to clear the screen void N5110::clear() { @@ -256,4 +378,4 @@ buffer[i][j]=0; } } -} \ No newline at end of file +}
--- a/N5110.h Mon Jan 27 18:41:45 2014 +0000 +++ b/N5110.h Thu May 22 21:50:41 2014 +0200 @@ -32,7 +32,18 @@ #define CMD_VOP_6V06 0xB2 #define CMD_VOP_7V38 0xC8 +// LCD Characteristics +#define LCD_FREQ 2000000 +#define LCD_SPI_MODE 0x01 +#define LCD_SPI_BITS 0x08 +#define LCD_X_MAX 84 +#define LCD_Y_MAX 48 + +// MATH CONSTANTS +//# define PI 3.14159265358979323846 /* pi */ + #include "mbed.h" +#include <math.h> /** @brief Simple library for interfacing with Nokia 5110 LCD display (https://www.sparkfun.com/products/10168) using the hardware SPI on the mbed. @@ -142,6 +153,8 @@ */ void printString(const char * str,int x,int y); + void printNegString(const char * str,int x,int y); + /** Print Character * * Sends a character to the display. Will be printed at the current address. @@ -150,6 +163,8 @@ */ void printChar(char c); + void printNegChar(char c); + /** Set a Pixel * * This function sets a pixel in the display. A call to refresh() must be made @@ -166,6 +181,21 @@ * @param x - the x co-ordinate of the pixel (0 to 83) * @param y - the y co-ordinate of the pixel (0 to 47) */ + + void drawHline(int x, int y, int l); + + void drawVline(int x, int y, int l); + + void drawRectangle(int x, int y, int w, int h); + + void drawGrid(int stepx, int stepy); + + void drawLine(int x0, int y0, int x1, int y1); + + void drawLineAngle(int x0, int y0, int l, float angle); + + void drawCircle(int x, int y, int radius, int divisions); + void clearPixel(int x, int y); /** Get a Pixel @@ -195,7 +225,7 @@ void randomiseBuffer(); private: - void initSPI(); + void turnOn(); void reset(); void clearRAM(); @@ -205,6 +235,8 @@ public: unsigned char buffer[84][6]; // screen buffer - the 6 is for the banks - each one is 8 bits; + int W; + int H; private: // private variables SPI* spi; @@ -315,4 +347,103 @@ 0x08, 0x1C, 0x2A, 0x08, 0x08 // <- }; -#endif \ No newline at end of file +const unsigned char font6x7[576] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char space + 0x00, 0x2E, 0x00, 0x00, 0x00, 0x00, // Code for char ! + 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, // Code for char " + 0x14, 0x3E, 0x14, 0x3E, 0x14, 0x00, // Code for char # + 0x2E, 0x2A, 0x3E, 0x2A, 0x3A, 0x00, // Code for char $ + 0x26, 0x16, 0x08, 0x34, 0x32, 0x00, // Code for char % + 0x36, 0x2A, 0x2A, 0x36, 0x10, 0x28, // Code for char & + 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char ' + 0x1C, 0x22, 0x00, 0x00, 0x00, 0x00, // Code for char ( + 0x22, 0x1C, 0x00, 0x00, 0x00, 0x00, // Code for char ) + 0x0A, 0x04, 0x0A, 0x00, 0x00, 0x00, // Code for char * + 0x08, 0x08, 0x3E, 0x08, 0x08, 0x00, // Code for char + + 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char , + 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, // Code for char - + 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char . + 0x20, 0x10, 0x08, 0x04, 0x02, 0x00, // Code for char / + 0x1C, 0x22, 0x22, 0x22, 0x1C, 0x00, // Code for char 0 + 0x22, 0x3E, 0x20, 0x00, 0x00, 0x00, // Code for char 1 + 0x3A, 0x2A, 0x2A, 0x2A, 0x2E, 0x00, // Code for char 2 + 0x2A, 0x2A, 0x2A, 0x2A, 0x3E, 0x00, // Code for char 3 + 0x18, 0x14, 0x12, 0x3E, 0x10, 0x00, // Code for char 4 + 0x2E, 0x2A, 0x2A, 0x2A, 0x3A, 0x00, // Code for char 5 + 0x3E, 0x2A, 0x2A, 0x2A, 0x3A, 0x00, // Code for char 6 + 0x02, 0x22, 0x12, 0x0A, 0x06, 0x00, // Code for char 7 + 0x3E, 0x2A, 0x2A, 0x2A, 0x3E, 0x00, // Code for char 8 + 0x2E, 0x2A, 0x2A, 0x2A, 0x3E, 0x00, // Code for char 9 + 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char : + 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char ; + 0x08, 0x14, 0x22, 0x00, 0x00, 0x00, // Code for char < + 0x14, 0x14, 0x14, 0x14, 0x14, 0x00, // Code for char = + 0x22, 0x14, 0x08, 0x00, 0x00, 0x00, // Code for char > + 0x02, 0x02, 0x2A, 0x0A, 0x0E, 0x00, // Code for char ? + 0x3E, 0x22, 0x3A, 0x2A, 0x3E, 0x00, // Code for char @ + 0x3E, 0x0A, 0x0A, 0x0A, 0x3E, 0x00, // Code for char A + 0x3E, 0x2A, 0x2A, 0x2A, 0x1C, 0x00, // Code for char B + 0x3E, 0x22, 0x22, 0x22, 0x22, 0x00, // Code for char C + 0x3E, 0x22, 0x22, 0x22, 0x1C, 0x00, // Code for char D + 0x3E, 0x2A, 0x2A, 0x2A, 0x2A, 0x00, // Code for char E + 0x3E, 0x0A, 0x0A, 0x0A, 0x0A, 0x00, // Code for char F + 0x3E, 0x22, 0x2A, 0x2A, 0x3A, 0x00, // Code for char G + 0x3E, 0x08, 0x08, 0x08, 0x3E, 0x00, // Code for char H + 0x22, 0x3E, 0x22, 0x00, 0x00, 0x00, // Code for char I + 0x10, 0x20, 0x22, 0x22, 0x1E, 0x00, // Code for char J + 0x3E, 0x08, 0x08, 0x14, 0x22, 0x00, // Code for char K + 0x3E, 0x20, 0x20, 0x20, 0x20, 0x00, // Code for char L + 0x3E, 0x04, 0x08, 0x04, 0x3E, 0x00, // Code for char M + 0x3E, 0x04, 0x08, 0x10, 0x3E, 0x00, // Code for char N + 0x3E, 0x22, 0x22, 0x22, 0x3E, 0x00, // Code for char O + 0x3E, 0x0A, 0x0A, 0x0A, 0x0E, 0x00, // Code for char P + 0x3E, 0x22, 0x22, 0x32, 0x3E, 0x00, // Code for char Q + 0x3E, 0x0A, 0x0A, 0x3A, 0x2E, 0x00, // Code for char R + 0x2E, 0x2A, 0x2A, 0x2A, 0x3A, 0x00, // Code for char S + 0x02, 0x02, 0x3E, 0x02, 0x02, 0x00, // Code for char T + 0x3E, 0x20, 0x20, 0x20, 0x3E, 0x00, // Code for char U + 0x0E, 0x10, 0x20, 0x10, 0x0E, 0x00, // Code for char V + 0x1E, 0x20, 0x1E, 0x20, 0x1E, 0x00, // Code for char W + 0x22, 0x14, 0x08, 0x14, 0x22, 0x00, // Code for char X + 0x06, 0x08, 0x30, 0x08, 0x06, 0x00, // Code for char Y + 0x22, 0x32, 0x2A, 0x26, 0x22, 0x00, // Code for char Z + 0x3E, 0x22, 0x00, 0x00, 0x00, 0x00, // Code for char [ + 0x02, 0x04, 0x08, 0x10, 0x20, 0x00, // Code for char BackSlash + 0x22, 0x3E, 0x00, 0x00, 0x00, 0x00, // Code for char ] + 0x04, 0x02, 0x04, 0x00, 0x00, 0x00, // Code for char ^ + 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, // Code for char _ + 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, // Code for char ` + 0x3E, 0x0A, 0x0A, 0x0A, 0x3E, 0x00, // Code for char a + 0x3E, 0x2A, 0x2A, 0x2A, 0x1C, 0x00, // Code for char b + 0x3E, 0x22, 0x22, 0x22, 0x22, 0x00, // Code for char c + 0x3E, 0x22, 0x22, 0x22, 0x1C, 0x00, // Code for char d + 0x3E, 0x2A, 0x2A, 0x2A, 0x2A, 0x00, // Code for char e + 0x3E, 0x0A, 0x0A, 0x0A, 0x0A, 0x00, // Code for char f + 0x3E, 0x22, 0x2A, 0x2A, 0x3A, 0x00, // Code for char g + 0x3E, 0x08, 0x08, 0x08, 0x3E, 0x00, // Code for char h + 0x22, 0x3E, 0x22, 0x00, 0x00, 0x00, // Code for char i + 0x10, 0x20, 0x22, 0x22, 0x1E, 0x00, // Code for char j + 0x3E, 0x08, 0x08, 0x14, 0x22, 0x00, // Code for char k + 0x3E, 0x20, 0x20, 0x20, 0x20, 0x00, // Code for char l + 0x3E, 0x04, 0x08, 0x04, 0x3E, 0x00, // Code for char m + 0x3E, 0x04, 0x08, 0x10, 0x3E, 0x00, // Code for char n + 0x3E, 0x22, 0x22, 0x22, 0x3E, 0x00, // Code for char o + 0x3E, 0x0A, 0x0A, 0x0A, 0x0E, 0x00, // Code for char p + 0x3E, 0x22, 0x22, 0x32, 0x3E, 0x00, // Code for char q + 0x3E, 0x0A, 0x0A, 0x3A, 0x2E, 0x00, // Code for char r + 0x2E, 0x2A, 0x2A, 0x2A, 0x3A, 0x00, // Code for char s + 0x02, 0x02, 0x3E, 0x02, 0x02, 0x00, // Code for char t + 0x3E, 0x20, 0x20, 0x20, 0x3E, 0x00, // Code for char u + 0x0E, 0x10, 0x20, 0x10, 0x0E, 0x00, // Code for char v + 0x1E, 0x20, 0x1E, 0x20, 0x1E, 0x00, // Code for char w + 0x22, 0x14, 0x08, 0x14, 0x22, 0x00, // Code for char x + 0x06, 0x08, 0x30, 0x08, 0x06, 0x00, // Code for char y + 0x22, 0x32, 0x2A, 0x26, 0x22, 0x00, // Code for char z + 0x08, 0x36, 0x22, 0x00, 0x00, 0x00, // Code for char { + 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, // Code for char | + 0x22, 0x36, 0x08, 0x00, 0x00, 0x00, // Code for char } + 0x04, 0x02, 0x04, 0x02, 0x00, 0x00, // Code for char ~ + 0x3F, 0x21, 0x3F, 0x00, 0x00, 0x00 // Code for char +}; + +#endif
Binary file N5110.o has changed