PCD8544 multiscreen
PCD8544MS.h
- Committer:
- Wimpie
- Date:
- 2012-06-15
- Revision:
- 0:61dcd2c0299a
File content as of revision 0:61dcd2c0299a:
/* mbed PCD8544MS - Graphic Library for driving multi monochrome displays based on PCD8544 * used in Nokia 3310, 3315, 3330, 3350, 3410, 3210, 5110, 5120, 5130, 5160, 6110, 6150 * * Copyright (c) 2011, Wim De Roeve * partial port of the code found on http://serdisplib.sourceforge.net/ser/pcd8544.html#links * and by Petras Saduikis <petras@petras.co.uk> * * it uses a PCF8574 / PCF8575 for control line handling (/CS RESET and DC) * and SPI for data handling * up to 6 screens * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ #ifndef PCD8544MS_H #define PCD8544MS_H // the Nokia 3310 has a resolution of 84 x 48 // the Nokia 3410 has a resolution of 102 x 72 officialy 84x64 #include "mbed.h" #define LCD_X_RES 102 //84 #define LCD_Y_RES 72 //48 #define LCD_BANKS (LCD_Y_RES / 8) #define LCD_CACHE_SIZE ((LCD_X_RES * LCD_Y_RES) / 8) #define MAX_ADR_X (LCD_X_RES)-1 #define MAX_ADR_Y LCD_BANKS-1 //#define MAXSCREENS 1 typedef uint8_t BYTE; class PCD8544MS { /* PCD8544 from Philips Semiconductors is 48 x 84 pixels monochrome matrix LCD controller/driver The PCD8544 has a 504 byte memory with NO read function. Each bit is a pixel You can only write 1 byte at a time in vertical or horizontal mode. There is no read functionality with the controller. Caching a copy of the LCD-memory is the only solution to set one pixel at a time. * wiring SPI * mosi // yellow * miso NC * sclk //green * PCF8575/PCF8574 to PCD8544 LCD * ---------------------- * P0 - CS1 //gray * P1 - DC //blue * P2 - RESET //white * P3 - CS2 * P4 - CS3 * P5 - CS4 * P6 - CS5 * P7 - CS6 * */ // yellow green //gray //blue //white // PCD8544MS lcd(p11,NC,p13,p15,p16,p17); //mosi miso sclk cs dc reset public: /** LCD panel format */ typedef enum { PIXEL_OFF = 0, PIXEL_ON = 1, PIXEL_XOR = 2 }ePixelMode; typedef enum { FILL_OFF = 0, FILL_ON = 1 }eFillMode; typedef enum { RASTER_OFF = 0, RASTER_ON = 1 }eRasterMode; typedef enum { DRAW_OVERWRITE = 0, DRAW_MERGE = 1 }eDrawMode; typedef enum { VERYSMALLFONT = 0, //3x5 TINYFONT = 1, //5x7 SMALLFONT = 2, //6x8 NORMALFONT = 3, //8x8 BIGFONT = 4, //8x12� TIMENUMBERFONT= 5, //16x20 BIGNUMBERFONT= 6 }eFonts; typedef enum { C_POINT = 0, //point C_LINE = 1, //line C_VLINE = 2, //Vertical Line C_HLINE = 3, //Horizontal Line }eChartMode; typedef enum { SPACE_NONE = 0, SPACE_NORMAL = 1 }eSpaceMode; enum eDisplayMode {DISPLAY_NORMAL, DISPLAY_HIGHLIGHT}; enum LCDType { LCD3310, LCD3410, LCD6100, /**< Nokia 6100, as found on sparkfun board (default) */ LCD6610, /**< Nokia 6610, as found on olimex board */ PCF8833 }; PCD8544MS(PinName mosi, PinName miso, PinName sclk, PinName sda, PinName scl,int i2cAddress,bool TextLCD, bool backlight); /** init() * * Initialise the device. * @param PinName SPI mosi * @param PinName SPI miso * @param PinName SPI sclk * @param PinName sda * @param PinName sck * @param PinName i2cAddress * @param int maxscreens // number of screens used */ #if 0 // Inhereted from Stream, for documentation only /* Function: putc * Write a character * * Variables: * c - The character to write to the serial port */ int putc(int c); /* Function: printf * Write a formated string * * Variables: * format - A printf-style format string, followed by the * variables to use in formating the string. */ int printf(const char* format, ...); #endif virtual void TLCD_locate(int column, int row); /* Function: cls * Clear the screen, and locate to 0,0 */ virtual void TLCD_cls(); /* Function: backlight * Sets the backlight on or off * * Variables: * on (true or false) */ virtual void TLCD_backlight(bool on); /** cls() * clears the cached copy of the screen * and the screen itself */ void GLCD_cls(int screen,bool fupdate=true); /** update() * copies the cached memory to the screen * use this to update the screen after * - drawBitmap */ void GLCD_update(int screen); /** close() * screen display OFF */ void GLCD_close(); /** locate(x,y) * sets the cursor on position x,y */ void GLCD_locate (BYTE x0, BYTE y0); void chooseFont(eFonts font); void GLCD_writeString (BYTE x0, BYTE y0, char* string, eFonts font,ePixelMode pmode,eDisplayMode dmode,eSpaceMode smode, BYTE fupdate,int screen ); void GLCD_writeChar (BYTE x0, BYTE y0, BYTE ch, eFonts font,ePixelMode pmode,eDisplayMode mode, BYTE fupdate,int screen); /** drawBitmap(x,y,bitmap,xsize,ysize) * draw a monochrome bitmap on position x,y * with size xsize,ysize */ void GLCD_drawBitmap (BYTE x0, BYTE y0, const unsigned char* bitmap, BYTE bmpXSize, BYTE bmpYSize, BYTE fupdate,int screen ); void GLCD_drawpixel (BYTE x0, BYTE y0, ePixelMode pmode, BYTE fupdate,int screen ); void GLCD_drawline (BYTE x0, BYTE y0, BYTE x1,BYTE y1, ePixelMode pmode, BYTE fupdate,int screen ); void GLCD_drawcircle (BYTE x0, BYTE y0, BYTE radius, eFillMode fill,ePixelMode pmode, BYTE fupdate,int screen ); void GLCD_drawrectangle (BYTE x0, BYTE y0, BYTE x1,BYTE y1, eFillMode fill, ePixelMode pmode, BYTE fupdate,int screen ); void GLCD_drawprogressbar(BYTE x0, BYTE y0, BYTE w, BYTE h, BYTE percentage, BYTE fupdate,int screen ); void GLCD_drawchart (BYTE x0, BYTE y0, BYTE w, BYTE h, BYTE unitx, BYTE unity, eRasterMode rMode, eChartMode cMode, eDrawMode dMode,int16_t * val, int size, int t,int screen ); private: SPI _spi; I2C _i2c; int _i2cAddress; // LCDType _type; // int _lcd_x_res,_lcd_y_res,_lcd_cache_size; void TLCD_reset(); void TLCD_writeData(int data); void TLCD_writeCommand(int command); void TLCD_writeByte(int value, bool rs); void TLCD_writeNibble(int value, bool rs); void GLCD_reset(); void GLCD_writeCmd(BYTE data, BYTE CF,int screen); void GLCD_writeData(BYTE data, BYTE CF,int screen); void GLCD_writeI2C(bool reset, bool dc, bool cs,int screen ); void writeI2CByte(int data); int readI2C(); virtual int _putc(int c); virtual int _getc(); virtual void TLCD_newline(); int _row; int _column; int _columns; int _rows; bool _backlight; //BYTE LcdCache[][_lcd_cache_size]; // __attribute__((section("AHBSRAM0"))); BYTE LcdCache[LCD_CACHE_SIZE]; // __attribute__((section("AHBSRAM0"))); int LcdCacheIdx; int _LoMark; int _HiMark; int Scale; BYTE _font_width; BYTE _font_height; BYTE _font_start; BYTE _font_end; BYTE _font_bytes; unsigned char* _pFont; }; #endif