![](/media/cache/profiles/301b144af4d1614dbcf92f9710be50fb.jpg.50x50_q85.jpg)
Emulation of the 1970's Chip-8 machine. The emulator has 7 games that are unmodified from the original Chip-8 format.
Diff: LCD_ST7735/LCD_ST7735.h
- Revision:
- 0:bc3f11b1b41f
diff -r 000000000000 -r bc3f11b1b41f LCD_ST7735/LCD_ST7735.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/LCD_ST7735/LCD_ST7735.h Sun Feb 08 01:58:57 2015 +0000 @@ -0,0 +1,353 @@ +/////////////////////////////////////////////////////////////////////////////// +// LCD_ST7735 - Driver for ST7735 LCD display controller +// Author: Chris Taylor (taylorza) +#include "mbed.h" +#include "Bitmap1bpp.h" + +#ifndef __LCD_ST7735__ +#define __LCD_ST7735__ +/** LCD_ST7735 is a simple driver for the ST7735 LCD controller. It provides basic drawing primitives sa well as text and font capabilities. + * The driver is currently hardcoded to support 65K colors using a 565 RGB pixel format. +*/ +class LCD_ST7735 +{ + public: + /** Orientation of the display */ + enum Orientation + { + /** No rotation of the display image*/ + Rotate0, + /** Rotate the display image 90 degrees */ + Rotate90, + /** Rotate the display image 180 degrees */ + Rotate180, + /** Rotate the display image 270 degrees */ + Rotate270 + }; + + /** Type of color filter of the panel */ + enum PanelColorFilter + { + /** RGB color filter panel */ + RGB = 0, + + /** BGR color filter panel */ + BGR = 8, + }; + + public: + /**Creates an instance of the LCD_ST7735 driver + * @param backlightPin pin used to control the backlight + * @param resetPin pin used to reset the display controller + * @param dsPin pin used to put the display controller into data mode + * @param mosiPin SPI channel MOSI pin + * @param misoPin SPI channel MISO pin + * @param clkPin SPI channel clock pin + * @param csPin SPI chip select pin + */ + LCD_ST7735( + PinName backlightPin, + PinName resetPin, + PinName dsPin, + PinName mosiPin, + PinName misoPin, + PinName clkPin, + PinName csPin, + PanelColorFilter colorFilter = BGR + ); + + /** Set the orientation of the display + * @param orientation Orientation of the display. + * @param flip Flips the display direction + */ + void setOrientation(Orientation orientation, bool flip); + + /** Get the width of the display given the current orientation */ + int getWidth(); + + /** Get the height of the display given the current orientation */ + int getHeight(); + + /** Control the display's backlight + * @param state true to turn the backlight on, false to turn it off + */ + void setBacklight(bool state); + + /** Set the palette used for 4 and 2 bpp bitmaps. + * @param palette array of Color565 color entries + */ + void setPalette(uint16_t *palette); + + /** Clear the screen + * @param color The color used to clear the screen. Defaults to black if not passed. + */ + void clearScreen(uint16_t color = 0x0000); + + /** Set a pixel on the display to the specified color + * @param x The X coordinate of the pixel (0..127) + * @param y The Y coordinate of the pixel (0..159) + * @param color Color to set the pixel to. + */ + void setPixel(int x, int y, uint16_t color); + + /** Draw a line on the display + * @param x1 The X coordinate of the starting point on the line + * @param y1 The Y coordinate of the starting point on the line + * @param x2 The X coordinate of the end point on the line + * @param y2 The Y coordinate of the end point on the line + * @param color The color used to draw the pixel + */ + void drawLine(int x1, int y1, int x2, int y2, uint16_t color); + + /** Draw a rectangle on the display + * @param x1 The X coordinate of the upper left corner + * @param y1 The Y coordinate of the upper left corner + * @param x2 The X coordinate of the lower right corner + * @param y2 The Y coordinate of the lower right corner + * @param color The color used to draw the rectangle + */ + void drawRect(int x1, int y1, int x2, int y2, uint16_t color); + + /** Draw a circle on the display + * @param x The X coordinate of the center of the circle + * @param y The Y coordinate of the center of the circle + * @param r The radius of the circle + * @param color The color used to draw the circle + */ + void drawCircle(int x, int y, int r, uint16_t color); + + /** Draw an ellipse on the display + * @param x The X coordinate of the center of the ellipse + * @param y The Y coordinate of the center of the ellipse + * @param rx The X radius of the ellipse + * @param ry The X radius of the ellipse + * @param color The color used to draw the ellipse + */ + void drawEllipse(int x, int y, int rx, int ry, uint16_t color); + + /** Draw a filled rectangle on the display + * @param x1 The X coordinate of the upper left corner + * @param y1 The Y coordinate of the upper left corner + * @param x2 The X coordinate of the lower right corner + * @param y2 The Y coordinate of the lower right corner + * @param fillColor The color used to fill the rectangle + */ + void fillRect(int x1, int y1, int x2, int y2, uint16_t fillColor); + + /** Draw a filled rectangle on the display + * @param x1 The X coordinate of the upper left corner + * @param y1 The Y coordinate of the upper left corner + * @param x2 The X coordinate of the lower right corner + * @param y2 The Y coordinate of the lower right corner + * @param borderColor The color used to draw the rectangle frame + * @param fillColor The color used to fill the rectangle + */ + void fillRect(int x1, int y1, int x2, int y2, uint16_t borderColor, uint16_t fillColor); + + /** Draw a filled circle on the display + * @param x The X coordinate of the center of the circle + * @param y The Y coordinate of the center of the circle + * @param borderColor The color used to draw the circumference of the circle + * @param fillColor The color used to fill the circle + */ + void fillCircle(int x, int y, int r, uint16_t borderColor, uint16_t fillColor); + + /** Draw a filled ellipse on the display + * @param x The X coordinate of the center of the ellipse + * @param y The Y coordinate of the center of the ellipse + * @param rx The X radius of the ellipse + * @param ry The X radius of the ellipse + * @param borderColor The color used to draw the circumference of the circle + * @param fillColor The color used to fill the circle + */ + void fillEllipse(int x, int y, int rx, int ry, uint16_t borderColor, uint16_t fillColor); + + /** Draw a bitmap on the screen + * @param x The X coordinate location to draw the bitmap. + * @param y The Y coordinate location to draw the bitmap. + * @param pbmp Pointer to the bitmap. + * @note The bitmap is an single dimensional uint8_t (unsigned short) array. + * The first to elements of the array indicate the width and height of the bitmap repectively. + * The rest of the entries int the array make up the pixel data for the array. + */ + void drawBitmap(int x, int y, const uint16_t *pbmp); + + /** Extracts a portion of a bitmap and draws it on the screen + * @param x The X coordinate location to draw the bitmap. + * @param y The Y coordinate location to draw the bitmap. + * @param pbmp Pointer to the bitmap. + * @param srcX X offset into the source bitmap of the portion to extract + * @param srcY Y offset into the source bitmap of the portion to extract + * @param srcWidth Width of the bitmap portion to draw + * @param srcHeight Height of the bitmap portion to draw + * @note The bitmap is an single dimensional uint8_t (unsigned short) array. + * The first to elements of the array indicate the width and height of the bitmap repectively. + * The rest of the entries int the array make up the pixel data for the array. + */ + void drawBitmap(int x, int y, const uint16_t *pbmp, int srcX, int srcY, int srcWidth, int srcHeight); + + /** Extracts a portion of a bitmap and draws it on the screen + * @param x The X coordinate location to draw the bitmap. + * @param y The Y coordinate location to draw the bitmap. + * @param bmp refence to a 1-bpp bitmap. + * @param srcX X offset into the source bitmap of the portion to extract + * @param srcY Y offset into the source bitmap of the portion to extract + * @param srcWidth Width of the bitmap portion to draw + * @param srcHeight Height of the bitmap portion to draw + * @param foregroundColor Color to use for pixels in the bitmap + * @param backgroundColor Color to use for off pixels in the bitmap + */ + void drawBitmap(int x, int y, Bitmap1bpp &bmp, int srcX, int srcY, int srcWidth, int srcHeight, uint16_t foregroundColor, uint16_t backgroundColor); + + /** Set the foreground color used to render text + * @param color Color used when drawing text to the display + * @note The color can be changed multiple times to render text in various colors on the display + */ + void setForegroundColor(uint16_t color); + + /** Set the background color used to render text + * @param color Color used when drawing background portions of the text + * @note The color can be changed multiple times to render text with various background colors on the display + */ + void setBackgroundColor(uint16_t color); + + /** Draw a string to the screen using the currently active foreground and background colors + * @param pFont Pointer to the font used to render the string to the display + * @param x The X coordinate location to draw the string. + * @param y The Y coordinate location to draw the string. + * @param pString ASCIIZ string to draw to the display. + */ + void drawString(const uint8_t *pFont, int x, int y, const char *pString); + + /** Measure the width and height of the string when rendered with the specified font + * @param pFont Pointer to the font used to measure the string + * @param pString ASCIIZ string to measure. + * @param width Reference to the variable that will contain the width + * @param height Reference to the variable that will contain the height + */ + void measureString(const uint8_t *pFont, const char *pString, uint8_t &width, uint8_t &height); + + /** Select the device on the SPI bus. + selectDevice needs to be called before accessing the screen if there are multiple devices on the SPI bus. + */ + void selectDevice(); + + protected: + void writeCommand(uint8_t cmd); + void write(uint8_t cmd, uint8_t data[], int dataLen); + void write(uint8_t cmd, uint16_t data); + + void beginBatchCommand(uint8_t cmd); + void writeBatchData(uint8_t data); + void writeBatchData(uint8_t dataHigh, uint8_t dataLow); + void writeBatchData(uint16_t data); + void endBatchCommand(); + + void clip(int x, int y, int w, int h); + void clipRect(int x1, int y1, int x2, int y2); + + private: + void drawVertLine(int x1, int y1, int y2, uint16_t color); + void drawHorizLine(int x1, int y1, int x2, uint16_t color); + void drawChar(const uint8_t *pFont, int x, int y, char c, uint8_t w, uint8_t h, uint8_t offset, uint8_t leftPad, uint8_t rightPad, uint8_t topPad, uint8_t bottomPad); + + private: + void initDisplay(); + void reset(); + + private: + int _width; + int _height; + Orientation _orientation; + PanelColorFilter _colorFilter; + bool _flip; + uint8_t _foregroundColorHigh; + uint8_t _foregroundColorLow; + uint8_t _backgroundColorHigh; + uint8_t _backgroundColorLow; + + private: + class LCDSPI : public SPI + { + public: + LCDSPI(PinName mosi, PinName miso, PinName sclk) : + SPI(mosi, miso, sclk) + { + } + + void prepareFastSPI() + { + #ifdef TARGET_LPC11U24 + aquire(); + #endif + } + + void waitWhileBusy() + { + #ifdef TARGET_LPC11U24 + while (((_spi.spi->SR) & 0x10) != 0); + #endif + } + + void fastWrite(uint8_t data) + { + #ifdef TARGET_LPC11U24 + while (((_spi.spi->SR) & 0x01) == 0); + _spi.spi->DR = data; + #else + SPI::write(data); + #endif + } + + void clearRx() + { + #ifdef TARGET_LPC11U24 + while (((_spi.spi->SR) & 0x14) != 0) + { + while (((_spi.spi->SR) & 0x04) == 0); + int data = _spi.spi->DR; + } + #endif + } + }; + + private: + DigitalOut _backlight; + DigitalOut _reset; + DigitalOut _ds; + DigitalOut _cs; + LCDSPI _spi; + + uint16_t *_palette; + + static const uint16_t DefaultPalette[]; + + protected: + static const uint8_t CMD_SLPOUT = 0x11; + static const uint8_t CMD_DISPON = 0x29; + static const uint8_t CMD_CASET = 0x2a; + static const uint8_t CMD_RASET = 0x2b; + static const uint8_t CMD_RAMWR = 0x2c; + + static const uint8_t CMD_MADCTL = 0x36; + static const uint8_t CMD_COLMOD = 0x3a; + + static const uint8_t CMD_FRMCTR1 = 0xb1; + static const uint8_t CMD_FRMCTR2 = 0xb2; + static const uint8_t CMD_FRMCTR3 = 0xb3; + static const uint8_t CMD_INVCTR = 0xb4; + + static const uint8_t CMD_PWCTR1 = 0xc0; + static const uint8_t CMD_PWCTR2 = 0xc1; + static const uint8_t CMD_PWCTR3 = 0xc2; + static const uint8_t CMD_PWCTR4 = 0xc3; + static const uint8_t CMD_PWCTR5 = 0xc4; + static const uint8_t CMD_VMCTR1 = 0xc5; + + static const uint8_t CMD_GAMCTRP1 = 0xe0; + static const uint8_t CMD_GAMCTRN1 = 0xe1; + + static const uint8_t CMD_EXTCTRL = 0xf0; +}; + +#endif // __LCD_ST7735__