This is the code used on my video series "Hybrid Supercapacitor Car Battery" for my own hardware monitoring system. THe videos can be found on madelectronengineering.com
Dependencies: BurstSPI Fonts INA219 mbed LPC1114_WakeInterruptIn
Fork of SharpMemoryLCD by
Diff: SharpLCD.h
- Revision:
- 0:0a76610c48a1
- Child:
- 1:1bd2b42b305d
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SharpLCD.h Sun Aug 23 16:21:57 2015 +0000 @@ -0,0 +1,305 @@ + +#ifndef MBED_SharpLCD_H +#define MBED_SharpLCD_H + +#include "mbed.h" +#include <stdarg.h> +#include "BurstSPI.h" + +#define incx() x++, dxt += d2xt, t += dxt +#define incy() y--, dyt += d2yt, t += dyt + +/// Set the display geometry depending on the resolution of the display used +/// common types are 96x96, 128x128, 400x240 +/** MemoryLCD width in pixels */ +#define DISPLAY_WIDTH (400) +/** MemoryLCD height in pixels */ +#define DISPLAY_HEIGHT (240) + +/** Maximum length of a printf to the display */ +#define MAX_PRINTF_CHARS 40 +/** Data type for storing buffer the pixel buffer */ +#define DISPLAY_BUFFER_TYPE uint8_t +#define DISPLAY_BUFFER_TYPE_SIZE (sizeof(DISPLAY_BUFFER_TYPE) * 8) +#define DISPLAY_BUFFER_ELEMENTS ((DISPLAY_WIDTH*DISPLAY_HEIGHT)/DISPLAY_BUFFER_TYPE_SIZE) + +/** Color definitions */ +#define White 0xFFFF +#define Black 0x0000 +#define foreground White +#define background Black + +/** Sharp Memory LCD. + * Supports 96x96, 128x128, 400x240 displays. + * Uses a Frame Buffer in RAM depending on resolution of display as follows: + * 96 Display - 1.7k, 128 Display - 2.6k, 400 Display - 12.4k + * + * Example: + * @code +#include "mbed.h" +#include "SharpLCD.h" + +//KL25 +SharpLCD display(PTC6, NC, PTC5, PTC3, PTC4, NC); //mosi, miso(not used), sck, cs, enable, extcom + +int main() +{ + display.enableDisplay(); + + while(1) + { + display.clearImmediate(); + // draw ellipse (To draw circle, set the last two axis the same) + for (int j=0; j<60; j++) { + display.ellipse(64,64,j,60,Black); + display.update(); + //wait(.01); + display.ellipse(64,64,j,50,White); // offset last axis here gives interesting effect! + display.locate(5,6); + display.printf("Sharp"); + display.locate(2,8); + display.printf("Draw Ellipse"); + display.locate(4,10); + display.printf("MemoryLCD"); + display.update(); + } + // draw rectangle + for (int j=0; j<128; j++) { + display.rect(0,0,j,j,Black); + display.update(); + //wait(.01); + display.rect(0,0,j,j,White); + display.locate(5,6); + display.printf("Sharp"); + display.locate(1,8); + display.printf("Draw Rectangle"); + display.locate(4,10); + display.printf("MemoryLCD"); + display.update(); + } + for (int j=60; j>0; j--) { + display.circle(64,64,j,Black); + display.update(); + wait(.01); + display.circle(64,64,j,White); + display.locate(5,6); + display.printf("Sharp"); + display.locate(2,8); + display.printf("Draw Circle"); + display.locate(4,10); + display.printf("MemoryLCD"); + display.update(); + } + } +} + * @endcode + */ + + +class SharpLCD { +public: + + SharpLCD(PinName mosi, PinName miso, PinName sclk, PinName cs, PinName enable, PinName extcom); + + /** + * Sets external font usage, eg. dispaly.set_font(Arial12x12); + * This uses pixel positioning. + * display.set_font(NULL); returns to internal default font. + * void set_font(const unsigned char * f); + */ + void set_font(const unsigned char * f); + /** + * Sets position of the next character or string print. + * External font, set pixel x(column),y(row) position. + * internal(default) font, set character column and row position + */ + void locate(int column, int row); + /** + * printf (from Stream). + * Full printf funtionality only available with internal(default) font. + * CR and LF have no effect with external fonts. + */ + void printf(const char* format, ...); + /** + * Enables (power) display. + */ + void enableDisplay(void); + /** + * Dissables (power) display. + */ + void disableDisplay(void); + /** + * Set a pixel in the pixel buffer. + * + * @param x X-Position. + * @param y Y-Position. + * @param colour Colour to set pixel to. White or Black. + */ + void pixel(int x, int y, int colour); + /** + * Draw rectangle one pixel wide (wire frame) in the pixel buffer. + * + * @param x0 X-Start position. + * @param y0 Y-Start position. + * @param x1 X-End position. + * @param y1 Y-End position. + * @param colour Colour to set pixel to. White or Black. + */ + void rect(int x0, int y0, int x1, int y1, int colour); + /** + * Draw filled rectangle in the pixel buffer. + * + * @param x0 X-Start position. + * @param y0 Y-Start position. + * @param w Width. + * @param h Height. + * @param colour Colour to fill rectangle to. White or Black. + */ + void fillrect(int x0, int y0, int w, int h, int colour); + /** + * Draw Circle one pixel wide in the pixel buffer. + * + * @param x0 X-Centre position. + * @param y0 Y-Centre position. + * @param r Radius. + * @param colour Colour to set pixel to. White or Black. + */ + void circle(int x, int y, int r, int colour); + /** + * Draw Ellipse or Circle one pixel wide in the pixel buffer. + * Set v & h to same values to produce a circle. + + * @param xc X-Centre position. + * @param yc Y-Centre position. + * @param v Vertical radius. + * @param h Horizontal radius. + * @param colour Colour to set pixel to. White or Black. + */ + void ellipse(int xc, int yc, int v, int h, unsigned int colour); + /** + * Draw Filled Ellipse or Circle in the pixel buffer. + * Set v & h to same values to produce a circle. + + * @param xc X-Centre position. + * @param yc Y-Centre position. + * @param v Vertical radius. + * @param h Horizontal radius. + * @param colour Colour to set pixel to. White or Black. + */ + void fillellipse(int xc, int yc, int v, int h, unsigned int colour); + /** + * Draw a horizontal line one pixel wide in the pixel buffer. + * + * @param x0 X-Start position. + * @param x1 X-End position. + * @param y Y-position. + * @param colour Colour to set pixel to. White or Black. + */ + void hline(int x0, int x1, int y, int colour); + /** + * Draw a Vertical line one pixel wide in the pixel buffer. + * + * @param x0 X-Position. + * @param y0 Y-Start position. + * @param y1 Y-End position. + * @param colour Colour to set pixel to. White or Black. + */ + void vline(int x0, int y0, int y1, int colour); + /** + * Draw a Line in the pixel buffer. + * + * @param x0 X-Start position. + * @param y0 Y-Start position. + * @param x1 X-End position. + * @param y1 Y-End position. + * @param colour Colour to fill rectangle to. White or Black. + */ + void line(int x0, int y0, int x1, int y1, int colour); + /** + * Toggles the EXTCOM connection to the display if used. + * Call this function at 55 ~ 65 Hz to keep the display from losing contrast. + */ + void toggle(); + /** + * Transfers pixel buffer to the display + */ + void update(); + /** + * Clear the display & set pixel buffer to zero. + */ + void clearImmediate(); + /** + * Move bitmap into pixel buffer + * + * @param bitmap pointer to uint8 array containing horizontal pixel data + * @param bmpWidth width of the bitmap in pixels (must be byte multiple, eg 8,16,32,...) + * @param bmpHeight height of the bitmap in pixels (must be byte multiple, eg 8,16,32,...) + * @param startX starting position to apply bitmap in horizontal direction (0 = leftmost) (pixel resolution) + * @param startY starting position to apply bitmap in vertical direction (0 = topmost) (pixel resolution) + */ + void showBMP(const uint8_t* bitmap, const uint32_t bmpWidth, const uint32_t bmpHeight, const uint32_t startX, const uint32_t startY); + /** Output a character at the given position + * + * @param column column where charater must be written + * @param row where character must be written + * @param c the character to be written to the TextDisplay + */ + void character(int column, int row, int c); + + /** return number if rows on TextDisplay + * @result number of rows + */ + int rows(); + /** return number if columns on TextDisplay + * @result number of rows + */ + int columns(); + +private: + void window(int x, int y, int w, int h); + void putp(int colour); + void blit(int x, int y, int w, int h, const int *colour); + void blitbit(int x, int y, int w, int h, const char* colour); +protected: + //SPI spi; // standard SPI + BurstSPI spi; // Faster SPI pixel buffer transfer + DigitalOut chipSelect; + DigitalOut Enable; + DigitalOut ExtCom; + + uint8_t lcdPolarity; + volatile uint32_t rowCount; + uint8_t cmd[2 + (DISPLAY_WIDTH / DISPLAY_BUFFER_TYPE_SIZE * sizeof(DISPLAY_BUFFER_TYPE))]; + volatile DISPLAY_BUFFER_TYPE pixelBuffer[DISPLAY_BUFFER_ELEMENTS]; // one full frame buffer + volatile DISPLAY_BUFFER_TYPE RowState[DISPLAY_HEIGHT/DISPLAY_BUFFER_TYPE_SIZE]; // 1 bit per row to indicate row change status + + // transfers pixel buffer to display + void display_write(); + + // pixel location + short _x; + short _y; + + // window location + short _x1; + short _x2; + short _y1; + short _y2; + + int _putc(int value); + int _getc(); + int width(); + int height(); + + // external font functions + const unsigned char* font; + int externalfont; + + // character location + int _column; + int _row; + unsigned int char_x; + unsigned int char_y; + +}; +#endif \ No newline at end of file